teuton-get 0.2.7 → 0.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 +4 -4
- data/README.md +55 -28
- data/docs/commands.md +10 -9
- data/docs/get.md +7 -6
- data/lib/teuton-get/cli.rb +51 -25
- data/lib/teuton-get/downloader.rb +22 -13
- data/lib/teuton-get/files/repos.ini +4 -4
- data/lib/teuton-get/repo/local_info.rb +5 -5
- data/lib/teuton-get/repo/local_repo.rb +5 -5
- data/lib/teuton-get/repo/repo_config.rb +30 -9
- data/lib/teuton-get/repo/repo_data.rb +11 -9
- data/lib/teuton-get/searcher/result.rb +4 -3
- data/lib/teuton-get/searcher/search.rb +110 -0
- data/lib/teuton-get/searcher.rb +17 -101
- data/lib/teuton-get/{application.rb → settings.rb} +16 -15
- data/lib/teuton-get/show_info.rb +44 -0
- data/lib/teuton-get/version.rb +2 -2
- data/lib/teuton-get/writer/format.rb +48 -0
- data/lib/teuton-get/writer/terminal_writer.rb +7 -2
- data/lib/teuton-get.rb +29 -22
- metadata +20 -5
- data/lib/teuton-get/application/environment.rb +0 -9
- data/lib/teuton-get/utils/format.rb +0 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 562a19d3826cb7c518ab1233512970a4891cc6c27c187ed8950b9719efb626f1
|
4
|
+
data.tar.gz: 7ecf0a49739e45e824bd5d6ab95f0f0e7372a1ef6712f6262549e72f4df2ac00
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0bf1ab586485046eaac4198bfccd93fd96c4571fcf377f3de1a5a13090c5f5994d3f9e51ade60b11e9ce4474f4d404cd927cc6c9ca646f02b4203453634913e6
|
7
|
+
data.tar.gz: d8a419372d1559f5ac44f8279d3699120fa5c16c8192fe6aae6301256c96d26d607e8fc81be5d423ba53d2e3da00f8fe06249e2b210f6bb25a3620ed5ecbe2cc
|
data/README.md
CHANGED
@@ -7,9 +7,7 @@
|
|
7
7
|
* Find and download _Teuton Tests_ from remote or local repositories.
|
8
8
|
* Create _Teuton Test_ repository.
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
# Installation
|
10
|
+
## Installation
|
13
11
|
|
14
12
|
First install Ruby, then:
|
15
13
|
|
@@ -17,13 +15,12 @@ First install Ruby, then:
|
|
17
15
|
gem install teuton-get
|
18
16
|
```
|
19
17
|
|
20
|
-
|
18
|
+
## Usage
|
21
19
|
|
22
20
|
* At first, **create config file**.
|
23
21
|
|
24
|
-
```
|
25
|
-
|
26
|
-
|
22
|
+
```bash
|
23
|
+
$ teutonget init
|
27
24
|
==> Creating configuration files
|
28
25
|
✔ Create dir : /home/quigon/.config/teuton
|
29
26
|
✔ Create file : /home/quigon/.config/teuton/repos.ini
|
@@ -31,26 +28,24 @@ gem install teuton-get
|
|
31
28
|
|
32
29
|
* **Refresh** repo catalog, from time to time:
|
33
30
|
|
34
|
-
```
|
35
|
-
|
36
|
-
|
31
|
+
```bash
|
32
|
+
$ teutonget refresh
|
37
33
|
==> Refreshing active repos
|
38
34
|
✔ Repo teuton.en (10 tests)
|
39
35
|
✔ Repo teuton.es (4 tests)
|
40
36
|
```
|
41
37
|
|
42
|
-
* **Search** test related with
|
38
|
+
* **Search** test related with *usermin*:
|
43
39
|
|
44
|
-
```
|
45
|
-
|
40
|
+
```bash
|
41
|
+
$ teutonget search usermin
|
46
42
|
(x3) teuton.es:sistemas.3/scripting/usermin
|
47
43
|
```
|
48
44
|
|
49
|
-
*
|
50
|
-
|
51
|
-
```
|
52
|
-
> teutonget info teuton.es:sistemas.3/scripting/usermin
|
45
|
+
* **Show** test info:
|
53
46
|
|
47
|
+
```bash
|
48
|
+
$ teutonget show teuton.es:sistemas.3/scripting/usermin
|
54
49
|
name : usermin
|
55
50
|
author : fvarrui, dvarrui
|
56
51
|
date : 2022-11-05
|
@@ -59,26 +54,58 @@ tags : script, usuario, crear, consultar, listar, eliminar
|
|
59
54
|
files : INSTALL.md, README.md, bin/docker.run, bin/up_environ.sh, config.yaml, lib/docker/consultar.rb, lib/docker/eliminar.rb, lib/docker/help.rb, lib/docker/listar.rb, lib/docker/nuevo.rb, lib/vm/consultar.rb, lib/vm/eliminar.rb, lib/vm/help.rb, lib/vm/listar.rb, lib/vm/nuevo.rb, start.rb, tt-info.yaml, vagrant/install-software.sh, vagrant/profesor.rb, vm.rb, vm.yaml
|
60
55
|
```
|
61
56
|
|
62
|
-
* **Download test**
|
57
|
+
* **Download test** `teuton.es:sistemas.3/scripting/usermin`:
|
63
58
|
|
59
|
+
```bash
|
60
|
+
$ teutonget pull teuton.es:sistemas.3/scripting/usermin
|
61
|
+
==> Progress [██████████████] 100%
|
62
|
+
==> Download finished
|
64
63
|
```
|
65
|
-
> teutonget download teuton.es:sistemas.3/scripting/usermin
|
66
64
|
|
67
|
-
|
68
|
-
|
65
|
+
**Example:** Locate *TEST_ID* for `debian` related tests.
|
66
|
+
|
67
|
+
```bash
|
68
|
+
$ teutonget se debian
|
69
|
+
(x04) teuton.en:systems.1/03-debian-conf
|
70
|
+
(x04) teuton.en:systems.2/02-debian-basic-configuration
|
71
|
+
(x04) teuton.en:systems.2/03-debian-mkdir-command
|
72
|
+
(x04) teuton.en:systems.2/04-debian-users-grants
|
73
|
+
(x04) teuton.en:systems.2/11-debian-custom-installation
|
69
74
|
```
|
70
75
|
|
71
|
-
|
76
|
+
## Build and install the gem from sources
|
77
|
+
|
78
|
+
You can build `teuton-get` Ruby gem from sources following the next steps:
|
72
79
|
|
73
|
-
|
80
|
+
1. Clone the repo and change to its directory:
|
74
81
|
|
75
|
-
|
82
|
+
```bash
|
83
|
+
git clone https://github.com/teuton-software/teuton-get
|
84
|
+
cd teuton-get
|
85
|
+
```
|
86
|
+
|
87
|
+
2. Build the gem:
|
88
|
+
|
89
|
+
```bash
|
90
|
+
rake build
|
91
|
+
```
|
92
|
+
|
93
|
+
3. Install newly built gem:
|
94
|
+
- On GNU/Linux or Mac OS:
|
95
|
+
|
96
|
+
```bash
|
97
|
+
sudo gem install pkg/teuton-get-*.gem
|
98
|
+
```
|
99
|
+
|
100
|
+
- On Windows as `Administrator`:
|
101
|
+
|
102
|
+
```bash
|
103
|
+
gem install pkg\teuton-get-*.gem
|
104
|
+
```
|
105
|
+
|
106
|
+
## Documentation
|
76
107
|
|
77
108
|
* [Settings](docs/settings.md)
|
78
109
|
* [Get](docs/get.md)
|
79
110
|
* [Repository](docs/repo.md)
|
80
111
|
* [Commands](docs/commands.md)
|
81
|
-
|
82
|
-
# Contact
|
83
|
-
|
84
|
-
* **Email**: `teuton.software@protonmail.com`
|
data/docs/commands.md
CHANGED
@@ -4,13 +4,14 @@
|
|
4
4
|
Run `teutonget` to show available commands:
|
5
5
|
```
|
6
6
|
Commands:
|
7
|
-
teutonget create-info
|
8
|
-
teutonget create-repo
|
9
|
-
teutonget
|
10
|
-
teutonget
|
11
|
-
teutonget
|
12
|
-
teutonget refresh
|
13
|
-
teutonget repos
|
14
|
-
teutonget search [REPONAME
|
15
|
-
teutonget
|
7
|
+
teutonget create-info DIRPATH # Create info data for Teuton test
|
8
|
+
teutonget create-repo # Create repo into current directory
|
9
|
+
teutonget help [COMMAND] # Describe available commands or one specific command
|
10
|
+
teutonget init # Create ini config file
|
11
|
+
teutonget pull TESTID # Download Teuton test
|
12
|
+
teutonget refresh # Synchronize list of available tests.
|
13
|
+
teutonget repos # Show repo list
|
14
|
+
teutonget search [REPONAME:]FILTER # Search Teuton test with FILTER
|
15
|
+
teutonget show TESTID|FILTER # Show info data for Teuton test
|
16
|
+
teutonget version # Show the program version
|
16
17
|
```
|
data/docs/get.md
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
Find and download local or remote test files.
|
6
6
|
|
7
7
|
1. [Search](#1-search)
|
8
|
-
2. [
|
8
|
+
2. [Show](#2-show)
|
9
9
|
3. [Download](#3-download)
|
10
10
|
|
11
11
|
## 1. Search
|
@@ -28,7 +28,7 @@ teutonget search FILTER
|
|
28
28
|
Example:
|
29
29
|
|
30
30
|
```
|
31
|
-
❯ teutonget
|
31
|
+
❯ teutonget search window
|
32
32
|
(x3) teuton.en:systems.1/01-windows-conf
|
33
33
|
(x1) teuton.en:systems.1/04-winserver-conf
|
34
34
|
(x1) teuton.en:systems.2/01-install-w10-vbox
|
@@ -39,18 +39,19 @@ As a result we have a list of tests ordered from highest to lowest value accordi
|
|
39
39
|
|
40
40
|
Ejample:
|
41
41
|
```
|
42
|
-
❯ teutonget
|
42
|
+
❯ teutonget search script,fvarrui
|
43
43
|
(x6) teuton.es:sistemas.3/scripting/usermin
|
44
44
|
(x1) teuton.en:systems.2/01-install-w10-vbox
|
45
45
|
```
|
46
46
|
|
47
47
|
In this example, the filter is form by multiple words separated by commas. As result, will be shown tests that contain word 1 or word 2, or both. And appear in order from highest to lowest according to the number of times these words appear in the test metadata.
|
48
48
|
|
49
|
-
## 2.
|
49
|
+
## 2. Show
|
50
50
|
|
51
51
|
Show info about test. Example:
|
52
|
+
|
52
53
|
```
|
53
|
-
❯ teutonget
|
54
|
+
❯ teutonget show teuton.en:systems.1/03-debian-conf
|
54
55
|
|
55
56
|
name : Debian configuration
|
56
57
|
author : dvarrui
|
@@ -65,7 +66,7 @@ files : README.md, config.yaml, debian.rb, network.rb, start.rb
|
|
65
66
|
Download teuton test files identified by TESTID. Example:
|
66
67
|
|
67
68
|
```
|
68
|
-
❯ teutonget
|
69
|
+
❯ teutonget pull teuton.en:systems.1/03-debian-conf
|
69
70
|
|
70
71
|
==> Downloading...
|
71
72
|
==> File: README.md
|
data/lib/teuton-get/cli.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "thor"
|
4
|
-
require_relative "application"
|
5
4
|
require_relative "version"
|
6
5
|
require_relative "../teuton-get"
|
7
6
|
|
@@ -12,83 +11,110 @@ class CLI < Thor
|
|
12
11
|
desc "version", "Show the program version"
|
13
12
|
|
14
13
|
def version
|
15
|
-
puts "#{
|
14
|
+
puts "#{TeutonGet::EXECUTABLE} version #{TeutonGet::VERSION}"
|
16
15
|
end
|
17
16
|
|
18
17
|
map ["ci", "-ci", "--create-info", "create-info"] => "create_info"
|
19
|
-
|
18
|
+
option :color, type: :boolean
|
19
|
+
desc "create-info DIRPATH", "Create info data for Teuton test"
|
20
20
|
long_desc <<-LONGDESC
|
21
21
|
Create info data for Teuton test. Example: "teutonget create-info systems.1/02-opensuse-conf"
|
22
22
|
LONGDESC
|
23
23
|
|
24
|
-
def create_info(testpath)
|
24
|
+
def create_info(testpath = ".")
|
25
|
+
TeutonGet::Format.disable if options["color"] == false
|
25
26
|
TeutonGet.create_info(testpath)
|
26
27
|
end
|
27
28
|
|
28
29
|
map ["cr", "-cr", "--create-repo", "create-repo"] => "create_repo"
|
30
|
+
option :color, type: :boolean
|
29
31
|
desc "create-repo", "Create repo into current directory"
|
30
32
|
long_desc <<-LONGDESC
|
31
33
|
Create index from SOURCE directory. Example: "teutonget create-repo"
|
32
34
|
LONGDESC
|
33
35
|
def create_repo
|
36
|
+
TeutonGet::Format.disable if options["color"] == false
|
34
37
|
TeutonGet.create_repo(".")
|
35
38
|
end
|
36
39
|
|
40
|
+
map ["d", "-d", "--download", "download", "--pull"] => "pull"
|
41
|
+
option :color, type: :boolean
|
42
|
+
desc "pull TESTID [DIRECTORY]", "Download Teuton test"
|
43
|
+
long_desc <<-LONGDESC
|
44
|
+
Example: "teutonget pull teuton.en:systems.1/02-opensuse-conf". Download test.
|
45
|
+
LONGDESC
|
46
|
+
def pull(testid, dirpath = ".")
|
47
|
+
TeutonGet::Format.disable if options["color"] == false
|
48
|
+
TeutonGet.download(testid, dirpath)
|
49
|
+
end
|
50
|
+
|
37
51
|
map ["--init"] => "init"
|
52
|
+
option :color, type: :boolean
|
38
53
|
desc "init", "Create ini config file"
|
39
54
|
long_desc <<-LONGDESC
|
40
|
-
Create
|
55
|
+
Create inital configuration files. Example: "teutonget init"
|
41
56
|
LONGDESC
|
42
57
|
def init
|
58
|
+
TeutonGet::Format.disable if options["color"] == false
|
43
59
|
TeutonGet.init
|
44
60
|
end
|
45
61
|
|
46
|
-
map ["i", "-i", "--info"] => "
|
47
|
-
|
62
|
+
map ["i", "-i", "--info", "info", "--show"] => "show"
|
63
|
+
option :color, type: :boolean
|
64
|
+
option :format, type: :string
|
65
|
+
desc "show TESTID|FILTER", "Show info data for Teuton test"
|
48
66
|
long_desc <<-LONGDESC
|
49
|
-
|
50
|
-
LONGDESC
|
67
|
+
Example: "teutonget show teuton.en:systems.1/02-opensuse-conf". Show test info.
|
51
68
|
|
52
|
-
|
53
|
-
|
69
|
+
Example: "teutonget show foo --format=json". Show test info using JSON format.
|
70
|
+
LONGDESC
|
71
|
+
def show(test_id)
|
72
|
+
TeutonGet::Format.disable if options["color"] == false
|
73
|
+
TeutonGet.show_info(test_id, options)
|
54
74
|
end
|
55
75
|
|
56
76
|
map ["--repos"] => "repos"
|
77
|
+
option :color, type: :boolean
|
78
|
+
option :format, type: :string
|
57
79
|
desc "repos", "Show repo list"
|
58
80
|
long_desc <<-LONGDESC
|
59
|
-
|
81
|
+
Example: "teutonget repos". Show repo list.
|
82
|
+
|
83
|
+
Example: "teutonget repos --format=json". Show JSON repos list.
|
60
84
|
LONGDESC
|
61
85
|
|
62
86
|
def repos
|
63
|
-
TeutonGet.
|
87
|
+
TeutonGet::Format.disable if options["color"] == false
|
88
|
+
TeutonGet.show_repo_list(options)
|
64
89
|
end
|
65
90
|
|
66
|
-
map ["r", "-r", "--refresh"] => "refresh"
|
91
|
+
map ["r", "-r", "--refresh", "--update", "update"] => "refresh"
|
92
|
+
option :color, type: :boolean
|
67
93
|
desc "refresh", "Synchronize list of available tests."
|
68
94
|
long_desc <<-LONGDESC
|
69
95
|
Synchronize list of tests available. Example: "teutonget refresh"
|
70
96
|
LONGDESC
|
71
97
|
def refresh
|
98
|
+
TeutonGet::Format.disable if options["color"] == false
|
72
99
|
TeutonGet.refresh
|
73
100
|
end
|
74
101
|
|
75
102
|
map ["s", "-s", "--search"] => "search"
|
103
|
+
option :color, type: :boolean
|
104
|
+
option :format, type: :string
|
76
105
|
desc "search [REPONAME:]FILTER", "Search Teuton test with FILTER"
|
77
106
|
long_desc <<-LONGDESC
|
78
|
-
|
107
|
+
Example: "teutonget search opensuse". Search tests filtering by 'opensuse'.
|
108
|
+
|
109
|
+
Example: "teutonget search debian --format=json". Search tests filtering by 'debian' and show JSON format output.
|
79
110
|
LONGDESC
|
80
111
|
def search(filter)
|
81
|
-
TeutonGet.
|
112
|
+
TeutonGet::Format.disable if options["color"] == false
|
113
|
+
TeutonGet.search(filter, options)
|
82
114
|
end
|
83
115
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
long_desc <<-LONGDESC
|
88
|
-
Download Teuton test. Example: "teutonget download teuton.en:systems.1/02-opensuse-conf"
|
89
|
-
LONGDESC
|
90
|
-
def download(testname)
|
91
|
-
puts options unless options.empty?
|
92
|
-
TeutonGet.download(testname, options)
|
116
|
+
def respond_to_missing?(method_name, include_private = false)
|
117
|
+
# Respond to missing methods name
|
118
|
+
super
|
93
119
|
end
|
94
120
|
end
|
@@ -6,12 +6,13 @@ require_relative "reader/inifile_reader"
|
|
6
6
|
require_relative "reader/url_reader"
|
7
7
|
require_relative "repo/repo_config"
|
8
8
|
require_relative "repo/repo_data"
|
9
|
+
require_relative "settings"
|
9
10
|
|
10
11
|
class Downloader
|
11
12
|
def initialize
|
12
13
|
@dev = TerminalWriter.new
|
13
|
-
@repo_config = RepoConfig.
|
14
|
-
cache_dirpath =
|
14
|
+
@repo_config = RepoConfig.default.data
|
15
|
+
cache_dirpath = Settings.get(:cache_dirpath)
|
15
16
|
@repo_data = RepoData.new(
|
16
17
|
config_reader: IniFileReader.new,
|
17
18
|
progress_writer: TerminalWriter.new,
|
@@ -19,10 +20,10 @@ class Downloader
|
|
19
20
|
)
|
20
21
|
end
|
21
22
|
|
22
|
-
def run(id)
|
23
|
-
reponame, testpath = id.split(
|
23
|
+
def run(id, dirpath = ".")
|
24
|
+
reponame, testpath = id.split(Settings::SEPARATOR)
|
24
25
|
|
25
|
-
|
26
|
+
repourl, status = get_url_for reponame
|
26
27
|
unless status == :ok
|
27
28
|
@dev.writeln " #{status}"
|
28
29
|
return false
|
@@ -34,7 +35,7 @@ class Downloader
|
|
34
35
|
return false
|
35
36
|
end
|
36
37
|
|
37
|
-
download(reponame,
|
38
|
+
download(reponame, repourl, dirpath, testpath, files)
|
38
39
|
end
|
39
40
|
|
40
41
|
private
|
@@ -48,19 +49,27 @@ class Downloader
|
|
48
49
|
end
|
49
50
|
|
50
51
|
def get_files_for_test(id)
|
51
|
-
|
52
|
-
return [], "ERROR: not found!" if
|
53
|
-
files =
|
52
|
+
testinfo = @repo_data.get_info(id)
|
53
|
+
return [], "ERROR: not found!" if testinfo.nil?
|
54
|
+
files = testinfo["files"]
|
54
55
|
return [], "WARN: files no defined!" if files.nil?
|
55
56
|
return [], "WARN: 0 files defined!" if files.size.zero?
|
56
57
|
[files, :ok]
|
57
58
|
end
|
58
59
|
|
59
|
-
def download(reponame, url, path, files)
|
60
|
-
bar = TTY::ProgressBar.new(
|
60
|
+
def download(reponame, url, dirpath, path, files)
|
61
|
+
bar = TTY::ProgressBar.new(
|
62
|
+
"==> Progress [:bar] :percent",
|
63
|
+
total: files.size,
|
64
|
+
bar_format: :block
|
65
|
+
)
|
66
|
+
localpath = if dirpath == "."
|
67
|
+
File.join(path.tr("/", "_"))
|
68
|
+
else
|
69
|
+
dirpath
|
70
|
+
end
|
71
|
+
FileUtils.mkdir_p(localpath) unless File.exist? localpath
|
61
72
|
|
62
|
-
localpath = path.tr("/", "_")
|
63
|
-
FileUtils.mkdir(localpath) unless File.exist? localpath
|
64
73
|
files.each do |filename|
|
65
74
|
bar.advance
|
66
75
|
|
@@ -1,13 +1,13 @@
|
|
1
1
|
# version 1
|
2
2
|
|
3
|
-
[
|
3
|
+
[dvarrui.en]
|
4
4
|
type = teutontest
|
5
|
-
description =
|
5
|
+
description = Tests repository (dvarrui)
|
6
6
|
URL = https://raw.githubusercontent.com/teuton-software/teuton-tests/master/en
|
7
7
|
enable = true
|
8
8
|
|
9
|
-
[
|
9
|
+
[dvarrui.es]
|
10
10
|
type = teutontest
|
11
|
-
description = Repositorio
|
11
|
+
description = Repositorio de Tests (dvarrui)
|
12
12
|
URL = https://raw.githubusercontent.com/teuton-software/teuton-tests/master/es
|
13
13
|
enable = true
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require_relative "../
|
1
|
+
require_relative "../settings"
|
2
2
|
require_relative "../writer/terminal_writer"
|
3
3
|
require_relative "../reader/yaml_reader"
|
4
4
|
require "erb"
|
@@ -11,12 +11,12 @@ class LocalInfo
|
|
11
11
|
@data = {}
|
12
12
|
end
|
13
13
|
|
14
|
-
def
|
14
|
+
def default_created(testpath)
|
15
15
|
set_default_data(testpath)
|
16
16
|
create(testpath)
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
19
|
+
def user_created(testpath)
|
20
20
|
ask_data(testpath)
|
21
21
|
create(testpath)
|
22
22
|
end
|
@@ -36,7 +36,7 @@ class LocalInfo
|
|
36
36
|
|
37
37
|
def set_default_data(testpath)
|
38
38
|
@data[:name] = File.basename(testpath)
|
39
|
-
@data[:author] =
|
39
|
+
@data[:author] = Settings.get("USER")
|
40
40
|
@data[:date] = Time.now.strftime("%Y-%m-%d")
|
41
41
|
@data[:desc] = "Write your description"
|
42
42
|
@data[:tags] = ["Write your", "comma separated", "tags"]
|
@@ -60,7 +60,7 @@ class LocalInfo
|
|
60
60
|
return false
|
61
61
|
end
|
62
62
|
|
63
|
-
infofilename =
|
63
|
+
infofilename = Settings::INFOFILENAME
|
64
64
|
sourcepath = File.join(File.dirname(__FILE__), "..", "files", infofilename)
|
65
65
|
template = File.read(sourcepath)
|
66
66
|
content = ERB.new(template, trim_mode: "%>")
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require_relative "../
|
1
|
+
require_relative "../settings"
|
2
2
|
require_relative "../writer/file_writer"
|
3
3
|
require_relative "../writer/terminal_writer"
|
4
4
|
|
@@ -9,7 +9,7 @@ class LocalRepo
|
|
9
9
|
@dev = args[:progress_writer]
|
10
10
|
end
|
11
11
|
|
12
|
-
def self.
|
12
|
+
def self.default
|
13
13
|
LocalRepo.new(
|
14
14
|
repoindex_writer: FileWriter.new,
|
15
15
|
progress_writer: TerminalWriter.new
|
@@ -17,19 +17,19 @@ class LocalRepo
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def create(dirpath)
|
20
|
-
infofilename =
|
20
|
+
infofilename = Settings::INFOFILENAME
|
21
21
|
infofiles = Dir.glob(File.join(dirpath, "**", infofilename))
|
22
22
|
return if infofiles.size.zero?
|
23
23
|
|
24
24
|
@dev.writeln "\n==> Creating repository", color: :light_yellow
|
25
25
|
data = read_files(infofiles)
|
26
26
|
|
27
|
-
filepath = File.join(dirpath,
|
27
|
+
filepath = File.join(dirpath, Settings::INDEXFILENAME)
|
28
28
|
@repoindex_writer.open(filepath)
|
29
29
|
@repoindex_writer.write data.to_yaml
|
30
30
|
@repoindex_writer.close
|
31
31
|
|
32
|
-
@dev.writeln " Created
|
32
|
+
@dev.writeln " Created #{filepath} (#{data.keys.size} tests)", color: :white
|
33
33
|
true
|
34
34
|
end
|
35
35
|
|
@@ -1,7 +1,8 @@
|
|
1
1
|
require "fileutils"
|
2
|
-
|
2
|
+
require "json/pure"
|
3
|
+
require_relative "../settings"
|
3
4
|
require_relative "../reader/inifile_reader"
|
4
|
-
require_relative "../
|
5
|
+
require_relative "../writer/format"
|
5
6
|
require_relative "../writer/terminal_writer"
|
6
7
|
|
7
8
|
# Create Teuton Repo config file
|
@@ -14,16 +15,16 @@ class RepoConfig
|
|
14
15
|
@dev = args[:progress_writer]
|
15
16
|
|
16
17
|
@config_dirpath = args[:config_dirpath] || ""
|
17
|
-
@config_filepath = File.join(@config_dirpath,
|
18
|
+
@config_filepath = File.join(@config_dirpath, Settings::CONFIGFILE)
|
18
19
|
end
|
19
20
|
|
20
|
-
def self.
|
21
|
-
config_filepath =
|
21
|
+
def self.default
|
22
|
+
config_filepath = Settings.get(:config_filepath)
|
22
23
|
|
23
24
|
RepoConfig.new(
|
24
25
|
config_reader: IniFileReader.new(config_filepath),
|
25
26
|
progress_writer: TerminalWriter.new,
|
26
|
-
config_dirpath:
|
27
|
+
config_dirpath: Settings.get(:config_dirpath)
|
27
28
|
)
|
28
29
|
end
|
29
30
|
|
@@ -33,13 +34,24 @@ class RepoConfig
|
|
33
34
|
create_ini_file
|
34
35
|
end
|
35
36
|
|
36
|
-
def show_list
|
37
|
+
def show_list(options)
|
38
|
+
if options["format"] == "json"
|
39
|
+
show_json_list
|
40
|
+
else
|
41
|
+
show_default_list
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def show_default_list
|
37
48
|
rows = []
|
38
49
|
rows << ["E", "NAME", "DESCRIPTION"]
|
39
50
|
rows << :separator
|
40
51
|
|
41
52
|
index = 0
|
42
53
|
@data.each_pair do |key, value|
|
54
|
+
next unless value["type"] == "teutontest"
|
43
55
|
enable = "\u{2714}"
|
44
56
|
enable = " " unless value["enable"]
|
45
57
|
description = value["description"] || "?"
|
@@ -52,7 +64,16 @@ class RepoConfig
|
|
52
64
|
@dev.writeln "#{@reader.source}\n", color: :white
|
53
65
|
end
|
54
66
|
|
55
|
-
|
67
|
+
def show_json_list
|
68
|
+
alist = []
|
69
|
+
@data.each_pair do |key, values|
|
70
|
+
next unless values["type"] == "teutontest"
|
71
|
+
|
72
|
+
values["reponame"] = key
|
73
|
+
alist << values
|
74
|
+
end
|
75
|
+
puts JSON.dump(alist)
|
76
|
+
end
|
56
77
|
|
57
78
|
def create_dir
|
58
79
|
dirpath = @config_dirpath
|
@@ -73,7 +94,7 @@ class RepoConfig
|
|
73
94
|
end
|
74
95
|
|
75
96
|
def create_ini_file
|
76
|
-
src = File.join(File.dirname(__FILE__), "..", "files",
|
97
|
+
src = File.join(File.dirname(__FILE__), "..", "files", Settings::CONFIGFILE)
|
77
98
|
copyfile(src, @config_filepath)
|
78
99
|
end
|
79
100
|
|
@@ -1,5 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "yaml"
|
2
|
-
require_relative "../
|
4
|
+
require_relative "../settings"
|
3
5
|
require_relative "../reader/url_reader"
|
4
6
|
require_relative "../reader/inifile_reader"
|
5
7
|
require_relative "../reader/yaml_reader"
|
@@ -14,12 +16,12 @@ class RepoData
|
|
14
16
|
@cache_dirpath = args[:cache_dirpath]
|
15
17
|
end
|
16
18
|
|
17
|
-
def self.
|
18
|
-
config_filepath =
|
19
|
+
def self.default
|
20
|
+
config_filepath = Settings.get(:config_filepath)
|
19
21
|
RepoData.new(
|
20
22
|
config_reader: IniFileReader.new(config_filepath),
|
21
23
|
progress_writer: TerminalWriter.new,
|
22
|
-
cache_dirpath:
|
24
|
+
cache_dirpath: Settings.get(:cache_dirpath)
|
23
25
|
)
|
24
26
|
end
|
25
27
|
|
@@ -35,11 +37,11 @@ class RepoData
|
|
35
37
|
save_database
|
36
38
|
end
|
37
39
|
|
38
|
-
def
|
39
|
-
reponame, id = test_id.split(
|
40
|
+
def get_info(test_id)
|
41
|
+
reponame, id = test_id.split(Settings::SEPARATOR)
|
40
42
|
database = YamlReader.new.read(database_filename)
|
41
43
|
return {} if database[reponame].nil?
|
42
|
-
database[reponame][id]
|
44
|
+
database[reponame][id] || {}
|
43
45
|
end
|
44
46
|
|
45
47
|
def show_testinfo(item)
|
@@ -113,7 +115,7 @@ class RepoData
|
|
113
115
|
end
|
114
116
|
|
115
117
|
def get_local_database(dirpath)
|
116
|
-
filepath = File.join(dirpath,
|
118
|
+
filepath = File.join(dirpath, Settings::INDEXFILENAME)
|
117
119
|
# @reader.read(filepath) # FIXME
|
118
120
|
YAML.safe_load(
|
119
121
|
File.read(filepath),
|
@@ -122,7 +124,7 @@ class RepoData
|
|
122
124
|
end
|
123
125
|
|
124
126
|
def get_remote_database(url_repo)
|
125
|
-
url_file = "#{url_repo}/#{
|
127
|
+
url_file = "#{url_repo}/#{Settings::INDEXFILENAME}"
|
126
128
|
content_page = URLReader.new(url_file).read
|
127
129
|
YAML.safe_load(
|
128
130
|
content_page,
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require_relative "../
|
1
|
+
require_relative "../settings"
|
2
2
|
|
3
3
|
class Result
|
4
4
|
@@repoindex = Set.new
|
@@ -15,13 +15,14 @@ class Result
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def id
|
18
|
-
"#{reponame}#{
|
18
|
+
"#{reponame}#{Settings::SEPARATOR}#{testname}"
|
19
19
|
end
|
20
20
|
|
21
21
|
def to_h
|
22
22
|
{
|
23
23
|
score: @score,
|
24
|
-
id: id,
|
24
|
+
id: id,
|
25
|
+
reponame: @reponame,
|
25
26
|
testname: @testname,
|
26
27
|
repoindex: repoindex
|
27
28
|
}
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require "json"
|
2
|
+
require_relative "result"
|
3
|
+
require_relative "../settings"
|
4
|
+
require_relative "../writer/format"
|
5
|
+
|
6
|
+
class Search
|
7
|
+
attr_reader :results
|
8
|
+
|
9
|
+
def initialize(database, dev)
|
10
|
+
@dev = dev
|
11
|
+
@database = database
|
12
|
+
end
|
13
|
+
|
14
|
+
def call(reponame_filter, filters)
|
15
|
+
@results = {}
|
16
|
+
@database.keys.each do |reponame|
|
17
|
+
if reponame_filter == :all || reponame.include?(reponame_filter)
|
18
|
+
search_inside_repo(reponame, filters)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
sort_results
|
22
|
+
end
|
23
|
+
|
24
|
+
def show_json
|
25
|
+
list = []
|
26
|
+
@results.each do |i|
|
27
|
+
list << {
|
28
|
+
score: i[:score],
|
29
|
+
reponame: i[:reponame],
|
30
|
+
testname: i[:testname]
|
31
|
+
}
|
32
|
+
end
|
33
|
+
puts list.to_json
|
34
|
+
end
|
35
|
+
|
36
|
+
def show_screen
|
37
|
+
@results.each do |i|
|
38
|
+
@dev.write ("(x%02d) " % i[:score]), color: :white
|
39
|
+
reponame = TeutonGet::Format.colorize(i[:reponame], i[:repoindex])
|
40
|
+
@dev.writeln "#{reponame}#{Settings::SEPARATOR}#{i[:testname]}"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def search_inside_repo(reponame, filters)
|
47
|
+
return if reponame != :all && @database[reponame].nil?
|
48
|
+
|
49
|
+
@database[reponame].each do |testname, data|
|
50
|
+
result = Result.new(
|
51
|
+
score: 0,
|
52
|
+
reponame: reponame,
|
53
|
+
testname: testname
|
54
|
+
)
|
55
|
+
if filters == :all
|
56
|
+
add_result(result)
|
57
|
+
next
|
58
|
+
end
|
59
|
+
score = 0
|
60
|
+
filters.each do |filter|
|
61
|
+
score += evaluate_test(
|
62
|
+
testname: testname,
|
63
|
+
data: data,
|
64
|
+
filter: filter
|
65
|
+
)
|
66
|
+
if score > 0
|
67
|
+
result.score = score
|
68
|
+
add_result result
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def add_result(result)
|
75
|
+
key = result.id
|
76
|
+
if @results[key].nil?
|
77
|
+
@results[key] = result
|
78
|
+
return
|
79
|
+
end
|
80
|
+
@results[key].score += result.score
|
81
|
+
end
|
82
|
+
|
83
|
+
def evaluate_test(args)
|
84
|
+
testname = args[:testname]
|
85
|
+
data = args[:data]
|
86
|
+
filter = args[:filter]
|
87
|
+
score = 0
|
88
|
+
data.each_pair do |key, value|
|
89
|
+
if value.instance_of? String
|
90
|
+
score += 1 if value.downcase.include? filter
|
91
|
+
elsif value.instance_of? Date
|
92
|
+
score += 1 if value.to_s.include? filter
|
93
|
+
elsif value.instance_of? Array
|
94
|
+
score += 1 if value.include? filter
|
95
|
+
end
|
96
|
+
end
|
97
|
+
score += 1 if testname.include? filter
|
98
|
+
score
|
99
|
+
end
|
100
|
+
|
101
|
+
def sort_results
|
102
|
+
results = []
|
103
|
+
@results.each_pair { |key, value| results += [value.to_h] }
|
104
|
+
|
105
|
+
results.sort_by! do |i|
|
106
|
+
[(Settings::MAGICNUMBER - i[:score]), i[:id]]
|
107
|
+
end
|
108
|
+
@results = results
|
109
|
+
end
|
110
|
+
end
|
data/lib/teuton-get/searcher.rb
CHANGED
@@ -1,42 +1,36 @@
|
|
1
|
-
|
1
|
+
require "json"
|
2
|
+
require_relative "settings"
|
2
3
|
require_relative "reader/yaml_reader"
|
3
4
|
require_relative "repo/repo_data"
|
4
|
-
require_relative "searcher/
|
5
|
-
require_relative "
|
5
|
+
require_relative "searcher/search"
|
6
|
+
require_relative "writer/format"
|
6
7
|
require_relative "writer/terminal_writer"
|
7
8
|
|
8
9
|
class Searcher
|
9
|
-
|
10
|
-
@dev = args[:writer]
|
11
|
-
|
12
|
-
@repodata = args[:repodata]
|
13
|
-
filename = @repodata.database_filename
|
10
|
+
attr_reader :results
|
14
11
|
|
15
|
-
|
16
|
-
|
12
|
+
def initialize(args)
|
13
|
+
repodata = args[:repodata]
|
14
|
+
filename = repodata.database_filename
|
15
|
+
reader = args[:reader]
|
16
|
+
database = reader.read(filename)
|
17
17
|
|
18
|
-
|
18
|
+
dev = args[:writer]
|
19
|
+
@search = Search.new(database, dev)
|
19
20
|
end
|
20
21
|
|
21
|
-
def self.
|
22
|
+
def self.default
|
22
23
|
Searcher.new(
|
23
24
|
writer: TerminalWriter.new,
|
24
|
-
repodata: RepoData.
|
25
|
+
repodata: RepoData.default,
|
25
26
|
reader: YamlReader.new
|
26
27
|
)
|
27
28
|
end
|
28
29
|
|
29
30
|
def get(input)
|
30
31
|
reponame_filter, filters = parse_input(input)
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
def show_result
|
35
|
-
@results.each do |i|
|
36
|
-
@dev.write ("(x%02d) " % i[:score]), color: :white
|
37
|
-
reponame = TeutonGet::Format.colorize(i[:reponame], i[:repoindex])
|
38
|
-
@dev.writeln "#{reponame}#{Application::SEPARATOR}#{i[:testname]}"
|
39
|
-
end
|
32
|
+
@search.call(reponame_filter, filters)
|
33
|
+
@search
|
40
34
|
end
|
41
35
|
|
42
36
|
private
|
@@ -44,7 +38,7 @@ class Searcher
|
|
44
38
|
def parse_input(input)
|
45
39
|
reponame_filter = :all
|
46
40
|
filter = :all
|
47
|
-
options = input.split(
|
41
|
+
options = input.split(Settings::SEPARATOR)
|
48
42
|
if options.size == 1
|
49
43
|
reponame_filter = :all
|
50
44
|
filter = options[0]
|
@@ -63,82 +57,4 @@ class Searcher
|
|
63
57
|
end
|
64
58
|
[reponame_filter, filters]
|
65
59
|
end
|
66
|
-
|
67
|
-
def search_inside(reponame_filter, filters)
|
68
|
-
@results = {}
|
69
|
-
if reponame_filter == :all
|
70
|
-
@database.keys.each { |reponame| search_inside_repo(reponame, filters) }
|
71
|
-
else
|
72
|
-
@database.keys.each do |reponame|
|
73
|
-
search_inside_repo(reponame, filters) if reponame.include? reponame_filter
|
74
|
-
end
|
75
|
-
end
|
76
|
-
sort_results
|
77
|
-
end
|
78
|
-
|
79
|
-
def search_inside_repo(reponame, filters)
|
80
|
-
return if reponame != :all && @database[reponame].nil?
|
81
|
-
|
82
|
-
@database[reponame].each do |testname, data|
|
83
|
-
result = Result.new(
|
84
|
-
score: 0,
|
85
|
-
reponame: reponame,
|
86
|
-
testname: testname
|
87
|
-
)
|
88
|
-
if filters == :all
|
89
|
-
add_result(result)
|
90
|
-
next
|
91
|
-
end
|
92
|
-
score = 0
|
93
|
-
filters.each do |filter|
|
94
|
-
score += evaluate_test(
|
95
|
-
testname: testname,
|
96
|
-
data: data,
|
97
|
-
filter: filter
|
98
|
-
)
|
99
|
-
if score > 0
|
100
|
-
result.score = score
|
101
|
-
add_result result
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
def evaluate_test(args)
|
108
|
-
testname = args[:testname]
|
109
|
-
data = args[:data]
|
110
|
-
filter = args[:filter]
|
111
|
-
|
112
|
-
score = 0
|
113
|
-
data.each_pair do |key, value|
|
114
|
-
if value.instance_of? String
|
115
|
-
score += 1 if value.downcase.include? filter
|
116
|
-
elsif value.instance_of? Date
|
117
|
-
score += 1 if value.to_s.include? filter
|
118
|
-
elsif value.instance_of? Array
|
119
|
-
score += 1 if value.include? filter
|
120
|
-
end
|
121
|
-
end
|
122
|
-
score += 1 if testname.include? filter
|
123
|
-
score
|
124
|
-
end
|
125
|
-
|
126
|
-
def add_result(result)
|
127
|
-
key = result.id
|
128
|
-
if @results[key].nil?
|
129
|
-
@results[key] = result
|
130
|
-
return
|
131
|
-
end
|
132
|
-
@results[key].score += result.score
|
133
|
-
end
|
134
|
-
|
135
|
-
def sort_results
|
136
|
-
results = []
|
137
|
-
@results.each_pair { |key, value| results += [value.to_h] }
|
138
|
-
|
139
|
-
results.sort_by! do |i|
|
140
|
-
[(Application::MAGICNUMBER - i[:score]), i[:id]]
|
141
|
-
end
|
142
|
-
@results = results
|
143
|
-
end
|
144
60
|
end
|
@@ -1,39 +1,40 @@
|
|
1
|
-
|
2
|
-
require_relative "application/environment"
|
3
|
-
|
4
|
-
class Application
|
5
|
-
include Singleton
|
6
|
-
|
1
|
+
class Settings
|
7
2
|
CONFIGFILE = "repos.ini"
|
8
3
|
INDEXFILENAME = "tt-repo.yaml"
|
9
4
|
INFOFILENAME = "tt-info.yaml"
|
10
5
|
MAGICNUMBER = 999
|
11
6
|
SEPARATOR = ":"
|
12
7
|
|
13
|
-
def
|
14
|
-
@env = Environment.new
|
15
|
-
init_params
|
16
|
-
end
|
17
|
-
|
18
|
-
def get(key)
|
8
|
+
def self.get(key)
|
19
9
|
return @env.get(key) if key.instance_of? String
|
20
10
|
|
21
11
|
@params[key] || "NODATA"
|
22
12
|
end
|
23
13
|
|
24
|
-
|
14
|
+
class Environment
|
15
|
+
def initialize(reader = nil)
|
16
|
+
@env = ENV
|
17
|
+
end
|
25
18
|
|
26
|
-
|
19
|
+
def get(key)
|
20
|
+
@env[key]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.init_params
|
27
25
|
@params = {}
|
28
26
|
home = get("HOME")
|
29
27
|
config_dirpath = File.join(home, ".config", "teuton")
|
30
28
|
@params[:config_dirpath] = config_dirpath
|
31
29
|
|
32
|
-
filename =
|
30
|
+
filename = CONFIGFILE
|
33
31
|
config_filepath = File.join(config_dirpath, filename)
|
34
32
|
@params[:config_filepath] = config_filepath
|
35
33
|
|
36
34
|
cache_dirpath = File.join(config_dirpath, "cache")
|
37
35
|
@params[:cache_dirpath] = cache_dirpath
|
38
36
|
end
|
37
|
+
|
38
|
+
@env = Environment.new
|
39
|
+
init_params
|
39
40
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "repo/repo_data"
|
4
|
+
require_relative "searcher"
|
5
|
+
require "json/pure"
|
6
|
+
|
7
|
+
class ShowInfo
|
8
|
+
def initialize
|
9
|
+
@repo_data = RepoData.default
|
10
|
+
end
|
11
|
+
|
12
|
+
def call(testid, options)
|
13
|
+
testinfo = get_testinfo(testid)
|
14
|
+
if options["format"] == "json"
|
15
|
+
puts testinfo.to_json
|
16
|
+
else
|
17
|
+
@repo_data.show_testinfo(testinfo)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def get_testinfo(testid)
|
24
|
+
testinfo = @repo_data.get_info(testid)
|
25
|
+
|
26
|
+
if testinfo == {}
|
27
|
+
results = Searcher.default.get(testid).results
|
28
|
+
if results.size.zero?
|
29
|
+
puts "No results!"
|
30
|
+
exit 1
|
31
|
+
elsif results.size == 1
|
32
|
+
testid = results[0][:id]
|
33
|
+
testinfo = @repo_data.get_info(testid)
|
34
|
+
exit 1 if testinfo == {}
|
35
|
+
else
|
36
|
+
results.each { |i| puts "* #{i[:id]}" }
|
37
|
+
puts "#{results.size} results!"
|
38
|
+
exit 1
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
testinfo
|
43
|
+
end
|
44
|
+
end
|
data/lib/teuton-get/version.rb
CHANGED
@@ -0,0 +1,48 @@
|
|
1
|
+
require "colorize"
|
2
|
+
|
3
|
+
module TeutonGet
|
4
|
+
class Format
|
5
|
+
COLORS = [:light_blue, :light_magenta, :light_cyan, :red, :green, :yellow]
|
6
|
+
|
7
|
+
def self.disable
|
8
|
+
String.disable_colorization = true
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.colorize(text = "", option = nil)
|
12
|
+
return text if option.nil?
|
13
|
+
color = if option.instance_of? Integer
|
14
|
+
if option < COLORS.size
|
15
|
+
COLORS[option]
|
16
|
+
else
|
17
|
+
COLORS[option - COLOR.size]
|
18
|
+
end
|
19
|
+
elsif option.instance_of? Symbol
|
20
|
+
option
|
21
|
+
else
|
22
|
+
:silver
|
23
|
+
end
|
24
|
+
text.colorize(color)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# class MyColor
|
30
|
+
# COLORS = {
|
31
|
+
# black: 30, red: 31, green: 32, yellow: 33,
|
32
|
+
# blue: 34, violet: 35, cyan: 36, white: 37
|
33
|
+
# }
|
34
|
+
#
|
35
|
+
# def color(code)
|
36
|
+
# color = COLORS[code]
|
37
|
+
# if color.nil?
|
38
|
+
# color = COLORS[:violet]
|
39
|
+
# puts "[WARN] MyColor: unkown value color #{code}"
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
# if code == :white
|
43
|
+
# "\e[%dm#{@text}\e[0m" % color
|
44
|
+
# else
|
45
|
+
# "\e[%d;1m#{@text}\e[0m" % color
|
46
|
+
# end
|
47
|
+
# end
|
48
|
+
# end
|
@@ -1,8 +1,14 @@
|
|
1
1
|
require "tty-table"
|
2
2
|
require_relative "writer"
|
3
|
-
require_relative "
|
3
|
+
require_relative "format"
|
4
4
|
|
5
5
|
class TerminalWriter < Writer
|
6
|
+
attr_accessor :quiet
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@quiet = false
|
10
|
+
end
|
11
|
+
|
6
12
|
def write(text = "", args = {})
|
7
13
|
print TeutonGet::Format.colorize(text, args[:color])
|
8
14
|
end
|
@@ -13,7 +19,6 @@ class TerminalWriter < Writer
|
|
13
19
|
|
14
20
|
def write_table(rows)
|
15
21
|
table = TTY::Table.new(rows)
|
16
|
-
# puts table.render(:basic)
|
17
22
|
puts table.render(:ascii)
|
18
23
|
end
|
19
24
|
end
|
data/lib/teuton-get.rb
CHANGED
@@ -1,50 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "teuton-get/downloader"
|
1
4
|
require_relative "teuton-get/repo/local_info"
|
2
5
|
require_relative "teuton-get/repo/local_repo"
|
3
6
|
require_relative "teuton-get/repo/repo_config"
|
4
7
|
require_relative "teuton-get/repo/repo_data"
|
5
8
|
require_relative "teuton-get/searcher"
|
6
|
-
require_relative "teuton-get/
|
9
|
+
require_relative "teuton-get/show_info"
|
7
10
|
|
8
11
|
module TeutonGet
|
9
|
-
# Create metadata for local user teuton test
|
10
12
|
def self.create_info(testpath)
|
11
|
-
|
13
|
+
# Create metadata for local user teuton test
|
14
|
+
LocalInfo.new.user_created(testpath)
|
12
15
|
end
|
13
16
|
|
14
|
-
# Create metadata for local user teuton repository
|
15
17
|
def self.create_repo(dirpath)
|
16
|
-
|
18
|
+
# Create metadata for local user teuton repository
|
19
|
+
LocalRepo.default.create(dirpath)
|
17
20
|
end
|
18
21
|
|
19
|
-
|
20
|
-
|
21
|
-
Downloader.new.run(
|
22
|
+
def self.download(...)
|
23
|
+
# Download teuton test from remote
|
24
|
+
Downloader.new.run(...)
|
22
25
|
end
|
23
26
|
|
24
|
-
# Create Teuton Repo config file
|
25
27
|
def self.init
|
26
|
-
|
28
|
+
# Create Teuton Repo config file
|
29
|
+
RepoConfig.default.create
|
27
30
|
refresh # Auto repo refresh
|
28
31
|
end
|
29
32
|
|
30
|
-
# Refresh Teuton Repo Data
|
31
33
|
def self.refresh
|
32
|
-
|
34
|
+
# Refresh Teuton Repo Data
|
35
|
+
RepoData.default.refresh
|
33
36
|
end
|
34
37
|
|
35
|
-
def self.show_repo_list
|
36
|
-
RepoConfig.
|
38
|
+
def self.show_repo_list(...)
|
39
|
+
RepoConfig.default.show_list(...)
|
37
40
|
end
|
38
41
|
|
39
|
-
def self.show_info(
|
40
|
-
|
41
|
-
info = repo_data.get(test_id)
|
42
|
-
repo_data.show_testinfo(info) unless info == {}
|
42
|
+
def self.show_info(...)
|
43
|
+
ShowInfo.new.call(...)
|
43
44
|
end
|
44
45
|
|
45
|
-
def self.search(filter)
|
46
|
-
searcher = Searcher.
|
47
|
-
searcher.get(filter)
|
48
|
-
|
46
|
+
def self.search(filter, options)
|
47
|
+
searcher = Searcher.default
|
48
|
+
search = searcher.get(filter)
|
49
|
+
exit 1 if search.results.size.zero?
|
50
|
+
|
51
|
+
if options["format"] == "json"
|
52
|
+
search.show_json
|
53
|
+
else
|
54
|
+
search.show_screen
|
55
|
+
end
|
49
56
|
end
|
50
57
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: teuton-get
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Vargas Ruiz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-03-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: inifile
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0.8'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: json_pure
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2.6'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2.6'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: tty-progressbar
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -117,8 +131,6 @@ files:
|
|
117
131
|
- docs/repo.md
|
118
132
|
- docs/settings.md
|
119
133
|
- lib/teuton-get.rb
|
120
|
-
- lib/teuton-get/application.rb
|
121
|
-
- lib/teuton-get/application/environment.rb
|
122
134
|
- lib/teuton-get/cli.rb
|
123
135
|
- lib/teuton-get/downloader.rb
|
124
136
|
- lib/teuton-get/files/repos.ini
|
@@ -134,9 +146,12 @@ files:
|
|
134
146
|
- lib/teuton-get/repo/repo_data.rb
|
135
147
|
- lib/teuton-get/searcher.rb
|
136
148
|
- lib/teuton-get/searcher/result.rb
|
137
|
-
- lib/teuton-get/
|
149
|
+
- lib/teuton-get/searcher/search.rb
|
150
|
+
- lib/teuton-get/settings.rb
|
151
|
+
- lib/teuton-get/show_info.rb
|
138
152
|
- lib/teuton-get/version.rb
|
139
153
|
- lib/teuton-get/writer/file_writer.rb
|
154
|
+
- lib/teuton-get/writer/format.rb
|
140
155
|
- lib/teuton-get/writer/null_writer.rb
|
141
156
|
- lib/teuton-get/writer/terminal_writer.rb
|
142
157
|
- lib/teuton-get/writer/writer.rb
|
@@ -1,23 +0,0 @@
|
|
1
|
-
require "colorize"
|
2
|
-
|
3
|
-
module TeutonGet
|
4
|
-
module Format
|
5
|
-
COLORS = [:light_blue, :light_magenta, :light_cyan, :red, :green, :yellow]
|
6
|
-
|
7
|
-
def self.colorize(text = "", option = nil)
|
8
|
-
return text if option.nil?
|
9
|
-
color = if option.instance_of? Integer
|
10
|
-
if option < COLORS.size
|
11
|
-
COLORS[option]
|
12
|
-
else
|
13
|
-
COLORS[option - COLOR.size]
|
14
|
-
end
|
15
|
-
elsif option.instance_of? Symbol
|
16
|
-
option
|
17
|
-
else
|
18
|
-
:silver
|
19
|
-
end
|
20
|
-
text.colorize(color)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|