liri 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b30998dd0b5a8393fd498a7e860a9d7f3a3c61b6b55c7c06d832aa83a5104482
4
- data.tar.gz: 41a2b382eb25a400529b236ddba38e81c1ea01cf81bc184e0b8615e66f33657e
3
+ metadata.gz: d28f136456100f5326e4434296950754e7ec7246504de6152ae0941e3955dc35
4
+ data.tar.gz: b91ee07874e27b8dce462a593c8cde523da893355fd1fcbf12a362e0903af306
5
5
  SHA512:
6
- metadata.gz: e4d65b549bc22186954fad36d3d96715335e7513f5aab7e9f429afc657f9945da0be95c20ccb320ca6c213b54bb1e96d58caa1136ae056ba477583c198988cdb
7
- data.tar.gz: d421828fefa0c2ef94eaccb857e7095d35d27ffadfafcebe817134cfb4b0e9f93fd4333daf834e46ef03e289f95af2218dbbd2aae194dcca7c25bb0bdc587b75
6
+ metadata.gz: b42a37864b77d875ae48576a54199f244326d2b2132bcbebc35412f19a805634ac65aca61d3dd172c40c6c21eeea21059b97288af979abb65aed1d4c87ee69a1
7
+ data.tar.gz: 575c5765c9aa4a2f558a6ee2a33b1559babb85c3ca5849aaa32f93ea65f98b647893683680a96658f2947baebdf2ff86de015235e2b94feba4b1788b89983491
data/.gitignore CHANGED
@@ -5,9 +5,9 @@
5
5
  /tmp
6
6
 
7
7
  *.log
8
- *.gem
9
8
  .rspec_status
10
9
 
11
10
  *.odt#
12
11
 
13
- spec_credentials.yml
12
+ spec_credentials.yml
13
+ *.gem
data/Gemfile.lock CHANGED
@@ -1,15 +1,15 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- liri (0.3.1)
4
+ liri (0.4.0)
5
+ chronic_duration (~> 0)
5
6
  commander (~> 4)
6
7
  highline (~> 2)
7
- i18n (~> 1)
8
8
  net-scp (~> 3)
9
9
  ruby-progressbar (~> 1)
10
10
  rubyzip (~> 2)
11
11
  terminal-table (~> 3)
12
- to_duration (~> 1)
12
+ tty-progressbar (~> 0)
13
13
 
14
14
  GEM
15
15
  remote: https://rubygems.org/
@@ -21,12 +21,13 @@ GEM
21
21
  descendants_tracker (~> 0.0.4)
22
22
  ice_nine (~> 0.11.0)
23
23
  thread_safe (~> 0.3, >= 0.3.1)
24
+ chronic_duration (0.10.6)
25
+ numerizer (~> 0.1.1)
24
26
  coderay (1.1.3)
25
27
  coercible (1.0.0)
26
28
  descendants_tracker (~> 0.0.1)
27
29
  commander (4.6.0)
28
30
  highline (~> 2.0.0)
29
- concurrent-ruby (1.1.9)
30
31
  descendants_tracker (0.0.4)
31
32
  thread_safe (~> 0.3, >= 0.3.1)
32
33
  diff-lcs (1.4.4)
@@ -43,8 +44,6 @@ GEM
43
44
  ruby_parser (~> 3.1, > 3.1.0)
44
45
  sexp_processor (~> 4.8)
45
46
  highline (2.0.3)
46
- i18n (1.10.0)
47
- concurrent-ruby (~> 1.0)
48
47
  ice_nine (0.11.2)
49
48
  kwalify (0.7.2)
50
49
  launchy (2.5.0)
@@ -52,6 +51,7 @@ GEM
52
51
  net-scp (3.0.0)
53
52
  net-ssh (>= 2.6.5, < 7.0.0)
54
53
  net-ssh (6.1.0)
54
+ numerizer (0.1.1)
55
55
  parallel (1.22.1)
56
56
  parser (3.1.2.0)
57
57
  ast (~> 2.4.1)
@@ -111,10 +111,17 @@ GEM
111
111
  simplecov_json_formatter (~> 0.1)
112
112
  simplecov-html (0.12.3)
113
113
  simplecov_json_formatter (0.1.4)
114
+ strings-ansi (0.2.0)
114
115
  terminal-table (3.0.2)
115
116
  unicode-display_width (>= 1.1.1, < 3)
116
117
  thread_safe (0.3.6)
117
- to_duration (1.2.1)
118
+ tty-cursor (0.7.1)
119
+ tty-progressbar (0.18.2)
120
+ strings-ansi (~> 0.2)
121
+ tty-cursor (~> 0.7)
122
+ tty-screen (~> 0.8)
123
+ unicode-display_width (>= 1.6, < 3.0)
124
+ tty-screen (0.8.1)
118
125
  tty-which (0.4.2)
119
126
  unicode-display_width (2.1.0)
120
127
  virtus (1.0.5)
data/Rakefile CHANGED
@@ -47,6 +47,11 @@ task :install => [:build, :update_agent_installer, :compress_agent_installer] do
47
47
  system "gem install " + Liri::NAME + "-" + Liri::VERSION + ".gem"
48
48
  end
49
49
 
50
+ # Borra la gema despues de llamar a la tarea install
51
+ Rake::Task[:install].enhance do
52
+ Rake::Task[:clean].invoke
53
+ end
54
+
50
55
  # Publica la gema después de compilar.
51
56
  # > rake publish
52
57
  task :publish => :build do
data/lib/agent/agent.rb CHANGED
@@ -16,39 +16,39 @@ module Liri
16
16
  agent_folder_path = setup_manager.agent_folder_path
17
17
 
18
18
  Liri.set_logger(setup_manager.logs_folder_path, 'liriagent.log')
19
- Liri.logger.info("Agent process started")
19
+ Liri.logger.info("Agent process started", true)
20
20
  Liri.logger.info("Press Ctrl + c to finish Agent process manually\n", true)
21
21
 
22
- decompressed_source_code_path = File.join(agent_folder_path, '/', Common::SourceCode::DECOMPRESSED_FOLDER_NAME)
23
- source_code = Common::SourceCode.new(decompressed_source_code_path, agent_folder_path, Liri.compression_class, Liri.unit_test_class)
24
- runner = Agent::Runner.new(Liri.unit_test_class, source_code.decompressed_file_folder_path)
25
- tests_result = Common::TestsResult.new(agent_folder_path)
26
- agent = Agent.new(Liri.udp_port, Liri.tcp_port, source_code, runner, tests_result, agent_folder_path)
22
+ agent = Agent.new(Liri.udp_port, Liri.tcp_port, agent_folder_path)
27
23
  threads = []
28
24
  threads << agent.start_server_socket_to_process_manager_connection_request # Esperar y procesar la petición de conexión del Manager
29
25
 
30
- Liri.init_exit(stop, threads, 'Agent')
31
- Liri.logger.info("Agent process finished")
32
- rescue SignalException => e
33
- Liri.logger.info("Exception(#{e}) Agent process finished manually")
34
- Liri.kill(threads)
26
+ Liri.init_exit(stop, threads)
27
+ rescue SignalException
28
+ Liri.logger.info("Agent process finished manually", true)
29
+ rescue InxiCommandNotFoundError => e
30
+ Liri.logger.error("Exception(#{e}) Please, install inxi in your operating system", true)
31
+ ensure
32
+ # Siempre se ejecutan estos comandos, haya o no excepción
33
+ Liri.kill(threads) if threads && threads.any?
34
+ Liri.logger.info("Agent process finished", true)
35
35
  end
36
36
  end
37
37
 
38
- def initialize(udp_port, tcp_port, source_code, runner, tests_result, agent_folder_path)
38
+ def initialize(udp_port, tcp_port, agent_folder_path)
39
39
  @udp_port = udp_port
40
40
  @udp_socket = UDPSocket.new
41
41
  @tcp_port = tcp_port
42
42
 
43
- @source_code = source_code
44
- @runner = runner
45
- @tests_result = tests_result
46
-
47
43
  @all_tests = {}
48
44
 
49
45
  @managers = {}
50
46
 
51
47
  @agent_folder_path = agent_folder_path
48
+
49
+ @processing = true
50
+
51
+ @hardware_specs = hardware_specs
52
52
  end
53
53
 
54
54
  # Inicia un servidor udp que se mantiene en espera de la primera petición de conexión del Manager
@@ -60,15 +60,17 @@ module Liri
60
60
  begin
61
61
  @udp_socket.bind('0.0.0.0', @udp_port)
62
62
  rescue Errno::EADDRINUSE => e
63
- Liri.logger.error("Exception(#{e}) Busy UDP port #{@udp_port}")
63
+ Liri.logger.error("Exception(#{e}) Busy UDP port #{@udp_port}", true)
64
64
  Thread.exit
65
65
  end
66
66
  Liri.logger.info("Waiting managers request in UDP port #{@udp_port}")
67
67
 
68
- loop do
68
+ while @processing
69
69
  @manager_request = @udp_socket.recvfrom(1024)
70
70
  manager_ip_address = @manager_request.last.last
71
71
  manager_data = get_manager_data(JSON.parse(@manager_request.first))
72
+ # TODO: El cliente TCP debería inicicarse en otro hilo, de este modo se tendrá un cliente TCP para cada Manager
73
+ # y se evita que un mismo cliente procese la ejecución de varios Manager
72
74
  process_manager_connection_request(manager_ip_address, manager_data)
73
75
  end
74
76
  end
@@ -78,7 +80,13 @@ module Liri
78
80
  def start_client_socket_to_process_tests(manager_ip_address, manager_data)
79
81
  tcp_socket = TCPSocket.open(manager_ip_address, @tcp_port)
80
82
  agent_ip_address = tcp_socket.addr[2]
81
- tcp_socket.puts({ msg: 'get_source_code', hardware_model: get_hardware_model }.to_json)
83
+ tcp_socket.puts({ msg: 'get_source_code', hardware_specs: @hardware_specs }.to_json)
84
+
85
+ # Las siguientes variables se usan para guardar momentaneamente los resultados mientras se hace un chequeo de que
86
+ # el Manager siga ejecutandose o que ya no haya procesado los mismos tests ya ejecutados por otro agente
87
+ tests_result_file_name = ""
88
+ tests_result_file_path = ""
89
+ tests_result = {}
82
90
 
83
91
  while line = tcp_socket.gets
84
92
  tcp_socket_data = JSON.parse(line.chop)
@@ -89,6 +97,7 @@ module Liri
89
97
  end
90
98
 
91
99
  if msg == 'proceed_get_source_code'
100
+ init_work_folders(manager_ip_address)
92
101
  result = get_source_code(manager_ip_address, manager_data)
93
102
  tcp_socket.puts({ msg: result }.to_json)
94
103
  end
@@ -96,32 +105,35 @@ module Liri
96
105
  if msg == 'process_tests'
97
106
  tests_batch = tcp_socket_data
98
107
  tests = get_tests(tests_batch, manager_ip_address)
99
- raw_tests_result = @runner.run_tests(tests)
100
- tests_batch_number = tests_batch['tests_batch_number']
101
- tests_result_file_name = @tests_result.build_file_name(agent_ip_address, tests_batch_number)
102
- tests_result_file_path = @tests_result.save(tests_result_file_name, raw_tests_result)
103
108
 
109
+ compressed_file_folder_path = @managers[manager_ip_address][:compressed_file_folder_path]
110
+ decompressed_file_folder_path = @managers[manager_ip_address][:decompressed_file_folder_path]
111
+
112
+ runner = Agent::Runner.new(Liri.unit_test_class, decompressed_file_folder_path)
113
+ raw_tests_result = runner.run_tests(tests)
114
+ batch_num = tests_batch['batch_num']
115
+ tests_result = Common::TestsResult.new(compressed_file_folder_path)
116
+ tests_result_file_name = tests_result.build_file_name(agent_ip_address, batch_num)
117
+ tests_result_file_path = tests_result.save(tests_result_file_name, raw_tests_result)
118
+ # TODO No se debería enviar el resultado si otro agente ya lo procesó, porque osinó reemplazaría el archivo de resultados
119
+ # ya procesado. ACTUALIZACION: Puede que esto ya se haya arreglado
104
120
  send_tests_results_file(manager_ip_address, manager_data, tests_result_file_path)
105
- result = { msg: 'processed_tests', tests_batch_number: tests_batch_number, tests_result_file_name: tests_result_file_name, tests_batch_keys_size: tests_batch['tests_batch_keys'].size}
106
- tcp_socket.puts(result.to_json) # Envía el número de lote y el nombre del archivo de resultados.
121
+ tests_result = { msg: 'processed_tests', batch_num: batch_num, tests_result_file_name: tests_result_file_name}
122
+ tcp_socket.puts(tests_result.to_json) # Envía el número de lote y el nombre del archivo de resultados.
107
123
  end
108
124
  end
109
125
 
110
- Liri.logger.info("Finish connection with Manager #{manager_ip_address} in TCP port: #{@tcp_port}")
111
126
  tcp_socket.close
112
- Liri.clean_folder_content(@agent_folder_path)
113
-
114
127
  unregister_manager(manager_ip_address)
115
128
  rescue Errno::EADDRINUSE => e
116
129
  Liri.logger.error("Exception(#{e}) Busy UDP port #{@udp_port}")
130
+ @processing = false
117
131
  rescue Errno::ECONNRESET => e
118
132
  tcp_socket.close
119
- Liri.logger.error("Exception(#{e}) Closed connection in TCP port #{@tcp_port}")
120
- Liri.logger.info("Finish connection with Manager #{manager_ip_address} in TCP port: #{@tcp_port}")
133
+ Liri.logger.error("Exception(#{e}) Closed connection in TCP port #{@tcp_port}", true)
121
134
  unregister_manager(manager_ip_address)
122
135
  rescue Errno::ECONNREFUSED => e
123
- Liri.logger.error("Exception(#{e}) Rejected connection in TCP port #{@tcp_port}")
124
- Liri.logger.info("Finish connection with Manager #{manager_ip_address} in TCP port: #{@tcp_port}")
136
+ Liri.logger.error("Exception(#{e}) Rejected connection in TCP port #{@tcp_port}", true)
125
137
  unregister_manager(manager_ip_address)
126
138
  end
127
139
 
@@ -140,25 +152,29 @@ module Liri
140
152
 
141
153
  def get_source_code(manager_ip_address, manager_data)
142
154
  puts ''
155
+ compressed_file_folder_path = @managers[manager_ip_address][:compressed_file_folder_path]
156
+ decompressed_file_folder_path = @managers[manager_ip_address][:decompressed_file_folder_path]
157
+ source_code = Liri::Common::SourceCode.new(decompressed_file_folder_path,compressed_file_folder_path, "", Liri.compression_class, Liri.unit_test_class)
158
+
143
159
  Liri::Common::Benchmarking.start(start_msg: "Getting source code. Wait... ", stdout: true) do
144
160
  puts ''
145
161
  Net::SCP.start(manager_ip_address, manager_data.user, password: manager_data.password) do |scp|
146
- scp.download!(manager_data.compressed_file_path, @source_code.compressed_file_folder_path)
162
+ scp.download!(manager_data.compressed_file_path, compressed_file_folder_path)
147
163
  end
148
164
  end
149
165
  puts ''
150
166
 
151
167
  downloaded_file_name = manager_data.compressed_file_path.split('/').last
152
- downloaded_file_path = File.join(@source_code.compressed_file_folder_path, '/', downloaded_file_name)
168
+ downloaded_file_path = File.join(compressed_file_folder_path, '/', downloaded_file_name)
153
169
 
154
170
  Liri::Common::Benchmarking.start(start_msg: "Uncompressing source code. Wait... ", stdout: true) do
155
- @source_code.decompress_file(downloaded_file_path)
156
- @all_tests = @source_code.all_tests
171
+ source_code.decompress_file(downloaded_file_path)
172
+ @all_tests = source_code.all_tests
157
173
  end
158
174
  puts ''
159
175
 
160
176
  # Se cambia temporalmente la carpeta de trabajo a la carpeta de código fuente descomprimida
161
- Dir.chdir(@source_code.decompressed_file_folder_path) do
177
+ Dir.chdir(decompressed_file_folder_path) do
162
178
  # Se borra el directorio .git para evitar el siguiente error al ejecutar las pruebas: fatal: not a git repository (or any of the parent directories): .git
163
179
  # Una mejor alternativa es no traer siquiera esa carpeta junto al código fuente excluyendo la carpeta .git al comprimir el código fuente.
164
180
  # Por cuestiones de tiempo se procede a borrar la carpeta .git por ahora, aunque al parecer el error mostrado no afecta la ejecución del Agent
@@ -235,9 +251,8 @@ module Liri
235
251
  tests_keys.map { |test_key| @all_tests[test_key] }
236
252
  end
237
253
 
238
- def get_hardware_model
239
- hardware_model = %x|cat /sys/devices/virtual/dmi/id/product_name|
240
- hardware_model.strip[0..14] # remove \n from string
254
+ def hardware_specs
255
+ "#{Common::Hardware.cpu} #{Common::Hardware.memory}GB"
241
256
  end
242
257
 
243
258
  def registered_manager?(manager_ip_address)
@@ -245,11 +260,29 @@ module Liri
245
260
  end
246
261
 
247
262
  def register_manager(manager_ip_address)
248
- @managers[manager_ip_address] = manager_ip_address
263
+ unless registered_manager?(manager_ip_address)
264
+ @managers[manager_ip_address] = {
265
+ manager_ip_address: @managers[manager_ip_address]
266
+ }
267
+ end
249
268
  end
250
269
 
251
270
  def unregister_manager(manager_ip_address)
252
271
  @managers.remove!(manager_ip_address)
272
+ Liri.logger.info("Finish connection with Manager #{manager_ip_address} in TCP port: #{@tcp_port}")
273
+ end
274
+
275
+ def init_work_folders(manager_ip_address)
276
+ return if @managers[manager_ip_address][:compressed_file_folder_path]
277
+
278
+ compressed_file_folder_path = File.join(@agent_folder_path, '/', "#{DateTime.now.strftime("%d_%m_%y_%H_%M_%S")}_work")
279
+ Dir.mkdir(compressed_file_folder_path) unless Dir.exist?(compressed_file_folder_path)
280
+ decompressed_file_folder_path = File.join(compressed_file_folder_path, '/', Common::SourceCode::DECOMPRESSED_FOLDER_NAME)
281
+
282
+ @managers[manager_ip_address] = {
283
+ compressed_file_folder_path: compressed_file_folder_path,
284
+ decompressed_file_folder_path: decompressed_file_folder_path
285
+ }
253
286
  end
254
287
  end
255
288
  end
data/lib/all_libraries.rb CHANGED
@@ -19,9 +19,12 @@ require 'agent/agent'
19
19
  require 'agent/runner'
20
20
 
21
21
  require 'common/benchmarking'
22
+ require 'common/duration'
23
+ require 'common/hardware'
22
24
  require 'common/log'
23
25
  require 'common/manager_data'
24
26
  require 'common/progressbar'
27
+ require 'common/tty_progressbar'
25
28
  require 'common/setup'
26
29
  require 'common/source_code'
27
30
  require 'common/compressor/zip'
@@ -4,13 +4,7 @@
4
4
  #
5
5
  # @author Rodrigo Fernández
6
6
 
7
- require 'benchmark'
8
- require 'i18n' # requerimiento de la gema to_duration
9
- require 'to_duration'
10
-
11
- # Se configura la ubicación del archivo de internacionalización de la gema to_duration
12
- I18n.load_path << Dir["#{File.join(File.dirname(File.dirname(File.dirname(__FILE__))), 'config/locales')}/*.yml"]
13
- I18n.default_locale = :es
7
+ require "benchmark"
14
8
 
15
9
  module Liri
16
10
  module Common
@@ -23,7 +17,7 @@ module Liri
23
17
 
24
18
  seconds = Benchmark.realtime(&block)
25
19
 
26
- Liri.logger.info("#{end_msg}#{seconds.to_duration}", stdout)
20
+ Liri.logger.info("#{end_msg}#{Duration.humanize(seconds, times_round: Liri.times_round, times_round_type: Liri.times_round_type)}", stdout)
27
21
  seconds
28
22
  end
29
23
  end
@@ -8,15 +8,16 @@ module Liri
8
8
  module Compressor
9
9
  class Zip
10
10
  # Inicializa la carpeta a comprimir y la ubicación en donde se guardará el archivo comprimido
11
- def initialize(input_dir, output_file)
11
+ def initialize(input_dir, output_file, ignored_folders)
12
12
  @input_dir = input_dir
13
13
  @output_file = output_file
14
+ @ignored_folders = ignored_folders.split(",")
14
15
  end
15
16
 
16
17
  # Comprime el directorio de entrada @input_dir en un archivo con extensión zip.
17
18
  def compress
18
19
  clear_output_file
19
- entries = Dir.entries(@input_dir) - %w[. ..]
20
+ entries = Dir.entries(@input_dir) - (%w[. ..] + @ignored_folders)
20
21
 
21
22
  ::Zip::File.open(@output_file, ::Zip::File::CREATE) do |zipfile|
22
23
  write_entries(entries, '', zipfile)
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ # = duration.rb
4
+ #
5
+ # @author Rodrigo Fernández
6
+
7
+ require "chronic_duration"
8
+
9
+ module Liri
10
+ module Common
11
+ # == Módulo Duration
12
+ # Este módulo se encarga de convertir el tiempo en segundos a un formato legible
13
+ module Duration
14
+ class << self
15
+ def humanize(time, times_round:, times_round_type:)
16
+ # El time puede ser un BigDecimal y aunque se redondee puede responder con un formato 0.744e2, por eso
17
+ # es imporantes hacerle un to_f para convertirlo a 74.4 antes de proceder a humanizarlo
18
+ time = time.to_f
19
+ case times_round_type
20
+ when :floor then ChronicDuration.output(time.truncate(times_round), format: :short, keep_zero: true)
21
+ when :roof then ChronicDuration.output(time.round(times_round), format: :short, keep_zero: true)
22
+ else raise "Invalid times_round_type. Expected: floor or roof. Received: #{times_round_type}"
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,29 @@
1
+ # = hardware.rb
2
+ #
3
+ # @author Rodrigo Fernández
4
+
5
+ module Liri
6
+ module Common
7
+ # == Módulo Hardware
8
+ # Este módulo se encarga de obtener información del hardware
9
+ module Hardware
10
+ class << self
11
+ def cpu
12
+ cpu = %x|inxi -C|
13
+ cpu = cpu.to_s.match(/model(.+)bits/)
14
+ cpu = cpu[1].gsub("12", "")
15
+ cpu = cpu.gsub(":", "")
16
+ cpu.strip
17
+ rescue Errno::ENOENT
18
+ raise InxiCommandNotFoundError.new
19
+ end
20
+
21
+ def memory
22
+ memory = %x|grep MemTotal /proc/meminfo|
23
+ memory = memory.to_s.match(/(\d+)/)
24
+ (memory[1].to_i * 0.000001).to_i
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
data/lib/common/log.rb CHANGED
@@ -14,6 +14,8 @@ module Liri
14
14
  FOLDER_PATH = File.join(Dir.pwd, "/#{FOLDER_NAME}")
15
15
  FILE_NAME = 'liri.log'
16
16
 
17
+ attr_reader :folder_path
18
+
17
19
  def initialize(shift_age, folder_path:, file_name:, stdout: true)
18
20
  @stdout = stdout
19
21
  @shift_age = shift_age
@@ -27,37 +29,37 @@ module Liri
27
29
  end
28
30
 
29
31
  def debug(text, stdout = false)
30
- puts(text) if stdout
32
+ puts(ColorizeText.debug(text)) if stdout
31
33
  @stdout_logger.debug(text) if @stdout
32
34
  @file_logger.debug(text)
33
35
  end
34
36
 
35
37
  def info(text, stdout = false)
36
- puts(text) if stdout
38
+ puts(ColorizeText.default(text)) if stdout
37
39
  @stdout_logger.info(text) if @stdout
38
40
  @file_logger.info(text)
39
41
  end
40
42
 
41
43
  def warn(text, stdout = false)
42
- puts(text) if stdout
44
+ puts(ColorizeText.warn(text)) if stdout
43
45
  @stdout_logger.warn(text) if @stdout
44
46
  @file_logger.warn(text)
45
47
  end
46
48
 
47
49
  def error(text, stdout = false)
48
- puts(text) if stdout
50
+ puts(ColorizeText.error(text)) if stdout
49
51
  @stdout_logger.error(text) if @stdout
50
52
  @file_logger.error(text)
51
53
  end
52
54
 
53
55
  def fatal(text, stdout = false)
54
- puts(text) if stdout
56
+ puts(ColorizeText.fatal(text)) if stdout
55
57
  @stdout_logger.fatal(text) if @stdout
56
58
  @file_logger.fatal(text)
57
59
  end
58
60
 
59
61
  def unknown(text, stdout = false)
60
- puts(text) if stdout
62
+ puts(ColorizeText.unknown(text)) if stdout
61
63
  @stdout_logger.unknown(text) if @stdout
62
64
  @file_logger.unknown(text)
63
65
  end
@@ -65,12 +67,12 @@ module Liri
65
67
  private
66
68
  def create_stdout_logger
67
69
  @stdout_logger = Logger.new(STDOUT, @shift_age)
68
- @stdout_logger.formatter = Liri::Common::LogFormatter.colorize(Liri.setup.log.stdout.colorize)
70
+ @stdout_logger.formatter = Liri::Common::LogFormatter.colorize(Liri.setup.general.log.stdout.colorize)
69
71
  end
70
72
 
71
73
  def create_file_logger
72
74
  @file_logger = Logger.new(@file_path, @shift_age)
73
- @file_logger.formatter = Liri::Common::LogFormatter.colorize(Liri.setup.log.file.colorize)
75
+ @file_logger.formatter = Liri::Common::LogFormatter.colorize(Liri.setup.general.log.file.colorize)
74
76
  end
75
77
 
76
78
  def create_log_folder
@@ -78,18 +80,58 @@ module Liri
78
80
  end
79
81
  end
80
82
 
83
+ class ColorizeText
84
+ COLORS = {
85
+ DEBUG: '0;36', # cyan
86
+ ERROR: '0;31', # red
87
+ INFO: '0;32', # green
88
+ WARN: '0;33', # orange
89
+ FATAL: '0;35', # pink
90
+ ANY: '0;36', # cyan
91
+ DEFAULT: '1;0' # white
92
+ }
93
+
94
+ class << self
95
+ def default(text)
96
+ colorize(text, :DEFAULT)
97
+ end
98
+
99
+ def debug(text)
100
+ colorize(text, :DEBUG)
101
+ end
102
+
103
+ def info(text)
104
+ colorize(text, :INFO)
105
+ end
106
+
107
+ def warn(text)
108
+ colorize(text, :WARN)
109
+ end
110
+
111
+ def error(text)
112
+ colorize(text, :ERROR)
113
+ end
114
+
115
+ def fatal(text)
116
+ colorize(text, :FATAL)
117
+ end
118
+
119
+ def unknown(text)
120
+ colorize(text, :ANY)
121
+ end
122
+
123
+ private
124
+
125
+ def colorize(text, color)
126
+ "\e[#{COLORS[color]}m#{text}\e[0m"
127
+ end
128
+ end
129
+ end
130
+
81
131
  class LogFormatter
82
132
  DATETIME_FORMAT = "%d-%m-%Y %H:%M"
83
133
 
84
- SEVERITY_COLORS = {
85
- DEBUG: '0;36', # cyan
86
- ERROR: '0;31', # red
87
- INFO: '0;32', # green
88
- WARN: '0;33', # orange
89
- FATAL: '0;35', # pink
90
- ANY: '0;36', # cyan
91
- DEFAULT: '1;0' # white
92
- }
134
+ SEVERITY_COLORS = ColorizeText::COLORS
93
135
 
94
136
  class << self
95
137
  def colorize(type)
@@ -12,16 +12,16 @@ module Liri
12
12
  module Progressbar
13
13
  class << self
14
14
  def start(params = {})
15
- @compressing = true
15
+ @progressing = true
16
16
  progressbar = ProgressBar.create(params)
17
17
  Thread.new do
18
- while @compressing
18
+ while @progressing
19
19
  progressbar.increment
20
20
  sleep(0.1)
21
21
  end
22
22
  end
23
23
  yield
24
- @compressing = false
24
+ @progressing = false
25
25
  end
26
26
  end
27
27
  end
@@ -8,7 +8,7 @@ module Liri
8
8
  DECOMPRESSED_FOLDER_NAME = 'decompressed'
9
9
  attr_reader :folder_path, :compressed_file_folder_path, :compressed_file_path, :decompressed_file_folder_path
10
10
 
11
- def initialize(folder_path, compressed_file_folder_path, compression_class, unit_test_class)
11
+ def initialize(folder_path, compressed_file_folder_path, ignored_folders, compression_class, unit_test_class)
12
12
  @folder_path = folder_path
13
13
  @folder_name = @folder_path.split('/').last
14
14
  @compressed_file_folder_path = compressed_file_folder_path
@@ -17,7 +17,7 @@ module Liri
17
17
  # Inicializa un compresor acorde a compression_class, la siguiente línea en realidad hace lo siguiente:
18
18
  # @compressor = Liri::Common::Compressor::Zip.new(input_dir, output_file)
19
19
  # compression_class en este caso es Zip pero podría ser otro si existiera la implementación, por ejemplo Rar
20
- @compressor = Object.const_get(compression_class).new(@folder_path, @compressed_file_path)
20
+ @compressor = Object.const_get(compression_class).new(@folder_path, @compressed_file_path, ignored_folders)
21
21
  # Inicializa un ejecutor de pruebas acorde a unit_test_class, la siguiente línea en realidad hace lo siguiente:
22
22
  # @unit_test = Liri::Common::UnitTest::Rspec.new(source_code_folder_path)
23
23
  # unit_test_class en este caso es Rspec pero podría ser otro si existiera la implementación, por ejemplo UnitTest