teuton 2.3.7 → 2.3.9

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: ec3ce7a6b9c34c5ee3aba1203009dbe2a9c334e413ad695795f73e351fd466f0
4
- data.tar.gz: 99d57501268057252084f3175a3f728e855200fc0319714229fb2f820e1ffef3
3
+ metadata.gz: 44964e011d270c87d22b3571bd8637a1da2397dd66ad69cc869c591ed12147f2
4
+ data.tar.gz: 835924c003e68e42f697613c03324ff207b772ed7ed39601627a5d5a8a8c924a
5
5
  SHA512:
6
- metadata.gz: a476ced60b6439210596dcf224d3dcac7f27edf63b6683f3dd32458f173afd27e33d434f1611ff8572659440f96a96ad0078ff549ce3f3b2e113bf0c0e77cb82
7
- data.tar.gz: 3c4d5866483aa04ec9559992c4cf5512a095c91b61a7058f454f511865c82d7d14e8986be87d2bb3f9a06d9828079066144be373b8307caca719443eafe179d5
6
+ metadata.gz: 17f65a4398602b5baaa80fa86f801c953462c76021cc630dd4d5c6634e26459b34bececd59aa7e2a78f2fd8d1bf5b77214f3883052a44ce743a7da524695faa8
7
+ data.tar.gz: 2f376375fa4186d5eb3414f422d81ccd5035f33303b8091cd0166e494512e0e1bad7d8dbb7dd797b1c80bb1b5637b4ecc71189d6863c5ef7fcf2b723aa2a987c
data/README.md CHANGED
@@ -1,12 +1,11 @@
1
1
 
2
2
  [![Gem Version](https://badge.fury.io/rb/teuton.svg)](https://badge.fury.io/rb/teuton)
3
3
  ![GitHub](https://img.shields.io/github/license/dvarrui/teuton)
4
- ![Gem](https://img.shields.io/gem/dv/teuton/2.3.6)
4
+ ![Gem](https://img.shields.io/gem/dv/teuton/2.3.8)
5
5
 
6
6
  # TEUTON
7
7
 
8
- _Create Unit Test for your machines, and
9
- test your infraestructure as code._
8
+ _Create Unit Test for your machines. Test your infraestructure as code._
10
9
 
11
10
  ![logo](./docs/images/logo.png)
12
11
 
@@ -24,7 +23,7 @@ Teuton allow us:
24
23
  * [Installation](https://github.com/teuton-software/teuton/tree/master/docs/install/README.md)
25
24
  * Install Ruby on your system.
26
25
  * Install Teuton as normal user: `gem install --user-install teuton` (or install as superuser `gem install teuton`).
27
- * [Videos, blogs, news](docs/videos.md)
26
+ * [Blogs and videos](docs/videos.md)
28
27
  * [Learning](docs/learn/README.md)
29
28
  * [Commands](docs/commands/README.md)
30
29
  * [Language reference](docs/dsl/README.md)
data/docs/CHANGELOG.md CHANGED
@@ -2,7 +2,27 @@
2
2
 
3
3
  # Changelog
4
4
 
5
- * [version 2.4](changelog/v2.4.md)
5
+ ## TO-DO
6
+
7
+ - Teuton readme --lang=es
8
+
9
+ ## [2.4.0]
10
+
11
+ New features:
12
+ - Add new DSL keyword: expect_last, expect_fisrt
13
+ - New doc and example: learn-15-exit_codes
14
+ - Remove os gem.
15
+ - Change test output colors to green as use others test tools.
16
+
17
+ Bug fixed:
18
+ - All "expect*" keywords must require 2 arguments. The second is optional.
19
+
20
+ Revise
21
+ - Remove colors to log text
22
+ - teuton readme: macros, getvars, expect_last, expect_first
23
+ - Formatter: xml, csv, list, etc.
24
+
25
+
6
26
  * [version 2.2](changelog/v2.2.md)
7
27
  * [version 2.1](changelog/v2.1.md)
8
28
  * [version 2.0](changelog/v2.0.md)
@@ -0,0 +1,47 @@
1
+ [<< back](README.md)
2
+
3
+ # Example: 14-alias
4
+
5
+ Supongamos que tenemos un test como el siguiente:
6
+
7
+ ```ruby
8
+ group "Using alias" do
9
+ target "Verify user #{get(:super)} with key alias."
10
+ run "id #{get(:super)}"
11
+ expect get(:super)
12
+
13
+ target "Verify user #{_username} with method alias."
14
+ run "id #{_username}"
15
+ expect _username
16
+ end
17
+ ```
18
+
19
+ Tenemos sólo 2 targets pero podríamos tener muchos más.
20
+
21
+ > Recordemos que `_username` es equivalente a `get(:username)`
22
+
23
+ Sabemos que el fichero de configuración debe definir los valores para los parámetros `super` y `username`. Queremos aprovechar un fichero de configuración que ya teníamos de otro test, pero tiene el siguiente contenido:
24
+
25
+ ```yaml
26
+ # Version 1
27
+ # File: config.yaml
28
+ global:
29
+ cases:
30
+ - tt_members: Anonymous
31
+ superuser: root
32
+ username: obiwan
33
+ ```
34
+
35
+ Podemos comprobar que nuestro test require el parámetro `super` pero el fichero de configuración lo ha nombrado como `superuser`.
36
+
37
+ ```yaml
38
+ # Version 2
39
+ # File: config.yaml
40
+ alias:
41
+ super: :superuser
42
+ global:
43
+ cases:
44
+ - tt_members: Anonymous
45
+ superuser: root
46
+ username: obiwan
47
+ ```
data/docs/videos.md CHANGED
@@ -1,19 +1,20 @@
1
1
  [<< back](../README.md)
2
2
 
3
- # News
3
+ # Blogs
4
4
 
5
- * [Introducción a Teuton](https://elpuig.xeill.net/Members/vcarceler/articulos/introduccion-a-teuton): iniciarse en el uso de Teutón gracias al fantástico artículo de Víctor Carceler.
6
- * [Verificar prácticas de GNS3 con Teuton](https://elpuig.xeill.net/Members/juanmorote/articulos/verificar-practicas-de-gns3-con-teuton): GNS3 es un excelente simulador de red Open Source que además se entiende con Teuton a las mil maravillas.
5
+ * ES - [Introducción a Teuton](https://elpuig.xeill.net/Members/vcarceler/articulos/introduccion-a-teuton): iniciarse en el uso de Teutón gracias al fantástico artículo de Víctor Carceler.
6
+ * ES - [Verificar prácticas de GNS3 con Teuton](https://elpuig.xeill.net/Members/juanmorote/articulos/verificar-practicas-de-gns3-con-teuton): GNS3 es un excelente simulador de red Open Source que además se entiende con Teuton a las mil maravillas.
7
7
 
8
8
  # Videos
9
9
 
10
+ Teuton:
11
+ * [Apuntes FP Informática - I Congreso Virtual - Mayo 2020](https://youtu.be/RxIV26BAoGo)
12
+ * [Teuton Software 2.1 - Tutorial - Oct 2020](https://youtu.be/cyBN-rOYQeY)
13
+
10
14
  Teuton en el 2016 se llamaba "sysadmingame".
11
- * [CHAPI16 - Presentación sysadmingame chapi16 - Abril 2016](https://youtu.be/cNJaB5xzHHQ)
15
+ * ES -[CHAPI16 - Presentación sysadmingame chapi16 - Abril 2016](https://youtu.be/cNJaB5xzHHQ)
12
16
  * sysadmingame:
13
17
  1. [Instalación del programa](https://youtu.be/dnyMq9_KDco)
14
18
  2. [Crear un caso simple](https://youtu.be/0e2g5Izvc6c)
15
19
  3. [Crear un caso complejo](https://youtu.be/ebEK6OXH8kQ)
16
20
 
17
- Teuton:
18
- * [Apuntes FP Informática - I Congreso Virtual - Mayo 2020](https://youtu.be/RxIV26BAoGo)
19
- * [Teuton Software 2.1 - Tutorial - Oct 2020](https://youtu.be/cyBN-rOYQeY)
@@ -76,46 +76,30 @@ class Case
76
76
  tempfile :default
77
77
  end
78
78
 
79
- ##
80
- # Export Case with specific output format
81
- # @param format (Symbol)
82
79
  def export(format)
83
80
  return if skip?
84
81
 
85
82
  @report.export format
86
83
  end
87
84
 
88
- ##
89
- # Return case report filename
90
- # @return String
91
85
  def filename
92
86
  @report.filename
93
87
  end
94
88
 
95
- ##
96
- # Return case grade
97
- # @return grade
98
89
  def grade
99
90
  return 0.0 if skip
100
91
 
101
92
  @report.tail[:grade]
102
93
  end
103
94
 
104
- ## Return case members
105
- # @return members
106
95
  def members
107
96
  return "-" if skip
108
97
 
109
98
  @report.head[:tt_members] || "noname"
110
99
  end
111
100
 
112
- ##
113
- # Return case skip value
114
- # @return skip
115
101
  alias skip? skip
116
102
 
117
- ##
118
- # Show case report data on screen
119
103
  def show
120
104
  @report.show
121
105
  end
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Class Case#close
4
3
  class Case
5
4
  def close(uniques)
6
5
  fails = 0
@@ -32,8 +32,8 @@ module DSL
32
32
  # * Invoke macro (assert)
33
33
  def method_missing(method, args = {})
34
34
  a = method.to_s
35
- if a.start_with?("_") && a.end_with?("_")
36
- return instance_eval("get(:#{a[1, a.size - 2]})", __FILE__, __LINE__)
35
+ if a.start_with?("_")
36
+ return instance_eval("get(:#{a[1, a.size - 1]})", __FILE__, __LINE__)
37
37
  end
38
38
  return macro a[6, a.size], args if a[0, 6] == "macro_"
39
39
  macro a, args
@@ -7,8 +7,6 @@
7
7
  # * fill_report
8
8
  # * close_opened_sessions
9
9
  class Case
10
- ##
11
- # Execute "play" order on this case
12
10
  def play
13
11
  if skip?
14
12
  verbose "Skipping case <#{@config.get(:tt_members)}>\n"
@@ -34,9 +32,6 @@ class Case
34
32
 
35
33
  private
36
34
 
37
- ##
38
- # Execute every play#group in parallel
39
- # TO-DO: Under construction!
40
35
  def play_in_parallel
41
36
  @groups.each do |t|
42
37
  @action[:groupname] = t[:name]
@@ -44,8 +39,6 @@ class Case
44
39
  end
45
40
  end
46
41
 
47
- ##
48
- # Execute every play#group in sequence
49
42
  def play_in_sequence
50
43
  verboseln "Starting case [#{@config.get(:tt_members)}]"
51
44
  @groups.each do |t|
@@ -57,8 +50,6 @@ class Case
57
50
  verboseln "\n"
58
51
  end
59
52
 
60
- ##
61
- # Fill case report with time information
62
53
  def fill_report(start_time, finish_time)
63
54
  @report.head.merge! @config.global
64
55
  @report.head.merge! @config.local
@@ -1,8 +1,6 @@
1
1
  require_relative "../application"
2
2
  require_relative "case_manager"
3
3
 
4
- # Define filename to be used into our test
5
- # @param filename (String) Filename to be required
6
4
  def use(filename)
7
5
  filename += ".rb"
8
6
  app = Application.instance
@@ -14,9 +12,6 @@ def use(filename)
14
12
  app.uses << File.basename(findfiles.first)
15
13
  end
16
14
 
17
- # Define macro. That's a name to predefined target-run-expect evaluation.
18
- # @param name (String) macro name
19
- # @param block (Block) macro code
20
15
  def define_macro(name, *args, &block)
21
16
  Application.instance.macros[name] = {args: args, block: block}
22
17
  end
@@ -3,14 +3,10 @@
3
3
  ##
4
4
  # Include Teuton DSL keywords into Laboratory class
5
5
  class Laboratory
6
- ##
7
- # Execute Teuton DSL readme keyword
8
6
  def readme(_text)
9
7
  # Usefull for "teuton readme" command action.
10
8
  end
11
9
 
12
- ##
13
- # Execute Teuton DSL target keyword
14
10
  def target(desc, args = {})
15
11
  @stats[:targets] += 1
16
12
  @targetid += 1
@@ -20,55 +16,36 @@ class Laboratory
20
16
  end
21
17
  alias goal target
22
18
 
23
- ##
24
- # Execute Teuton DSL run keyword
25
- def run(command, args = {})
26
- args[:exec] = command
27
- host = :localhost
28
- host = args[:on] if args[:on]
29
- goto(host, args)
30
- end
31
-
32
- ##
33
- # Execute Teuton DSL goto keyword
34
- def goto(host = :localhost, args = {})
35
- result.reset
36
- args[:on] = host unless args[:on]
37
-
38
- if @hosts[host]
39
- @hosts[host] += 1
40
- else
41
- @hosts[host] = 1
42
- end
43
- verboseln " run '#{args[:exec]}' on #{args[:on]}"
44
- end
45
-
46
- ##
47
- # Execute Teuton DSL expect keyword
48
19
  def expect(cond)
49
20
  verboseln " alter #{result.alterations}" unless result.alterations.empty?
50
21
  verboseln " expect #{cond} (#{cond.class})"
51
22
  verboseln ""
52
23
  end
53
24
 
54
- ##
55
- # Execute Teuton DSL expect_one keyword
56
- def expect_one(cond)
57
- verboseln " alter #{result.alterations}" unless result.alterations.empty?
58
- verboseln " expect_one #{cond} (#{cond.class})"
25
+ def expect_first(cond)
26
+ verboseln " alter #{result.alterations}" unless result.alterations.empty?
27
+ verboseln " expect_first #{cond} (#{cond.class})"
28
+ verboseln ""
29
+ end
30
+
31
+ def expect_last(cond)
32
+ verboseln " alter #{result.alterations}" unless result.alterations.empty?
33
+ verboseln " expect_last #{cond} (#{cond.class})"
59
34
  verboseln ""
60
35
  end
61
36
 
62
- ##
63
- # Execute Teuton DSL expect_none keyword
64
37
  def expect_none(cond)
65
38
  verboseln " alter #{result.alterations}" unless result.alterations.empty?
66
39
  verboseln " expect_none #{cond} (#{cond.class})"
67
40
  verboseln ""
68
41
  end
69
42
 
70
- ##
71
- # Execute Teuton DSL get keyword
43
+ def expect_one(cond)
44
+ verboseln " alter #{result.alterations}" unless result.alterations.empty?
45
+ verboseln " expect_one #{cond} (#{cond.class})"
46
+ verboseln ""
47
+ end
48
+
72
49
  def get(varname)
73
50
  @stats[:gets] += 1
74
51
 
@@ -81,23 +58,37 @@ class Laboratory
81
58
  "get(#{varname})"
82
59
  end
83
60
 
84
- # If a method call is missing, then try to call get(var)
85
- # rubocop:disable Style/MissingRespondToMissing
86
- def method_missing(method)
61
+ def run(command, args = {})
62
+ args[:exec] = command
63
+ host = :localhost
64
+ host = args[:on] if args[:on]
65
+ goto(host, args)
66
+ end
67
+
68
+ def goto(host = :localhost, args = {})
69
+ result.reset
70
+ args[:on] = host unless args[:on]
71
+
72
+ if @hosts[host]
73
+ @hosts[host] += 1
74
+ else
75
+ @hosts[host] = 1
76
+ end
77
+ verboseln " run '#{args[:exec]}' on #{args[:on]}"
78
+ end
79
+
80
+ # Check macros and _get_vars
81
+ def method_missing(method, *args, &block)
87
82
  a = method.to_s
88
- instance_eval("get(:#{a[0, a.size - 1]})", __FILE__, __LINE__) if a[a.size - 1] == "?"
83
+ if args.nil? && block.nil?
84
+ instance_eval("get(:#{a[0, a.size - 1]})", __FILE__, __LINE__) if a[a.size - 1] == "?"
85
+ end
89
86
  end
90
- # rubocop:enable Style/MissingRespondToMissing
91
87
 
92
- ##
93
- # Execute Teuton DSL gett keyword
94
- # Same as get keyword, but show pretty output when used by readme command.
95
88
  def gett(option)
96
89
  get(option)
97
90
  end
98
91
 
99
- ##
100
- # Execute Teuton DSL unique keyword
101
92
  def unique(key, _value)
102
93
  @stats[:uniques] += 1
103
94
 
@@ -105,15 +96,11 @@ class Laboratory
105
96
  verboseln ""
106
97
  end
107
98
 
108
- ##
109
- # Execute Teuton DSL log keyword
110
99
  def log(text = "", type = :info)
111
100
  @stats[:logs] += 1
112
101
  verboseln " log [#{type}]: " + text.to_s
113
102
  end
114
103
 
115
- ##
116
- # Execute Teuton DSL set keyword
117
104
  def set(key, value)
118
105
  @stats[:sets] += 1
119
106
 
@@ -6,9 +6,6 @@ require_relative "show"
6
6
  require_relative "dsl"
7
7
  require_relative "builtin"
8
8
 
9
- ##
10
- # DSL use: import filename instructions
11
- # @param filename (String)
12
9
  def use(filename)
13
10
  filename += ".rb"
14
11
  app = Application.instance
@@ -19,18 +16,18 @@ def use(filename)
19
16
  require_relative use[0]
20
17
  end
21
18
 
22
- ##
23
- # DSL group: Define a group of test
24
- # @param name (String or Symbol)
25
- # @param block (Proc)
26
19
  def group(name, &block)
27
20
  Application.instance.groups << {name: name, block: block}
28
21
  end
29
22
  alias task group
30
23
 
31
- ##
32
- # DSL start: Define main teuton test execution
33
- # @param block (Proc)
24
+ def define_macro(name, *args, &block)
25
+ Application.instance.macros[name] = {args: args, block: block}
26
+ end
27
+ alias def_macro define_macro
28
+ alias defmacro define_macro
29
+
30
+
34
31
  def start(&block)
35
32
  # Don't do nothing. We are checking test not running it
36
33
  end
@@ -9,8 +9,6 @@ require_relative "../utils/configfile_reader"
9
9
  # * show_stats
10
10
  # * show_config
11
11
  class Laboratory
12
- ##
13
- # Display DSL checking on screen
14
12
  def show
15
13
  @verbose = true
16
14
  process_content
@@ -18,8 +16,6 @@ class Laboratory
18
16
  revise_config_content
19
17
  end
20
18
 
21
- ##
22
- # Display config for teuton panel on screen
23
19
  def show_panelconfig
24
20
  @verbose = false
25
21
  process_content
@@ -69,6 +69,8 @@ class Readme
69
69
  result.reset
70
70
  end
71
71
  alias expect_any expect
72
+ alias expect_first expect
73
+ alias expect_last expect
72
74
  alias expect_none expect
73
75
  alias expect_one expect
74
76
 
@@ -7,9 +7,9 @@ module Lang
7
7
  version: "Teuton version : %s",
8
8
  testname: "Test unit name : %s",
9
9
  date: "Date : %s",
10
- hosts: "\n\#\#\# Required hosts\n",
11
- params: "\n\#\#\# Required params\n",
12
- goto: "\nGo to [%s](\#required-hosts) host, and do next:\n",
10
+ hosts: "\n### Required hosts\n",
11
+ params: "\n### Required params\n",
12
+ goto: "\nGo to [%s](#required-hosts) host, and do next:\n",
13
13
  global: "\nGlobal parameters that can be modified:\n",
14
14
  created: "\nParams created during challenge execution:\n"
15
15
  }
@@ -17,9 +17,9 @@ module Lang
17
17
  version: "Versión de Teuton : %s",
18
18
  testname: "Nombre del test : %s",
19
19
  date: "Fecha : %s",
20
- hosts: "\n\#\#\# Máquinas que se necesitan\n",
21
- params: "\n\#\#\# Parámetros de necesarios\n",
22
- goto: "\nIr a la máquina [%s](\#required-hosts), y hacer lo siguiente:\n",
20
+ hosts: "\n### Máquinas que se necesitan\n",
21
+ params: "\n### Parámetros de necesarios\n",
22
+ goto: "\nIr a la máquina [%s](#required-hosts), y hacer lo siguiente:\n",
23
23
  global: "\nParámetros globales que pueden ser modificados:\n",
24
24
  created: "\nParámetros creados durante la ejecución del reto:\n"
25
25
  }
@@ -1,5 +1,5 @@
1
1
  module Teuton
2
- VERSION = "2.3.7"
2
+ VERSION = "2.3.9"
3
3
  APPNAME = "teuton"
4
4
  GEMNAME = "teuton"
5
5
  DOCKERNAME = "dvarrui/#{GEMNAME}"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: teuton
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.7
4
+ version: 2.3.9
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: 2022-10-22 00:00:00.000000000 Z
11
+ date: 2022-11-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colorize
@@ -100,14 +100,14 @@ dependencies:
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '0.20'
103
+ version: '1.2'
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '0.20'
110
+ version: '1.2'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: terminal-table
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -122,20 +122,6 @@ dependencies:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
124
  version: '1.8'
125
- - !ruby/object:Gem::Dependency
126
- name: minitest
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - "~>"
130
- - !ruby/object:Gem::Version
131
- version: '5.15'
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - "~>"
137
- - !ruby/object:Gem::Version
138
- version: '5.15'
139
125
  description: |2
140
126
  Intrastructure test, useful for:
141
127
  (1) Sysadmin teachers to evaluate students remote machines.
@@ -156,7 +142,6 @@ extra_rdoc_files:
156
142
  - docs/changelog/v2.0.md
157
143
  - docs/changelog/v2.1.md
158
144
  - docs/changelog/v2.2.md
159
- - docs/changelog/v2.4.md
160
145
  - docs/changelog/version2.1.md
161
146
  - docs/commands/README.md
162
147
  - docs/commands/example_check.md
@@ -198,6 +183,7 @@ extra_rdoc_files:
198
183
  - docs/learn/11-moodle_id.md
199
184
  - docs/learn/12-get_vars.md
200
185
  - docs/learn/13-include.md
186
+ - docs/learn/14-alias.md
201
187
  - docs/learn/16-exit_codes.md
202
188
  - docs/learn/README.md
203
189
  - docs/learn/videos.md
@@ -210,7 +196,6 @@ files:
210
196
  - docs/changelog/v2.0.md
211
197
  - docs/changelog/v2.1.md
212
198
  - docs/changelog/v2.2.md
213
- - docs/changelog/v2.4.md
214
199
  - docs/changelog/version2.1.md
215
200
  - docs/commands/README.md
216
201
  - docs/commands/example_check.md
@@ -252,6 +237,7 @@ files:
252
237
  - docs/learn/11-moodle_id.md
253
238
  - docs/learn/12-get_vars.md
254
239
  - docs/learn/13-include.md
240
+ - docs/learn/14-alias.md
255
241
  - docs/learn/16-exit_codes.md
256
242
  - docs/learn/README.md
257
243
  - docs/learn/videos.md
@@ -342,14 +328,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
342
328
  requirements:
343
329
  - - ">="
344
330
  - !ruby/object:Gem::Version
345
- version: 2.5.9
331
+ version: 2.6.0
346
332
  required_rubygems_version: !ruby/object:Gem::Requirement
347
333
  requirements:
348
334
  - - ">="
349
335
  - !ruby/object:Gem::Version
350
336
  version: '0'
351
337
  requirements: []
352
- rubygems_version: 3.3.3
338
+ rubygems_version: 3.2.33
353
339
  signing_key:
354
340
  specification_version: 4
355
341
  summary: Teuton (Infrastructure test)
@@ -1,16 +0,0 @@
1
-
2
- ## [2.4.0]
3
-
4
- New features:
5
- - Add new DSL keyword: expect_last, expect_fisrt
6
- - New doc and example: learn-15-exit_codes
7
- - Remove os gem.
8
- - Change test output colors to green as use others test tools.
9
-
10
- Bug fixed:
11
- - All "expect*" keywords must require 2 arguments. The second is optional.
12
-
13
- Revise
14
- - Remove colors to log text
15
- - teuton readme: macros, getvars, expect_last, expect_first
16
- - Formatter: xml, csv, list, etc.