teuton 2.3.11 → 2.4.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 (61) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +44 -13
  3. data/docs/CHANGELOG.md +0 -13
  4. data/docs/changelog/todo.md +18 -0
  5. data/docs/changelog/v2.4.md +6 -2
  6. data/docs/dsl/execution/export.md +9 -15
  7. data/docs/dsl/execution/show.md +22 -7
  8. data/docs/ideas/{ideas.md → todo.md} +8 -16
  9. data/docs/learn/01-target.md +14 -43
  10. data/docs/learn/02-config.md +20 -37
  11. data/docs/learn/03-remote_hosts.md +20 -1
  12. data/docs/learn/04-new_test.md +4 -4
  13. data/docs/learn/05-use.md +3 -4
  14. data/docs/learn/06-debug.md +6 -9
  15. data/docs/learn/07-log.md +14 -14
  16. data/docs/learn/08-readme.md +4 -4
  17. data/docs/learn/13-include.md +13 -6
  18. data/docs/learn/14-alias.md +14 -8
  19. data/docs/learn/README.md +7 -7
  20. data/lib/teuton/case_manager/case/case.rb +1 -5
  21. data/lib/teuton/case_manager/case/dsl/expect.rb +2 -4
  22. data/lib/teuton/case_manager/case/dsl/log.rb +1 -2
  23. data/lib/teuton/case_manager/case/dsl/send.rb +4 -2
  24. data/lib/teuton/case_manager/case/play.rb +1 -2
  25. data/lib/teuton/case_manager/case/runner.rb +6 -7
  26. data/lib/teuton/case_manager/case_manager.rb +15 -11
  27. data/lib/teuton/case_manager/check_cases.rb +5 -7
  28. data/lib/teuton/case_manager/dsl.rb +1 -1
  29. data/lib/teuton/case_manager/export_manager.rb +13 -15
  30. data/lib/teuton/case_manager/hall_of_fame.rb +20 -16
  31. data/lib/teuton/case_manager/main.rb +1 -2
  32. data/lib/teuton/case_manager/report.rb +3 -3
  33. data/lib/teuton/report/formatter/base_formatter.rb +6 -7
  34. data/lib/teuton/report/formatter/{array_formatter.rb → default/array.rb} +44 -9
  35. data/lib/teuton/report/formatter/default/colored_text.rb +7 -0
  36. data/lib/teuton/report/formatter/default/html.rb +24 -0
  37. data/lib/teuton/report/formatter/default/json.rb +15 -0
  38. data/lib/teuton/report/formatter/{txt_formatter.rb → default/txt.rb} +4 -3
  39. data/lib/teuton/report/formatter/{xml_formatter.rb → default/xml.rb} +10 -4
  40. data/lib/teuton/report/formatter/default/yaml.rb +15 -0
  41. data/lib/teuton/report/formatter/formatter.rb +54 -0
  42. data/lib/teuton/report/formatter/moodle_csv_formatter.rb +4 -10
  43. data/lib/teuton/report/formatter/{resume_array_formatter.rb → resume/array.rb} +4 -7
  44. data/lib/teuton/report/formatter/resume/colored_text.rb +7 -0
  45. data/lib/teuton/report/formatter/{resume_html_formatter.rb → resume/html.rb} +7 -9
  46. data/lib/teuton/report/formatter/{resume_json_formatter.rb → resume/json.rb} +4 -4
  47. data/lib/teuton/report/formatter/{resume_txt_formatter.rb → resume/txt.rb} +4 -6
  48. data/lib/teuton/report/formatter/{resume_yaml_formatter.rb → resume/yaml.rb} +4 -3
  49. data/lib/teuton/report/report.rb +60 -43
  50. data/lib/teuton/report/show.rb +38 -24
  51. data/lib/teuton/version.rb +1 -1
  52. metadata +32 -33
  53. data/lib/teuton/case_manager/show.rb +0 -24
  54. data/lib/teuton/report/close.rb +0 -38
  55. data/lib/teuton/report/formatter/csv_formatter.rb +0 -25
  56. data/lib/teuton/report/formatter/formatter_factory.rb +0 -79
  57. data/lib/teuton/report/formatter/html_formatter.rb +0 -57
  58. data/lib/teuton/report/formatter/json_formatter.rb +0 -12
  59. data/lib/teuton/report/formatter/list_formatter.rb +0 -65
  60. data/lib/teuton/report/formatter/resume_list_formatter.rb +0 -62
  61. data/lib/teuton/report/formatter/yaml_formatter.rb +0 -15
@@ -0,0 +1,24 @@
1
+ require "erb"
2
+ require_relative "yaml"
3
+
4
+ class HTMLFormatter < YAMLFormatter
5
+ def initialize(report)
6
+ super(report)
7
+ @ext = "html"
8
+ @data = {}
9
+ basedir = File.join(File.dirname(__FILE__), "..", "..", "..")
10
+ filepath = File.join(basedir, "files", "template", "case.html")
11
+ @template = File.read(filepath)
12
+ end
13
+
14
+ def process(options = {})
15
+ build_data(options)
16
+ build_page
17
+ deinit
18
+ end
19
+
20
+ def build_page
21
+ render = ERB.new(@template)
22
+ w render.result(binding)
23
+ end
24
+ end
@@ -0,0 +1,15 @@
1
+ require "json/pure"
2
+ require_relative "array"
3
+
4
+ class JSONFormatter < ArrayFormatter
5
+ def initialize(report)
6
+ super(report)
7
+ @ext = "json"
8
+ end
9
+
10
+ def process(options = {})
11
+ build_data(options)
12
+ w @data.to_json # Write data into ouput file
13
+ deinit
14
+ end
15
+ end
@@ -1,19 +1,20 @@
1
1
  require "terminal-table"
2
2
  require "rainbow"
3
- require_relative "array_formatter"
3
+ require_relative "array"
4
4
 
5
5
  class TXTFormatter < ArrayFormatter
6
6
  def initialize(report, color = false)
7
7
  @color = color
8
8
  super(report)
9
+ @ext = "txt"
9
10
  @data = {}
10
11
  end
11
12
 
12
- def process
13
+ def process(options = {})
13
14
  rainbow_state = Rainbow.enabled
14
15
  Rainbow.enabled = @color
15
16
 
16
- build_data
17
+ build_data(options)
17
18
  process_config
18
19
  process_logs
19
20
  process_groups
@@ -1,9 +1,15 @@
1
- require_relative "base_formatter"
1
+ require_relative "../base_formatter"
2
+ require_relative "../../../version"
2
3
 
3
4
  class XMLFormatter < BaseFormatter
4
- def process
5
+ def initialize(report)
6
+ super(report)
7
+ @ext = "xml"
8
+ end
9
+
10
+ def process(options = {})
5
11
  tab = " "
6
- w "<teuton version='0.2'>\n"
12
+ w "<teuton version='#{Teuton::VERSION}'>\n"
7
13
  w "#{tab}<head>\n"
8
14
  @head.each { |key, value| w "#{tab * 2}<#{key}>#{value}</#{key}>\n" }
9
15
  w "#{tab}</head>\n"
@@ -22,7 +28,7 @@ class XMLFormatter < BaseFormatter
22
28
  w "#{tab * 3}<check>#{i[:check]}</check>\n"
23
29
  w "#{tab * 3}<weigth>#{i[:weight]}</weigth>\n"
24
30
  w "#{tab * 2}</line>\n"
25
- end
31
+ end
26
32
  w "#{tab}</lines>\n"
27
33
  w "#{tab}<tail>\n"
28
34
  @tail.each { |key, value| w "#{tab * 2}<#{key}>#{value}</#{key}>\n" }
@@ -0,0 +1,15 @@
1
+ require "yaml"
2
+ require_relative "array"
3
+
4
+ class YAMLFormatter < ArrayFormatter
5
+ def initialize(report)
6
+ super(report)
7
+ @ext = "yaml"
8
+ end
9
+
10
+ def process(options = {})
11
+ build_data(options)
12
+ w @data.to_yaml # Write data into ouput file
13
+ deinit
14
+ end
15
+ end
@@ -0,0 +1,54 @@
1
+ require "rainbow"
2
+ require_relative "default/colored_text"
3
+ require_relative "default/html"
4
+ require_relative "default/json"
5
+ require_relative "default/txt"
6
+ require_relative "default/xml"
7
+ require_relative "default/yaml"
8
+ require_relative "resume/colored_text"
9
+ require_relative "resume/html"
10
+ require_relative "resume/json"
11
+ require_relative "resume/txt"
12
+ require_relative "resume/yaml"
13
+ require_relative "moodle_csv_formatter"
14
+
15
+ module Formatter
16
+ def self.call(report, options, filename)
17
+ klass = get(options[:format])
18
+ if klass.nil?
19
+ puts Rainbow("[ERROR] Unkown format: #{options[:format]}").red
20
+ puts Rainbow(" export format: FORMAT").red
21
+ exit 1
22
+ end
23
+ formatter = klass.new(report)
24
+ formatter.init(filename)
25
+ formatter.process(options)
26
+ end
27
+
28
+ def self.get(format)
29
+ list = {
30
+ colored_text: ColoredTextFormatter,
31
+ html: HTMLFormatter,
32
+ json: JSONFormatter,
33
+ txt: TXTFormatter,
34
+ xml: XMLFormatter,
35
+ yaml: YAMLFormatter,
36
+ moodle_csv: MoodleCSVFormatter,
37
+ resume_html: ResumeHTMLFormatter,
38
+ resume_json: ResumeJSONFormatter,
39
+ resume_txt: ResumeTXTFormatter,
40
+ resume_xml: ResumeTXTFormatter, # TODO
41
+ resume_yaml: ResumeYAMLFormatter
42
+ }
43
+ list[format]
44
+ end
45
+
46
+ def self.hide_feedback(report)
47
+ report2 = report.clone
48
+ report2.groups.each do |group|
49
+ group.each do |item|
50
+ puts item.to_s
51
+ end
52
+ end
53
+ end
54
+ end
@@ -1,20 +1,14 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "resume_array_formatter"
1
+ require_relative "resume/array"
4
2
 
5
3
  class MoodleCSVFormatter < ResumeArrayFormatter
6
- ##
7
- # initialize instance
8
- # @param report (Report)
9
4
  def initialize(report)
10
5
  super(report)
6
+ @ext = "csv"
11
7
  @data = {}
12
8
  end
13
9
 
14
- ##
15
- # Process internal data and generates data with format
16
- def process
17
- build_data
10
+ def process(options = {})
11
+ build_data(options)
18
12
  process_cases
19
13
  deinit
20
14
  end
@@ -1,21 +1,18 @@
1
- # frozen_string_literal: true
1
+ require_relative "../base_formatter"
2
2
 
3
- require_relative "base_formatter"
4
-
5
- # ArrayFormatter class: format report data into an array
6
3
  class ResumeArrayFormatter < BaseFormatter
7
4
  def initialize(report)
8
5
  super(report)
9
6
  @data = {}
10
7
  end
11
8
 
12
- def process
13
- build_data
9
+ def process(options = {})
10
+ build_data(options)
14
11
  w @data.to_s # Write data into ouput file
15
12
  deinit
16
13
  end
17
14
 
18
- def build_data
15
+ def build_data(options)
19
16
  build_initial_data
20
17
  build_cases_data
21
18
  build_final_data
@@ -0,0 +1,7 @@
1
+ require_relative "txt"
2
+
3
+ class ResumeColoredTextFormatter < ResumeTXTFormatter
4
+ def initialize(report)
5
+ super(report, true)
6
+ end
7
+ end
@@ -1,21 +1,19 @@
1
- # frozen_string_literal: true
2
-
3
1
  require "erb"
4
- require_relative "resume_yaml_formatter"
5
- require_relative "../../application"
2
+ require_relative "yaml"
3
+ require_relative "../../../application"
6
4
 
7
- ##
8
- # HTMLFormatter class receive a [Report] and generates HTML output.
9
5
  class ResumeHTMLFormatter < ResumeYAMLFormatter
10
6
  def initialize(report)
11
7
  super(report)
8
+ @ext = "html"
12
9
  @data = {}
13
- filepath = File.join(File.dirname(__FILE__), "..", "..", "files", "template", "resume.html")
10
+ basedir = File.join(File.dirname(__FILE__), "..", "..", "..")
11
+ filepath = File.join(basedir, "files", "template", "resume.html")
14
12
  @template = File.read(filepath)
15
13
  end
16
14
 
17
- def process
18
- build_data
15
+ def process(options = {})
16
+ build_data(options)
19
17
  build_page
20
18
  deinit
21
19
  end
@@ -1,15 +1,15 @@
1
1
  require "json/pure"
2
- require_relative "resume_array_formatter"
2
+ require_relative "array"
3
3
 
4
- # JSONFormatter class
5
4
  class ResumeJSONFormatter < ResumeArrayFormatter
6
5
  def initialize(report)
7
6
  super(report)
7
+ @ext = "json"
8
8
  @data = {}
9
9
  end
10
10
 
11
- def process
12
- build_data
11
+ def process(options = {})
12
+ build_data(options)
13
13
  w @data.to_json # Write data into ouput file
14
14
  deinit
15
15
  end
@@ -1,22 +1,20 @@
1
- # frozen_string_literal: true
2
-
3
1
  require "terminal-table"
4
2
  require "rainbow"
5
- require_relative "resume_array_formatter"
3
+ require_relative "array"
6
4
 
7
- # TXTFormatter class
8
5
  class ResumeTXTFormatter < ResumeArrayFormatter
9
6
  def initialize(report, color = false)
10
7
  @color = color
11
8
  super(report)
9
+ @ext = "txt"
12
10
  @data = {}
13
11
  end
14
12
 
15
- def process
13
+ def process(options = {})
16
14
  rainbow_state = Rainbow.enabled
17
15
  Rainbow.enabled = @color
18
16
 
19
- build_data
17
+ build_data(options)
20
18
  process_config
21
19
  process_cases
22
20
  process_conn_errors
@@ -1,13 +1,14 @@
1
- require_relative "resume_array_formatter"
1
+ require_relative "array"
2
2
 
3
3
  class ResumeYAMLFormatter < ResumeArrayFormatter
4
4
  def initialize(report)
5
5
  super(report)
6
+ @ext = "yaml"
6
7
  @data = {}
7
8
  end
8
9
 
9
- def process
10
- build_data
10
+ def process(options = {})
11
+ build_data(options)
11
12
  w @data.to_yaml # Write data into ouput file
12
13
  deinit
13
14
  end
@@ -1,34 +1,14 @@
1
- # frozen_string_literal: true
2
-
3
- require "terminal-table"
4
1
  require_relative "../application"
5
- require_relative "formatter/formatter_factory"
6
- require_relative "show"
7
- require_relative "close"
2
+ require_relative "formatter/formatter"
8
3
 
9
- ##
10
- # This class maintain the results of every case, in a structured way.
11
- # * report/show.rb
12
- # * report/close.rb
13
4
  class Report
14
- # @!attribute id
15
- # @return [Integer] It is the [Case] number. Zero indicates Resume Report.
16
5
  attr_accessor :id, :filename, :output_dir
17
- # @!attribute head
18
- # @return [Hash] Report head information.
19
6
  attr_accessor :head
20
- # @!attribute lines
21
- # @return [Array] Report body information.
22
7
  attr_accessor :lines
23
- # @!attribute tail
24
- # @return [Hash] Report tail information.
25
8
  attr_accessor :tail
26
- # @!attribute format
27
- # @return [Symbol] Indicate export format.
28
- attr_reader :format
9
+ attr_accessor :format
29
10
  attr_reader :history
30
- ##
31
- # Class constructor
11
+
32
12
  def initialize(id = "00")
33
13
  @id = id
34
14
  @filename = "case-#{@id}"
@@ -42,30 +22,67 @@ class Report
42
22
  @history = ""
43
23
  end
44
24
 
45
- ##
46
- # Export [Case] data to specified format.
47
- # @param format [Symbol] Select export format. Default value is :txt.
48
- def export(format = :txt)
49
- @format = format
50
- filepath = File.join(@output_dir, @filename + "." \
51
- + FormatterFactory.ext(@format))
25
+ def clone
26
+ report = Report.new
27
+ attrs = %i[id filename output_dir head lines tail format]
28
+ attrs.each do |attr|
29
+ attr_set = "#{attr}=".to_sym
30
+ report.send(attr_set, send(attr).clone)
31
+ end
52
32
 
53
- formatter = FormatterFactory.get(self, @format, filepath)
54
- formatter.process
33
+ report
55
34
  end
56
35
 
57
- ##
58
- # Export resumed data from all Cases, to specified format.
59
- # @param format [Symbol] Select export format. Default value is :txt.
60
- def export_resume(format = :txt)
36
+ def export(options)
37
+ filepath = File.join(@output_dir, @filename)
38
+ Formatter.call(self, options, filepath)
39
+ end
40
+
41
+ def export_resume(options)
42
+ format = options[:format]
61
43
  @format = "resume_#{format}".to_sym
62
- filepath = File.join(@output_dir, @filename + "." \
63
- + FormatterFactory.ext(@format))
64
- formatter = FormatterFactory.get(self, @format, filepath)
65
- formatter.process
44
+ options[:format] = @format
45
+ filepath = File.join(@output_dir, @filename)
46
+ Formatter.call(self, options, filepath)
47
+
48
+ filepath = File.join(@output_dir, "moodle")
49
+ Formatter.call(self, {format: :moodle_csv}, filepath)
50
+ end
51
+
52
+ ##
53
+ # Calculate final values:
54
+ # * grade
55
+ # * max_weight
56
+ # * good_weight,d
57
+ # * fail_weight
58
+ # * fail_counter
59
+ def close
60
+ app = Application.instance
61
+ max = 0.0
62
+ good = 0.0
63
+ fail = 0.0
64
+ fail_counter = 0
65
+ @lines.each do |i|
66
+ next unless i.instance_of? Hash
67
+
68
+ max += i[:weight] if i[:weight].positive?
69
+ if i[:check]
70
+ good += i[:weight]
71
+ @history += app.letter[:good]
72
+ else
73
+ fail += i[:weight]
74
+ fail_counter += 1
75
+ @history += app.letter[:bad]
76
+ end
77
+ end
78
+ @tail[:max_weight] = max
79
+ @tail[:good_weight] = good
80
+ @tail[:fail_weight] = fail
81
+ @tail[:fail_counter] = fail_counter
66
82
 
67
- filepath = File.join(@output_dir, "moodle.csv")
68
- formatter = FormatterFactory.get(self, :moodle_csv, filepath)
69
- formatter.process
83
+ i = good.to_f / max
84
+ i = 0 if i.nan?
85
+ @tail[:grade] = (100.0 * i).round
86
+ @tail[:grade] = 0 if @tail[:unique_fault].positive?
70
87
  end
71
88
  end
@@ -1,48 +1,62 @@
1
- # frozen_string_literal: true
1
+ require "rainbow"
2
+ require_relative "../application"
2
3
 
3
- # Show methods for Report class.
4
- class Report
5
- ##
6
- # Display [Report] information on screen
7
- def show
8
- show_initial_configurations
9
- if @filename.to_s.include? "resume"
4
+ class ShowReport
5
+ def initialize(report)
6
+ @report = report
7
+ end
8
+
9
+ def call(verbose)
10
+ return if Application.instance.quiet?
11
+
12
+ show_initial_configurations if verbose > 2
13
+ if filename.to_s.include? "resume"
10
14
  show_resume
11
15
  else
12
16
  show_targets_history
13
17
  end
14
- show_final_values
15
- show_hall_of_fame
18
+ show_final_values if verbose > 1
19
+ show_hall_of_fame if verbose > 0
16
20
  end
17
21
 
18
22
  private
19
23
 
20
- ##
21
- # Display initial configurations
24
+ def filename
25
+ @report.filename
26
+ end
27
+
28
+ def head
29
+ @report.head
30
+ end
31
+
32
+ def lines
33
+ @report.lines
34
+ end
35
+
36
+ def tail
37
+ @report.tail
38
+ end
39
+
22
40
  def show_initial_configurations
23
41
  puts Rainbow("INITIAL CONFIGURATIONS").bright
24
42
  my_screen_table = Terminal::Table.new do |st|
25
- @head.each do |key, value|
43
+ head.each do |key, value|
26
44
  st.add_row [key.to_s, trim(value)]
27
45
  end
28
46
  end
29
47
  puts "#{my_screen_table}\n\n"
30
48
  end
31
49
 
32
- ##
33
- # Display resume
34
50
  def show_resume
35
51
  show_case_list
36
52
  show_conn_status
37
53
  end
38
54
 
39
- ##
40
- # Display case list
41
55
  def show_case_list
42
56
  puts Rainbow("CASE RESULTS").bright
43
57
  my_screen_table = Terminal::Table.new do |st|
44
58
  st.add_row %w[CASE MEMBERS GRADE STATE]
45
- @lines.each do |line|
59
+ lines.each do |line|
46
60
  st.add_row [line[:id], line[:members], line[:grade], line[:letter]]
47
61
  end
48
62
  end
@@ -51,13 +65,13 @@ class Report
51
65
 
52
66
  def show_conn_status
53
67
  errors = 0
54
- @lines.each { |line| errors += line[:conn_status].size }
68
+ lines.each { |line| errors += line[:conn_status].size }
55
69
  return if errors.zero?
56
70
 
57
71
  puts Rainbow("CONN ERRORS").bright
58
72
  my_screen_table = Terminal::Table.new do |st|
59
73
  st.add_row %w[CASE MEMBERS HOST ERROR]
60
- @lines.each do |line|
74
+ lines.each do |line|
61
75
  line[:conn_status].each_pair do |host, error|
62
76
  st.add_row [line[:id], line[:members], host, Rainbow(error).red.bright]
63
77
  end
@@ -69,10 +83,10 @@ class Report
69
83
  def show_targets_history
70
84
  tab = " "
71
85
  puts Rainbow("CASE RESULTS").bright
72
- if @lines.size == 1
73
- puts @lines[0]
86
+ if lines.size == 1
87
+ puts lines[0]
74
88
  else
75
- @lines.each do |i|
89
+ lines.each do |i|
76
90
  if i.class.to_s == "Hash"
77
91
  value = 0.0
78
92
  value = i[:weight] if i[:check]
@@ -91,7 +105,7 @@ class Report
91
105
  def show_final_values
92
106
  puts Rainbow("FINAL VALUES").bright
93
107
  my_screen_table = Terminal::Table.new do |st|
94
- @tail.each do |key, value|
108
+ tail.each do |key, value|
95
109
  st.add_row [key.to_s, value.to_s]
96
110
  end
97
111
  end
@@ -1,5 +1,5 @@
1
1
  module Teuton
2
- VERSION = "2.3.11"
2
+ VERSION = "2.4.0"
3
3
  APPNAME = "teuton"
4
4
  GEMNAME = "teuton"
5
5
  DOCKERNAME = "dvarrui/#{GEMNAME}"