teuton 3.2.0 → 3.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.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +8 -8
  3. data/bin/teuton +2 -3
  4. data/docs/commands/README.md +8 -7
  5. data/docs/commands/check.md +17 -15
  6. data/docs/commands/help.md +17 -7
  7. data/docs/commands/readme.md +1 -1
  8. data/docs/devel/todo.md +74 -4
  9. data/docs/dsl/send.md +3 -3
  10. data/docs/dsl/show.md +2 -2
  11. data/docs/dsl/target.md +0 -14
  12. data/docs/install/t-node.md +10 -21
  13. data/docs/learn/02-target.md +49 -47
  14. data/docs/learn/03-remote_hosts.md +14 -15
  15. data/docs/learn/04-config.md +67 -68
  16. data/docs/learn/06-cmd_check.md +26 -24
  17. data/docs/learn/07-target_weight.md +3 -3
  18. data/docs/learn/08-unique_values.md +31 -29
  19. data/docs/learn/10-debug.md +36 -0
  20. data/docs/learn/13-feedback.md +10 -9
  21. data/docs/learn/15-readme.md +2 -2
  22. data/docs/learn/16-include.md +7 -7
  23. data/docs/learn/18-log.md +44 -43
  24. data/docs/learn/23-test-code.md +13 -10
  25. data/docs/learn/24-test-sql.md +5 -5
  26. data/docs/learn/26-expect_sequence.md +1 -1
  27. data/docs/learn/27-run_script.md +8 -5
  28. data/lib/teuton/case/action/action.rb +39 -0
  29. data/lib/teuton/case/action/manager.rb +63 -0
  30. data/lib/teuton/case/case.rb +17 -21
  31. data/lib/teuton/case/close.rb +3 -3
  32. data/lib/teuton/case/dsl/all.rb +1 -0
  33. data/lib/teuton/case/dsl/event.rb +24 -0
  34. data/lib/teuton/case/dsl/expect.rb +13 -12
  35. data/lib/teuton/case/dsl/expect_sequence.rb +1 -2
  36. data/lib/teuton/case/dsl/log.rb +3 -7
  37. data/lib/teuton/case/dsl/macro.rb +3 -2
  38. data/lib/teuton/case/dsl/run.rb +11 -17
  39. data/lib/teuton/case/dsl/send.rb +1 -17
  40. data/lib/teuton/case/dsl/target.rb +8 -4
  41. data/lib/teuton/case/dsl/upload.rb +1 -4
  42. data/lib/teuton/case/dsl/weight.rb +3 -3
  43. data/lib/teuton/case/execute/execute_base.rb +1 -1
  44. data/lib/teuton/case/execute/execute_local.rb +2 -2
  45. data/lib/teuton/case/execute/execute_manager.rb +6 -6
  46. data/lib/teuton/case/execute/execute_ssh.rb +6 -6
  47. data/lib/teuton/case/execute/execute_telnet.rb +4 -4
  48. data/lib/teuton/case/play.rb +8 -9
  49. data/lib/teuton/case/result/ext_compare.rb +10 -10
  50. data/lib/teuton/case_manager/case_manager.rb +4 -4
  51. data/lib/teuton/case_manager/dsl.rb +11 -10
  52. data/lib/teuton/case_manager/export_manager.rb +6 -12
  53. data/lib/teuton/case_manager/ext/check_cases.rb +1 -1
  54. data/lib/teuton/case_manager/ext/report.rb +0 -4
  55. data/lib/teuton/case_manager/show_resume_report.rb +29 -30
  56. data/lib/teuton/check/checker.rb +17 -8
  57. data/lib/teuton/check/dsl/all.rb +18 -10
  58. data/lib/teuton/check/dsl/expect.rb +29 -45
  59. data/lib/teuton/check/dsl/getset.rb +2 -2
  60. data/lib/teuton/check/dsl/run.rb +2 -2
  61. data/lib/teuton/check/show.rb +28 -34
  62. data/lib/teuton/cli/app.rb +123 -0
  63. data/lib/teuton/cli/run.rb +38 -0
  64. data/lib/teuton/errors.rb +94 -0
  65. data/lib/teuton/readme/action.rb +29 -0
  66. data/lib/teuton/readme/dsl/all.rb +17 -6
  67. data/lib/teuton/readme/dsl/expect.rb +3 -3
  68. data/lib/teuton/readme/dsl/run.rb +5 -11
  69. data/lib/teuton/readme/main.rb +13 -6
  70. data/lib/teuton/readme/readme.rb +12 -15
  71. data/lib/teuton/report/formatter/default/array.rb +15 -29
  72. data/lib/teuton/report/formatter/default/txt.rb +43 -32
  73. data/lib/teuton/report/formatter/formatter.rb +4 -13
  74. data/lib/teuton/report/formatter/resume/txt.rb +29 -28
  75. data/lib/teuton/report/formatter/resume/xml.rb +4 -4
  76. data/lib/teuton/report/report.rb +3 -1
  77. data/lib/teuton/utils/config_file_reader.rb +3 -11
  78. data/lib/teuton/utils/logger.rb +15 -10
  79. data/lib/teuton/utils/name_file_finder.rb +3 -11
  80. data/lib/teuton/utils/project.rb +4 -3
  81. data/lib/teuton/version.rb +1 -1
  82. data/lib/teuton.rb +6 -11
  83. metadata +8 -5
  84. data/docs/tutorial/es/nginx/README.md +0 -546
  85. data/lib/teuton/cli.rb +0 -120
  86. data/lib/teuton/deprecated/utils.rb +0 -14
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3143249db4eb37afed6b89f43c8eac399724fc1a65c3d582455693b7c2c70f15
4
- data.tar.gz: d45960480b70bca167e2fc8733b05595038db19d9787d737e69fe8292ac6db0b
3
+ metadata.gz: 2ffb8159388474653ba97b292becba216b9dc0d1361c5669c1c6c3ce8fd5b678
4
+ data.tar.gz: 7215fb1ca9e5b350c7e46498323bca0f51cc0ad2dfcbfc517ac3f2175183dbbf
5
5
  SHA512:
6
- metadata.gz: 9ddfd29427767f264e6988bb90e6a1080af39b405028c76274f1731b1b5cfe066b054c08f8669f549537e44284a201871b13dcd9d6a6c76550f8c7e0f2b852e3
7
- data.tar.gz: dae095a5c5f4f17643ed5ea26523ec2abb369b0a34c82381102f9ed0f4e0766fe5809188f0ac252b66744a28250fd8b652a7299f42d7faa3443c0a081766d2d8
6
+ metadata.gz: 53b34316e0dc1e8c7a2a8a042ef1694accb3ca89f3e9d193c8471104fd89de00c123f1f6a8ccbd8e2c1335e0446b11f6dcc328e7a6c28da4d7b4f89f26e1245a
7
+ data.tar.gz: 42fec6d0b1846cfcc73fef79731aa98966220705a76ed81a76ae3f4e9cc01a2eaa4f7e3b97c13a334b7bcf892d1947314b16417927024976623546ca41a88a33
data/README.md CHANGED
@@ -37,7 +37,7 @@ group "Learn about targets" do
37
37
  expect_fail
38
38
  end
39
39
 
40
- start do
40
+ play do
41
41
  show
42
42
  export
43
43
  end
@@ -46,18 +46,18 @@ end
46
46
  **Usage**: Run test with `teuton run TESTPATH`.
47
47
 
48
48
  ```console
49
- $ teuton run examples/02-target
49
+ $ teutonx examples/02-target
50
50
  ------------------------------------
51
- Started at 2025-12-01 18:14:44 +0000
51
+ Started at 2026-10-21 17:05:49 +0100
52
52
  F.
53
53
  Finished in 0.005 seconds
54
54
  ------------------------------------
55
55
 
56
- CASE RESULTS
57
- +------+-----------+-------+-------+
58
- | CASE | MEMBERS | GRADE | STATE |
59
- | 01 | anonymous | 33.0 | ? |
60
- +------+-----------+-------+-------+
56
+ CASE RESULTS
57
+ ┌──────┬───────────┬───────┬───────┐
58
+ │ CASE │ MEMBERS │ GRADE │ STATE │
59
+ │ 01 │ anonymous │ 33.0 │ ? │
60
+ └──────┴───────────┴───────┴───────┘
61
61
  ```
62
62
 
63
63
  **Output**: reports saved into `var/TESTNAME` folder.
data/bin/teuton CHANGED
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
+ require "teuton/cli/run"
2
3
 
3
- require "teuton/cli"
4
-
5
- CLI.start(ARGV)
4
+ Teuton::CLI.run(ARGV)
@@ -5,13 +5,14 @@
5
5
  ```
6
6
  $ teuton
7
7
  Commands:
8
- teuton [run] [OPTIONS] DIRECTORY # Run test from directory
9
- teuton check [OPTIONS] DIRECTORY # Check test and config file content
10
- teuton config [OPTIONS] DIRECTORY # Suggest configuration or run server
11
- teuton help [COMMAND] # Describe available commands or one specific command
12
- teuton new DIRECTORY # Create skeleton for a new project
13
- teuton readme DIRECTORY # Show README extracted from test contents
14
- teuton version # Show the program version
8
+ teuton [run] [OPTIONS] DIRECTORY # Run test from directory
9
+ teuton check [OPTIONS] DIRECTORY # Check test and config file content
10
+ teuton config DIRECTORY # Suggest configuration.
11
+ teuton help [COMMAND] # Describe available commands or one specific command
12
+ teuton new DIRECTORY # Create skeleton for a new project
13
+ teuton readme DIRECTORY # Show README extracted from test contents
14
+ teuton tree # Print a tree of all available commands
15
+ teuton version # Show the program version
15
16
  ```
16
17
 
17
18
  Available command functions:
@@ -27,11 +27,12 @@ Alias: `teuton c foo`, `teuton -c foo`, `teuton --check foo`
27
27
  ## Example
28
28
 
29
29
  ```
30
- $ teuton check examples/02-target
30
+ $ teuton check examples/02-target
31
+
32
+ ┌────────────────────────────┐
33
+ │ GROUP: Learn about targets │
34
+ └────────────────────────────┘
31
35
 
32
- +----------------------------+
33
- | GROUP: Learn about targets |
34
- +----------------------------+
35
36
  (001) target Create user obiwan
36
37
  weight 2.0
37
38
  run 'id obiwan' on localhost
@@ -42,17 +43,18 @@ $ teuton check examples/02-target
42
43
  run 'id vader' on localhost
43
44
  expect_fail
44
45
 
45
- +--------------+-------+
46
- | DSL Stats | Count |
47
- +--------------+-------+
48
- | Groups | 1 |
49
- | Targets | 2 |
50
- | Runs | 2 |
51
- | * localhost | 2 |
52
- +--------------+-------+
53
- [WARN] Configfile not found
54
- .../examples/02-target/config.yaml
55
- [INFO] Recomended content:
46
+
47
+ ┌──────────────┬───────┐
48
+ │ DSL Stats │ Count │
49
+ ├──────────────┼───────┤
50
+ │ Groups │ 1 │
51
+ │ Targets │ 2 │
52
+ │ Runs │ 2 │
53
+ │ * localhost │ 2 │
54
+ └──────────────┴───────┘
55
+ Warn | Configfile not found
56
+ - File: ../examples/02-target/config.yaml
57
+ Info | Recomended content:
56
58
  ---
57
59
  global:
58
60
  cases:
@@ -15,23 +15,33 @@ Alias: `teuton h`,`teuton -h`, `teuton --help`
15
15
  Commands:
16
16
  teuton [run] [OPTIONS] DIRECTORY # Run test from directory
17
17
  teuton check [OPTIONS] DIRECTORY # Check test and config file content
18
- teuton config [OPTIONS] DIRECTORY # Suggest configuration or run server
18
+ teuton config [OPTIONS] DIRECTORY # Suggest configuration.
19
19
  teuton help [COMMAND] # Describe available commands or one specific command
20
20
  teuton new DIRECTORY # Create skeleton for a new project
21
21
  teuton readme DIRECTORY # Show README extracted from test contents
22
+ teuton tree # Print a tree of all available commands
22
23
  teuton version # Show the program version
23
24
  ```
24
25
 
25
- **Example**: `teuton help config`
26
+ **Example**: `teuton help check`
27
+
26
28
  ```
27
29
  Usage:
28
- teuton config [OPTIONS] DIRECTORY
30
+ teuton check [OPTIONS] DIRECTORY
29
31
 
30
32
  Options:
31
- [--server], [--no-server], [--skip-server]
33
+ [--onlyconfig], [--no-onlyconfig], [--skip-onlyconfig]
34
+ [--color], [--no-color], [--skip-color]
35
+ [--cname=CNAME]
36
+ [--cpath=CPATH]
32
37
 
33
38
  Description:
34
- config DIRECTORY, "Suggest the content of the configuration file based on the test"
39
+ (1) teuton check PATH/TO/DIR , Check content of start.rb and config.yaml files.
35
40
 
36
- config --server DIRECTORY, "Init Config Server. Students connect and help to build config file content"
37
- ```
41
+ (2) teuton check PATH/TO/DIR --cname=demo , Check content of start.rb and demo.yaml files:
42
+
43
+ (3) teuton check PATH/TO/DIR --onlyconfig , Only show config file recomendations
44
+
45
+ (4) teuton check PATH/TO/DIR/foo.rb , Check content of foo.rb and foo.yaml files.
46
+
47
+ (5) teuton check PATH/TO/DIR/foo.rb --cname=demo , Check content of foo.rb and demo.yaml files.```
@@ -28,7 +28,7 @@ group "Learn about targets" do
28
28
  expect_fail
29
29
  end
30
30
 
31
- start do
31
+ play do
32
32
  show
33
33
  export
34
34
  end
data/docs/devel/todo.md CHANGED
@@ -1,18 +1,16 @@
1
1
  [<< back](../../README.md)
2
2
 
3
- # Roadmap Teuton v3.0.0 - 2026
3
+ # Roadmap Teuton v3.3.0 - 2026
4
4
 
5
5
  # 1. Revisar
6
6
 
7
7
  * Revisar (tests): result.grep(a).grep(b)
8
- * "Limpiar" las funciones "deprecated"
9
8
  * Aplicar las recomendaciones del informe de seguridad de Andrés.
10
9
  * verify get(:key) and get('key') works fine!
11
10
  * Formatter: xml
12
11
 
13
12
  # 2. Documentacion
14
13
 
15
- * Nuevo repo `teuton-book`: para documentación, tutoriales en español.
16
14
  * Documentar y hacer videos. Tener foros de la comunidad o presencia en reddit o stackoverflow.... o algo parecido???
17
15
  * Snode Dockerfile with SSH server
18
16
  * **ngrok**:
@@ -45,7 +43,7 @@ Ampliar las estadísticas de salida en el report `resume`:
45
43
 
46
44
  Nueva feature "eventos".
47
45
 
48
- * La idea está documentada mejor en el enlace siguiente.
46
+ * La idea está desarrollada en el enlace siguiente.
49
47
  * [Propuesta](https://github.com/dvarrui/teuton-book/blob/main/docs/03.eventos/index.md)
50
48
 
51
49
  Idea antigua: `ensure`
@@ -177,6 +175,78 @@ Expandir el modo de ejecución y medir rendimiento:
177
175
  - Fibras
178
176
  - Actores
179
177
 
178
+ ## 4.6 Excepciones vs exit
179
+
180
+ La buena práctica es la separación de responsabilidades:
181
+
182
+ * La librería nunca debe hacer exit ni abort. Su trabajo es exclusivamente levantar excepciones personalizadas cuando algo sale mal.
183
+ * El ejecutable (CLI) es el único que debe capturar esas excepciones, mostrarlas de forma amigable por la terminal y decidir cuándo terminar el proceso con exit 1.
184
+
185
+ * **Paso 1: Definir excepciones personalizadas**:
186
+
187
+ ```ruby
188
+ # lib/teuton/errors.rb
189
+ module Teuton
190
+ class Error < StandardError; end
191
+ class ConfigurationError < Error; end
192
+ class ExecutionError < Error; end
193
+ end
194
+ ```
195
+ * **Paso 2: Reemplazar los exit 1 en la librería por `raise`**
196
+
197
+ ```ruby
198
+ # lib/teuton/runner.rb
199
+ def run
200
+ if invalid_config?
201
+ raise Teuton::ConfigurationError, "Configuración inválida"
202
+ end
203
+ end
204
+ ```
205
+
206
+ * Paso 3: Capturar las excepciones en CLI
207
+ * Integración con Thor
208
+
209
+ 1. Hacer que Thor devuelva un código de salida 1 en errores de Thor
210
+
211
+ ```ruby
212
+ # lib/teuton/cli.rb
213
+ require "thor"
214
+
215
+ module Teuton
216
+ class CLI < Thor
217
+ # Esto asegura que si Thor falla internamente (ej: comandos/opciones inválidas),
218
+ # el programa salga con código 1 en lugar de 0.
219
+ def self.exit_on_failure?
220
+ true
221
+ end
222
+
223
+ desc "run", "Ejecuta un script de Teuton"
224
+ def run
225
+ # Aquí llamas a la lógica de tu gema
226
+ # Si hay un error, tu lógica lanzará una excepción (ej: Teuton::Error)
227
+ Teuton::Runner.new.execute
228
+ end
229
+ end
230
+ end
231
+ ```
232
+
233
+ 2. Lanzar excepciones personalizadas en la lógica de tu librería.
234
+
235
+ ```ruby
236
+ # lib/teuton/runner.rb
237
+ module Teuton
238
+ class Runner
239
+ def execute
240
+ if algun_error_detectado?
241
+ raise Teuton::Error, "Ocurrió un error al ejecutar los tests"
242
+ end
243
+ end
244
+ end
245
+ end
246
+ ```
247
+
248
+ 3. Capturar excepciones en el ejecutable bin/teuton
249
+
180
250
  # 5. Proyectos
181
251
 
182
252
  Ideas que emepzaron como un nuevo feature pero por sus dimensiones, funcionalidades y características van ha derivar a su propio proyecto independiente:
data/docs/dsl/send.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  Usage:
8
8
  ```ruby
9
- start do
9
+ play do
10
10
  export
11
11
  send copy_to: :host1
12
12
  end
@@ -31,7 +31,7 @@ If you export several files using differents output formats, you will use severa
31
31
  In this example we export html and txt files, but only send txt to remote hosts:
32
32
 
33
33
  ```ruby
34
- start do
34
+ play do
35
35
  export format: :json
36
36
  export format: :txt
37
37
 
@@ -42,7 +42,7 @@ end
42
42
  If you want to send every exported output file, then do like this:
43
43
 
44
44
  ```ruby
45
- start do
45
+ play do
46
46
  export format: :html
47
47
  send copy_to: :host1
48
48
 
data/docs/dsl/show.md CHANGED
@@ -5,7 +5,7 @@
5
5
  When all tests are finished, the `show` command displays information on the screen about the final results.
6
6
 
7
7
  ```ruby
8
- start do
8
+ play do
9
9
  show
10
10
  end
11
11
  ```
@@ -18,7 +18,7 @@ end
18
18
  | `show verbose: NUMBER` | NUMBER is the value of the verbose level |
19
19
 
20
20
  ```ruby
21
- start do
21
+ play do
22
22
  show verbose: 1
23
23
  end
24
24
  ```
data/docs/dsl/target.md CHANGED
@@ -17,17 +17,3 @@ By default weight is `1.0`, but it's posible specified other values:
17
17
  ```ruby
18
18
  target "Write here your description", weight: 2.5
19
19
  ```
20
-
21
- ## [DEPRECATED] Alias
22
-
23
- `goal` keyword is an alias of `target`. So it's the same:
24
-
25
- ```ruby
26
- target "Write here your description"
27
- ```
28
-
29
- or
30
-
31
- ```ruby
32
- goal "Write here your description"
33
- ```
@@ -106,24 +106,13 @@ CMD ["/bin/bash"]
106
106
  If you want to install Teuton by your own, or there are not installation scripts for your OS, here you have information how to install all the required packages for Teuton.
107
107
 
108
108
  Manual installation:
109
- 1. Git installation
110
- * Install Git.
111
- * Run `git --version` to show current version
112
- 1. Ruby installation
113
- * Install ruby.
114
- * Run `ruby -v` to show current version (2.1.3p242+)
115
- 1. Rake installation
116
- * Run `gem install rake`, then
117
- * `rake --version` to show current version (10.4.2+).
118
- 1. Download this project
119
- * (a) `git clone https://github.com/dvarrui/teuton.git` or
120
- * (b) Download and unzip [file](https://github.com/dvarrui/teuton-panel/archive/master.zip).
121
- 1. Move into Teuton folder
122
- * Run `cd teuton`
123
- 1. Gems installation.
124
- * `rake install`, to install required gems.
125
- 1. Only for developers
126
- * Run `rake devel:debian` or
127
- * `rake devel:opensuse`, install gem for developers.
128
- 1. Final check
129
- * `rake`
109
+
110
+ 1. Install Git. Run `git --version` to show current version
111
+ 1. Install ruby. Run `ruby -v` to show current version (3.2.8)
112
+ 1. Install Rake (`gem install rake`), then `rake --version` to show current version (13.4.2).
113
+ 1. Clone repo `git clone https://github.com/dvarrui/teuton.git` or download and unzip.
114
+ 1. Move into Teuton folder: `cd teuton`
115
+ 1. Install gems: `rake install`.
116
+ 1. Only Debian OS: `rake devel:debian`.
117
+ 1. Obly OpenSUSE OS: `rake devel:opensuse`.
118
+ 1. Final check: `rake`
@@ -62,13 +62,13 @@ end
62
62
  Execute this command to run the test:
63
63
 
64
64
  ```
65
- $ teuton run examples/02-target
66
-
67
- CASE RESULTS
68
- +------+-----------+-------+-------+
69
- | CASE | MEMBERS | GRADE | STATE |
70
- | 01 | anonymous | 100.0 | ✔ |
71
- +------+-----------+-------+-------+
65
+ $ teuton examples/02-target
66
+
67
+ CASE RESULTS
68
+ ┌──────┬───────────┬───────┬───────┐
69
+ │ CASE │ MEMBERS │ GRADE │ STATE │
70
+ │ 01 │ anonymous │ 33.0 │ ? │
71
+ └──────┴───────────┴───────┴───────┘
72
72
  ```
73
73
 
74
74
  Report files are created into `var/02-target/` folder:
@@ -85,44 +85,46 @@ Let's see one report:
85
85
 
86
86
  ```
87
87
  $ cat var/02-target/case-01.txt
88
- CONFIGURATION
89
- +-------------+-----------+
90
- | tt_members | anonymous |
91
- | tt_sequence | false |
92
- | tt_skip | false |
93
- | tt_testname | 02-target |
94
- +-------------+-----------+
95
-
96
- GROUPS
97
- - Learn about targets
98
- 01 (0.0/1.0)
99
- Description : Create user obiwan
100
- Command : id obiwan
101
- Output : id: «obiwan»: no existe ese usuario
102
- Duration : 0.002 (local)
103
- Alterations : find(uid=) & find((obiwan)) & find(gid=) & count
104
- Expected : Greater than 0
105
- Result : 0
106
- 02 (1.0/1.0)
107
- Description : Delete user vader
108
- Command : id vader
109
- Output : id: «vader»: no existe ese usuario
110
- Duration : 0.002 (local)
111
- Alterations : Read exit code
112
- Expected : Greater than 0
113
- Result : 1
114
-
115
- RESULTS
116
- +--------------+---------------------------+
117
- | case_id | 01 |
118
- | start_time | 2023-06-16 08:42:13 +0100 |
119
- | finish_time | 2023-06-16 08:42:13 +0100 |
120
- | duration | 0.004527443 |
121
- | unique_fault | 0 |
122
- | max_weight | 2.0 |
123
- | good_weight | 1.0 |
124
- | fail_weight | 1.0 |
125
- | fail_counter | 1 |
126
- | grade | 50 |
127
- +--------------+---------------------------+
88
+
89
+ CONFIGURATION
90
+ ┌────────────────┬────────────────────────────────┐
91
+ │ tt_config_path │ examples/02-target/config.yaml │
92
+ │ tt_members │ anonymous │
93
+ │ tt_script_path │ examples/02-target/start.rb │
94
+ │ tt_sequence │ false │
95
+ │ tt_skip │ false │
96
+ └────────────────┴────────────────────────────────┘
97
+
98
+ GROUPS
99
+ ▶ Learn about targets
100
+ ✖ 01 (0.0/2.0) ┌──
101
+ Description │ Create user obiwan
102
+ Command │ id obiwan
103
+ Output │ id: «obiwan»: no existe ese usuario
104
+ Duration │ 0.002 (local)
105
+ Alterations │ find(uid=) & find((obiwan)) & find(gid=) & count
106
+ Expected │ Greater than 0
107
+ Result │ 0
108
+ ✔ 02 (1.0/1.0) ├──
109
+ Description │ Delete user vader
110
+ Command │ id vader
111
+ Output │ id: «vader»: no existe ese usuario
112
+ Duration │ 0.002 (local)
113
+ Alterations │ Read exit code
114
+ Expected │ Greater than 0
115
+ Result │ 1
116
+ └──
117
+ RESULTS
118
+ ┌──────────────┬───────────────────────────┐
119
+ │ unique_fault │ 0 │
120
+ │ case_id │ 01 │
121
+ │ start_time │ 2026-10-21 21:32:24 +0100 │
122
+ │ finish_time │ 2026-10-21 21:32:24 +0100 │
123
+ │ duration │ 0.004153712 │
124
+ │ max_weight │ 3.0 │
125
+ │ good_weight │ 1.0 │
126
+ │ fail_weight │ 2.0 │
127
+ │ fail_counter │ 1 │
128
+ │ grade │ 33 │
129
+ └──────────────┴───────────────────────────┘
128
130
  ```
@@ -55,22 +55,21 @@ end
55
55
  Execution:
56
56
 
57
57
  ```
58
- $ teuton run examples/03-remote_hosts
58
+ $ teutonx examples/03-remote_hosts
59
59
 
60
- CASE RESULTS
61
- +------+-----------+-------+-------+
62
- | CASE | MEMBERS | GRADE | STATE |
63
- | 01 | student_1 | 0.0 | ? |
64
- | - | - | 0.0 | S |
65
- | 03 | student_3 | 100.0 | ✔ |
66
- +------+-----------+-------+-------+
67
-
68
- CONN ERRORS
69
- +------+-----------+-------+------------------+
70
- | CASE | MEMBERS | HOST | ERROR |
71
- | 01 | student_1 | host1 | host_unreachable |
72
- +------+-----------+-------+------------------+
73
-
60
+ CASE RESULTS
61
+ ┌──────┬───────────┬───────┬───────┐
62
+ │ CASE │ MEMBERS │ GRADE │ STATE │
63
+ │ 01 │ student_1 │ 0.0 │ ? │
64
+ │ - │ - │ 0.0 │ S │
65
+ │ 03 │ student_3 │ 100.0 │ ✔ │
66
+ └──────┴───────────┴───────┴───────┘
67
+
68
+ CONN ERRORS
69
+ ┌──────┬───────────┬───────┬──────────────────┐
70
+ │ CASE │ MEMBERS │ HOST │ ERROR │
71
+ │ 01 │ student_1 │ host1 │ host_unreachable │
72
+ └──────┴───────────┴───────┴──────────────────┘
74
73
  ```
75
74
 
76
75
  Notice that: