liri 0.1.0 → 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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -2
  3. data/.simplecov +8 -0
  4. data/Gemfile +4 -1
  5. data/Gemfile.lock +27 -15
  6. data/bash_script_examples.sh +1 -0
  7. data/dummy-app/.gitignore +12 -0
  8. data/dummy-app/.rspec +3 -0
  9. data/dummy-app/.ruby-gemset +1 -0
  10. data/dummy-app/.ruby-version +1 -0
  11. data/dummy-app/CODE_OF_CONDUCT.md +84 -0
  12. data/dummy-app/Gemfile +10 -0
  13. data/dummy-app/Gemfile.lock +35 -0
  14. data/dummy-app/LICENSE.txt +21 -0
  15. data/dummy-app/README.md +43 -0
  16. data/dummy-app/Rakefile +8 -0
  17. data/dummy-app/bin/console +15 -0
  18. data/dummy-app/bin/setup +8 -0
  19. data/dummy-app/dummy-app.gemspec +39 -0
  20. data/dummy-app/lib/dummy/app/version.rb +7 -0
  21. data/dummy-app/lib/dummy/app.rb +10 -0
  22. data/dummy-app/spec/dummy/app_spec.rb +11 -0
  23. data/dummy-app/spec/dummy/dummy_spec.rb +11 -0
  24. data/dummy-app/spec/spec_helper.rb +15 -0
  25. data/exe/liri +9 -4
  26. data/lib/agent/agent.rb +91 -50
  27. data/lib/agent/runner.rb +1 -3
  28. data/lib/all_libraries.rb +4 -2
  29. data/lib/common/benchmarking.rb +5 -10
  30. data/lib/common/log.rb +12 -6
  31. data/lib/common/manager_data.rb +30 -0
  32. data/lib/common/progressbar.rb +29 -0
  33. data/lib/common/setup.rb +103 -0
  34. data/lib/common/source_code.rb +22 -12
  35. data/lib/common/tests_result.rb +115 -0
  36. data/lib/common/unit_test/rspec.rb +14 -35
  37. data/lib/liri.rb +26 -35
  38. data/lib/manager/manager.rb +167 -105
  39. data/lib/task.rb +2 -2
  40. data/liri.gemspec +8 -0
  41. data/spec_credentials.yml.example +4 -0
  42. data/template/liri-config.yml +5 -2
  43. metadata +55 -4
  44. data/lib/manager/setup.rb +0 -70
  45. data/lib/manager/test_result.rb +0 -38
@@ -1,39 +1,38 @@
1
1
  =begin
2
2
  Este modulo es el punto de entrada del programa principal
3
3
  =end
4
+
5
+ # TODO Para trabajar con hilos y concurrencia recomiendan usar parallel, workers, concurrent-ruby. Fuente: https://www.rubyguides.com/2015/07/ruby-threads/
6
+
4
7
  require 'all_libraries'
8
+ require 'terminal-table'
5
9
 
6
10
  module Liri
7
11
  class Manager
8
- UDP_REQUEST_DELAY = 3
9
- attr_reader :agents
10
-
11
12
  class << self
12
13
  # Inicia la ejecución del Manager
13
14
  # @param stop [Boolean] el valor true es para que no se ejecute infinitamente el método en el test unitario.
14
- def run(stop = false)
15
+ def run(source_code_folder_path, stop = false)
15
16
  return unless valid_project
16
- Liri.create_folders('manager')
17
17
 
18
- Liri.set_logger(Liri::MANAGER_LOGS_FOLDER_PATH, 'liri-manager.log')
19
- Liri.logger.info("Proceso Manager iniciado")
20
- puts "Presione Ctrl + c para terminar el proceso Manager manualmente\n\n"
18
+ setup_manager = Liri.set_setup(source_code_folder_path)
19
+ manager_folder_path = setup_manager.manager_folder_path
21
20
 
22
- user, password = get_credentials
23
-
24
- source_code = compress_source_code
25
-
26
- manager_data = manager_data(user, password, source_code)
21
+ Liri.set_logger(setup_manager.logs_folder_path, 'liri-manager.log')
22
+ Liri.logger.info("Proceso Manager iniciado")
23
+ Liri.logger.info("Presione Ctrl + c para terminar el proceso Manager manualmente\n", true)
27
24
 
25
+ user, password = get_credentials(setup_manager.setup_folder_path)
26
+ source_code = compress_source_code(source_code_folder_path, manager_folder_path)
27
+ manager_data = get_manager_data(user, password, manager_folder_path, source_code)
28
28
  all_tests = get_all_tests(source_code)
29
+ tests_result = Common::TestsResult.new(manager_folder_path)
29
30
 
30
- test_result = Liri::Manager::TestResult.new
31
-
32
- manager = Manager.new(Liri.udp_port, Liri.tcp_port, all_tests, test_result)
31
+ manager = Manager.new(Liri.udp_port, Liri.tcp_port, all_tests, tests_result, manager_folder_path)
33
32
 
34
33
  threads = []
35
34
  threads << manager.start_client_socket_to_search_agents(manager_data) # Enviar peticiones broadcast a toda la red para encontrar Agents
36
- manager.start_server_socket_to_process_tests(threads[0]) # Esperar y enviar los test unitarios a los Agents
35
+ manager.start_server_socket_to_process_tests(threads[0]) unless stop # Esperar y enviar los test unitarios a los Agents
37
36
 
38
37
  Liri.init_exit(stop, threads, 'Manager')
39
38
  Liri.logger.info("Proceso Manager terminado")
@@ -42,8 +41,8 @@ module Liri
42
41
  Liri.kill(threads)
43
42
  end
44
43
 
45
- def test_samples_by_runner
46
- Liri.setup.test_samples_by_runner
44
+ def test_files_by_runner
45
+ Liri.setup.test_files_by_runner
47
46
  end
48
47
 
49
48
  private
@@ -58,44 +57,44 @@ module Liri
58
57
  end
59
58
  end
60
59
 
61
- def compressed_file_folder_path
62
- File.join(Liri::Common.setup_folder_path, '/manager')
63
- end
64
-
65
- def decompressed_file_folder_path
66
- compressed_file_folder_path
67
- end
68
-
69
- def get_credentials
70
- credential = Liri::Manager::Credential.new(Liri::SETUP_FOLDER_PATH)
60
+ def get_credentials(setup_folder_path)
61
+ credential = Liri::Manager::Credential.new(setup_folder_path)
71
62
  credential.get
72
63
  end
73
64
 
74
- def compress_source_code
75
- source_code = Liri::Common::SourceCode.new(Liri::MANAGER_FOLDER_PATH, Liri.compression_class, Liri.unit_test_class)
76
- Liri::Common::Benchmarking.start(start_msg: "Comprimiendo código fuente. Espere... ") do
65
+ def compress_source_code(source_code_folder_path, manager_folder_path)
66
+ source_code = Common::SourceCode.new(source_code_folder_path, manager_folder_path, Liri.compression_class, Liri.unit_test_class)
67
+
68
+ Common::Progressbar.start(total: nil, length: 100, format: 'Comprimiendo Código Fuente |%B| %a') do
77
69
  source_code.compress_folder
78
70
  end
79
- puts ''
71
+ puts "\n\n"
72
+
80
73
  source_code
81
74
  end
82
75
 
83
- def manager_data(user, password, source_code)
84
- # puts "User: #{user} Password: #{password}"
85
- [user, password, source_code.compressed_file_path].join(';')
76
+ def get_manager_data(user, password, manager_folder_path, source_code)
77
+ Common::ManagerData.new(
78
+ folder_path: manager_folder_path,
79
+ compressed_file_path: source_code.compressed_file_path,
80
+ user: user,
81
+ password: password
82
+ )
86
83
  end
87
84
 
88
85
  def get_all_tests(source_code)
89
86
  all_tests = {}
90
- Liri::Common::Benchmarking.start(start_msg: "Obteniendo conjunto de pruebas. Espere... ") do
87
+
88
+ Common::Progressbar.start(total: nil, length: 100, format: 'Extrayendo Pruebas Unitarias |%B| %a') do
91
89
  all_tests = source_code.all_tests
92
90
  end
93
- puts ''
91
+ puts "\n\n"
92
+
94
93
  all_tests
95
94
  end
96
95
  end
97
96
 
98
- def initialize(udp_port, tcp_port, all_tests, test_result)
97
+ def initialize(udp_port, tcp_port, all_tests, tests_result, manager_folder_path)
99
98
  @udp_port = udp_port
100
99
  @udp_socket = UDPSocket.new
101
100
  @tcp_port = tcp_port
@@ -110,23 +109,30 @@ module Liri
110
109
  @agents_search_processing_enabled = true
111
110
  @test_processing_enabled = true
112
111
 
113
- @test_result = test_result
112
+ @tests_batch_number = 0
113
+ @tests_batches = {}
114
+
115
+ @tests_result = tests_result
114
116
  @semaphore = Mutex.new
117
+
118
+ @manager_folder_path = manager_folder_path
119
+
120
+ @progressbar = ProgressBar.create(starting_at: 0, total: @all_tests_count, length: 100, format: 'Progress %c/%C |%b=%i| %p%% | %a')
115
121
  end
116
122
 
117
123
  # Inicia un cliente udp que hace un broadcast en toda la red para iniciar una conexión con los Agent que estén escuchando
118
- def start_client_socket_to_search_agents(user_data)
124
+ def start_client_socket_to_search_agents(manager_data)
119
125
  # El cliente udp se ejecuta en bucle dentro de un hilo, esto permite realizar otras tareas mientras este hilo sigue sondeando
120
126
  # la red para obtener mas Agents. Una vez que los tests terminan de ejecutarse, este hilo será finalizado.
121
127
  Thread.new do
122
- puts "\nBuscando Agentes... Espere"
123
- Liri.logger.info("Se emite un broadcast cada #{UDP_REQUEST_DELAY} segundos en el puerto UDP: #{@udp_port}
128
+ Liri.logger.info("Buscando Agentes... Espere")
129
+ Liri.logger.info("Se emite un broadcast cada #{Liri.udp_request_delay} segundos en el puerto UDP: #{@udp_port}
124
130
  (Se mantiene escaneando la red para encontrar Agents)
125
131
  ")
126
- while @agents_search_processing_enabled
132
+ while agents_search_processing_enabled
127
133
  @udp_socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, true)
128
- @udp_socket.send(user_data, 0, '<broadcast>', @udp_port)
129
- sleep(UDP_REQUEST_DELAY) # Se pausa un momento antes de efectuar nuevamente la petición broadcast
134
+ @udp_socket.send(manager_data.to_h.to_json, 0, '<broadcast>', @udp_port)
135
+ sleep(Liri.udp_request_delay) # Se pausa un momento antes de efectuar nuevamente la petición broadcast
130
136
  end
131
137
  end
132
138
  end
@@ -146,12 +152,18 @@ module Liri
146
152
  ")
147
153
  # El siguiente bucle permite que varios clientes es decir Agents se conecten
148
154
  # De: http://www.w3big.com/es/ruby/ruby-socket-programming.html
149
- while @test_processing_enabled
155
+ while test_processing_enabled
150
156
  Thread.start(tcp_socket.accept) do |client|
151
157
  agent_ip_address = client.remote_address.ip_address
152
158
  response = client.recvfrom(1000).first
153
159
 
154
- if @all_tests.empty?
160
+ Liri.logger.info("\nConexión iniciada con el Agente: #{agent_ip_address}")
161
+ Liri.logger.info("Respuesta al broadcast recibida del Agent: #{agent_ip_address} en el puerto TCP: #{@tcp_port}: #{response}")
162
+
163
+ # Se le indica al agente que proceda
164
+ client.puts({ msg: 'Recibido', exist_tests: all_tests.any? }.to_json)
165
+
166
+ if all_tests.empty?
155
167
  # No importa lo que le haga, el broadcast udp no se muere al instante y el agente sigue respondiendo
156
168
  # Las siguientes dos lineas son para que se deje de hacer el broadcast pero aun asi se llegan a hacer
157
169
  # 3 a 4 broadcast antes de que se finalize el proceso, al parecer el broadcast va a tener que quedar asi
@@ -159,49 +171,42 @@ module Liri
159
171
  # tests enviados sin resultados, tests finalizados, si se recibe respuesta al broadcast se trata de enviar primero test pendientes
160
172
  # luego test enviados sin resultados o sino ignorar
161
173
  Thread.kill(search_agents_thread)
162
- @agents_search_processing_enabled = false
163
- Liri.logger.info("Se termina cualquier proceso pendiente con el Agent #{agent_ip_address}")
164
- Liri.logger.info(response)
174
+ agents_search_processing_enabled = false
175
+ Liri.logger.info("Se termina cualquier proceso pendiente con el Agent #{agent_ip_address} en el puerto TCP: #{@tcp_port}: #{response}")
165
176
  client.close
166
177
  Thread.exit
167
178
  end
168
179
 
169
- puts "\nConexión iniciada con el Agente: #{agent_ip_address}"
170
- Liri.logger.info("Respuesta al broadcast recibida del Agent: #{agent_ip_address} en el puerto TCP: #{@tcp_port}
171
- => Agent #{agent_ip_address}: #{response}
172
- ")
173
-
174
- while @all_tests.any?
175
- tests = samples
176
- break if tests.empty?
177
- begin
178
- client.puts(tests.to_json) # Este envía un hash bastante grande al cliente y siempre llega, pero la respuesta del cliente a veces no llega todo, porque?
179
- response = client.recvfrom(1000).first
180
- rescue Errno::EPIPE => e
181
- # Esto al parecer se da cuando el Agent ya cerró las conexiones y el Manager intenta contactar
182
- Liri.logger.error("Exception(#{e}) El Agent #{agent_ip_address} ya terminó la conexión")
183
- # Si el Agente ya no responde es mejor romper el bucle para que no quede colgado
184
- break
180
+ while all_tests.any?
181
+ time_in_seconds = Liri::Common::Benchmarking.start(start_msg: "Proceso de Ejecución de pruebas. Agent: #{agent_ip_address}. Espere... ", end_msg: "Proceso de Ejecución de pruebas. Agent: #{agent_ip_address}. Duración: ", stdout: false) do
182
+ tests_batch = tests_batch(agent_ip_address)
183
+ break unless tests_batch
184
+
185
+ begin
186
+ Liri.logger.debug("Conjunto de pruebas enviadas al Agent #{agent_ip_address}: #{tests_batch}")
187
+
188
+ client.puts(tests_batch.to_json) # Se envia el lote de tests
189
+ response = client.recvfrom(1000).first # Se recibe la respuesta. Cuando mas alto es el parámetro de recvfrom, mas datos se reciben osino se truncan.
190
+ rescue Errno::EPIPE => e
191
+ # Esto al parecer se da cuando el Agent ya cerró las conexiones y el Manager intenta contactar
192
+ Liri.logger.error("Exception(#{e}) El Agent #{agent_ip_address} ya terminó la conexión")
193
+ # Si el Agente ya no responde es mejor romper el bucle para que no quede colgado
194
+ break
195
+ end
185
196
  end
186
- # TODO A veces se tiene un error de parseo JSON, de ser asi los resultados no pueden procesarse,
187
- # hay que arreglar esto, mientras, se captura el error para que no falle
197
+
198
+ # Se captura por si acaso los errores de parseo JSON
188
199
  begin
189
- tests_result = response
190
- Liri.logger.debug("Resultados de la ejecución de las pruebas recibidas del Agent #{agent_ip_address}:")
191
- Liri.logger.debug("RAW:")
192
- Liri.logger.debug(tests_result)
193
- json_tests_result = JSON.parse(tests_result)
194
- Liri.logger.debug("JSON:")
195
- Liri.logger.debug(json_tests_result)
196
- process_tests_result(tests, json_tests_result)
200
+ tests_result = JSON.parse(response)
201
+ Liri.logger.debug("Respuesta del Agent #{agent_ip_address}: #{tests_result}")
202
+ process_tests_result(agent_ip_address, tests_result, time_in_seconds)
197
203
  rescue JSON::ParserError => e
198
204
  Liri.logger.error("Exception(#{e}) Error de parseo JSON")
199
205
  end
200
206
  end
201
207
 
202
208
  update_processing_statuses
203
- puts ''
204
- Liri.logger.info("Se termina la conexión con el Agent #{agent_ip_address}")
209
+ Liri.logger.info("Se termina la conexión con el Agent #{agent_ip_address} en el puerto TCP: #{@tcp_port}")
205
210
  begin
206
211
  client.puts('exit') # Se envía el string exit para que el Agent sepa que el proceso terminó
207
212
  client.close # se desconecta el cliente
@@ -215,44 +220,101 @@ module Liri
215
220
  end
216
221
  end
217
222
 
218
- Liri.clean_folder(Liri::MANAGER_FOLDER_PATH)
219
- @test_result.print_summary
223
+ Liri.clean_folder_content(@manager_folder_path)
224
+ @tests_result.print_summary
225
+ print_agents_summary
226
+ @tests_result.print_failures if Liri.print_failures
227
+ end
228
+
229
+ def all_tests
230
+ @semaphore.synchronize do
231
+ @all_tests
232
+ end
233
+ end
234
+
235
+ def agents_search_processing_enabled=(value)
236
+ @semaphore.synchronize do
237
+ @agents_search_processing_enabled = value
238
+ end
239
+ end
240
+
241
+ def agents_search_processing_enabled
242
+ @semaphore.synchronize do
243
+ @agents_search_processing_enabled
244
+ end
245
+ end
246
+
247
+ def test_processing_enabled
248
+ @semaphore.synchronize do
249
+ @test_processing_enabled
250
+ end
220
251
  end
221
252
 
222
253
  def update_processing_statuses
223
- @semaphore.synchronize {
254
+ @semaphore.synchronize do
224
255
  @test_processing_enabled = false if @all_tests_count == @all_tests_results_count
225
256
  @agents_search_processing_enabled = false if @all_tests_count == @all_tests_processing_count
226
- }
257
+ end
227
258
  end
228
259
 
229
- def update_all_tests_results_count(new_count)
230
- @all_tests_results_count += new_count
231
- end
260
+ def tests_batch(agent_ip_address)
261
+ # Se inicia un semáforo para evitar que varios hilos actualicen variables compartidas
262
+ @semaphore.synchronize do
263
+ return nil if @all_tests.empty?
232
264
 
233
- def update_all_tests_processing_count(new_count)
234
- @all_tests_processing_count += new_count
265
+ @tests_batch_number += 1 # Se numera cada lote
266
+ samples = @all_tests.sample!(Manager.test_files_by_runner) # Se obtiene algunos tests
267
+ samples_keys = samples.keys # Se obtiene la clave asignada a los tests
268
+ @all_tests_processing_count += samples_keys.size
269
+
270
+ @agents[agent_ip_address] = { agent_ip_address: agent_ip_address, tests_processed_count: 0, examples: 0, failures: 0, time_in_seconds: 0, duration: '' } unless @agents[agent_ip_address]
271
+
272
+ #@tests_batches[@tests_batch_number] = { agent_ip_address: agent_ip_address, tests_batch_keys: samples_keys } # Se guarda el lote a enviar
273
+ tests_batch = { tests_batch_number: @tests_batch_number, tests_batch_keys: samples_keys } # Se construye el lote a enviar
274
+ tests_batch
275
+ end
235
276
  end
236
277
 
237
- def samples
238
- _samples = nil
239
- # Varios hilos no deben acceder simultaneamente al siguiente bloque porque actualiza variables compartidas
240
- @semaphore.synchronize {
241
- _samples = @all_tests.sample!(Manager.test_samples_by_runner)
242
- puts ''
243
- Liri.logger.info("Cantidad de pruebas pendientes: #{@all_tests.size}")
244
- update_all_tests_processing_count(_samples.size)
245
- }
246
- _samples
278
+ def process_tests_result(agent_ip_address, tests_result, time_in_seconds)
279
+ # Se inicia un semáforo para evitar que varios hilos actualicen variables compartidas
280
+ @semaphore.synchronize do
281
+ tests_batch_number = tests_result['tests_batch_number']
282
+ tests_result_file_name = tests_result['tests_result_file_name']
283
+ tests_batch_keys_size = tests_result['tests_batch_keys_size']
284
+
285
+ #tests_batch_keys = @tests_batches[tests_batch_number][:tests_batch_keys]
286
+ tests_processed_count = tests_batch_keys_size
287
+ @all_tests_results_count += tests_processed_count
288
+
289
+ @progressbar.progress = @all_tests_results_count
290
+
291
+ #@tests_batches[tests_batch_number][:tests_result_file_name] = tests_result_file_name
292
+
293
+ tests_result = @tests_result.process(tests_result_file_name)
294
+
295
+ @agents[agent_ip_address][:tests_processed_count] += tests_processed_count
296
+ @agents[agent_ip_address][:examples] += tests_result[:example_quantity]
297
+ @agents[agent_ip_address][:failures] += tests_result[:failure_quantity]
298
+ @agents[agent_ip_address][:time_in_seconds] += time_in_seconds
299
+ @agents[agent_ip_address][:duration] = @agents[agent_ip_address][:time_in_seconds].to_duration
300
+
301
+ Liri.logger.info("Pruebas procesadas por Agente: #{agent_ip_address}: #{@agents[agent_ip_address][:tests_processed_count]}")
302
+ end
247
303
  end
248
304
 
249
- def process_tests_result(tests, tests_result)
250
- # Varios hilos no deben acceder simultaneamente al siguiente bloque porque actualiza variables compartidas
251
- @semaphore.synchronize {
252
- update_all_tests_results_count(tests.size)
253
- @test_result.print_process(tests_result)
254
- @test_result.update(tests_result)
255
- }
305
+ def print_agents_summary
306
+ rows = @agents.values.map { |line| line.values }
307
+ headings = @agents.values.first.keys
308
+
309
+ table = Terminal::Table.new title: "Resúmen", headings: headings, rows: rows
310
+ table.style = {padding_left: 3, border_x: "=", border_i: "x" }
311
+ table.align_column(1, :right)
312
+ table.align_column(2, :right)
313
+ table.align_column(3, :right)
314
+ table.align_column(4, :right)
315
+ table.align_column(5, :right)
316
+
317
+ puts table
256
318
  end
257
319
  end
258
320
  end
data/lib/task.rb CHANGED
@@ -5,8 +5,8 @@
5
5
  module Liri
6
6
  module Task
7
7
  class << self
8
- def tests_count
9
- source_code = Liri::Common::SourceCode.new('', Liri.compression_class, Liri.unit_test_class)
8
+ def tests_count(source_code_folder_path)
9
+ source_code = Liri::Common::SourceCode.new(source_code_folder_path,'', Liri.compression_class, Liri.unit_test_class)
10
10
  source_code.all_tests.size
11
11
  end
12
12
  end
data/liri.gemspec CHANGED
@@ -55,4 +55,12 @@ Gem::Specification.new do |spec|
55
55
  # Ruby internationalization and localization (i18n) solution. https://github.com/ruby-i18n/i18n
56
56
  # Este es un requerimiento de la gema to_duration
57
57
  spec.add_runtime_dependency('i18n', '~> 1')
58
+
59
+ # The ultimate text progress bar library for Ruby!. https://github.com/jfelchner/ruby-progressbar
60
+ # Para mostrar barras de progreso
61
+ spec.add_runtime_dependency('ruby-progressbar', '~> 1')
62
+
63
+ # Terminal Table is a fast and simple, yet feature rich table generator written in Ruby. https://github.com/tj/terminal-table
64
+ # Para mostrar resumen de resultados
65
+ spec.add_runtime_dependency('terminal-table', '~> 3')
58
66
  end
@@ -0,0 +1,4 @@
1
+ # Este archivo .yml define el usuario y la contraseña a utilizar para ejecutar los tests de manager_spec
2
+ # Debe renombrar este archivo a spec_credentials.yml
3
+ user: user
4
+ password: password
@@ -3,12 +3,15 @@
3
3
  # Obs.: Puede que no sea útil para el usuario poder cambiar este nombre
4
4
  compressed_file_name: compressed_source_code
5
5
  # Configuración de la cantidad de tests a ejecutar por tandas
6
- test_samples_by_runner: 100
6
+ test_files_by_runner: 10
7
+ print_failures: false
8
+ udp_request_delay: 10
7
9
  log:
8
10
  stdout:
9
11
  # Configuración que define si se muestra el log de ejecución del programa en línea de comando. Puede ser true o false.
10
12
  # Por defecto siempre se imprimirá el log en un archivo dentro de la carpeta logs
11
- show: true
13
+ # Si se pone a true, interfiere con la barra de progreso del Manager, mejor tenerlo en false
14
+ show: false
12
15
  # Define los colores del texto del log. Puede ser none (no muestra colores), severity (colorea código de error),
13
16
  # severity_date (colorea código de error y fecha), full (colorea el texto entero).
14
17
  colorize: full
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: liri
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rodrigo Fernández
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2022-05-08 00:00:00.000000000 Z
12
+ date: 2022-05-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rubyzip
@@ -95,6 +95,34 @@ dependencies:
95
95
  - - "~>"
96
96
  - !ruby/object:Gem::Version
97
97
  version: '1'
98
+ - !ruby/object:Gem::Dependency
99
+ name: ruby-progressbar
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '1'
105
+ type: :runtime
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: '1'
112
+ - !ruby/object:Gem::Dependency
113
+ name: terminal-table
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: '3'
119
+ type: :runtime
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: '3'
98
126
  description: Test distributor executor
99
127
  email:
100
128
  - rofaccess@gmail.com
@@ -110,6 +138,7 @@ files:
110
138
  - ".rubocop.yml"
111
139
  - ".ruby-gemset"
112
140
  - ".ruby-version"
141
+ - ".simplecov"
113
142
  - ".travis.yml"
114
143
  - CODE_OF_CONDUCT.md
115
144
  - Gemfile
@@ -117,6 +146,7 @@ files:
117
146
  - LICENSE.txt
118
147
  - README.md
119
148
  - Rakefile
149
+ - bash_script_examples.sh
120
150
  - bin/bundle
121
151
  - bin/coderay
122
152
  - bin/commander
@@ -132,6 +162,24 @@ files:
132
162
  - bin/yardoc
133
163
  - bin/yri
134
164
  - config/locales/to_duration_es.yml
165
+ - dummy-app/.gitignore
166
+ - dummy-app/.rspec
167
+ - dummy-app/.ruby-gemset
168
+ - dummy-app/.ruby-version
169
+ - dummy-app/CODE_OF_CONDUCT.md
170
+ - dummy-app/Gemfile
171
+ - dummy-app/Gemfile.lock
172
+ - dummy-app/LICENSE.txt
173
+ - dummy-app/README.md
174
+ - dummy-app/Rakefile
175
+ - dummy-app/bin/console
176
+ - dummy-app/bin/setup
177
+ - dummy-app/dummy-app.gemspec
178
+ - dummy-app/lib/dummy/app.rb
179
+ - dummy-app/lib/dummy/app/version.rb
180
+ - dummy-app/spec/dummy/app_spec.rb
181
+ - dummy-app/spec/dummy/dummy_spec.rb
182
+ - dummy-app/spec/spec_helper.rb
135
183
  - exe/liri
136
184
  - lib/agent/agent.rb
137
185
  - lib/agent/runner.rb
@@ -139,7 +187,11 @@ files:
139
187
  - lib/common/benchmarking.rb
140
188
  - lib/common/compressor/zip.rb
141
189
  - lib/common/log.rb
190
+ - lib/common/manager_data.rb
191
+ - lib/common/progressbar.rb
192
+ - lib/common/setup.rb
142
193
  - lib/common/source_code.rb
194
+ - lib/common/tests_result.rb
143
195
  - lib/common/unit_test/rspec.rb
144
196
  - lib/exe/agent.rb
145
197
  - lib/exe/manager.rb
@@ -147,10 +199,9 @@ files:
147
199
  - lib/liri.rb
148
200
  - lib/manager/credential.rb
149
201
  - lib/manager/manager.rb
150
- - lib/manager/setup.rb
151
- - lib/manager/test_result.rb
152
202
  - lib/task.rb
153
203
  - liri.gemspec
204
+ - spec_credentials.yml.example
154
205
  - template/liri-config.yml
155
206
  homepage: https://github.com/rofaccess/tfg
156
207
  licenses:
data/lib/manager/setup.rb DELETED
@@ -1,70 +0,0 @@
1
- =begin
2
- Este modulo se encarga de manejar la configuración
3
- =end
4
- require 'yaml'
5
- require 'json'
6
-
7
- module Liri
8
- class Manager
9
- class Setup
10
- FILE_NAME = 'liri-config.yml'
11
- TEMPLATE_PATH = File.join(File.dirname(File.dirname(File.dirname(__FILE__))), 'template/liri-config.yml')
12
-
13
- def initialize(folder_path)
14
- # Crea la carpeta en donde se guardarán los datos relativos a liri, ya sean archivos comprimidos,
15
- # archivos descomprimidos, configuraciones, etc.
16
- Dir.mkdir(folder_path) unless Dir.exist?(folder_path)
17
-
18
- @file_path = File.join(folder_path, '/', FILE_NAME)
19
- end
20
-
21
- # Crea un archivo de configuración en la raiz del proyecto desde un template
22
- def create
23
- File.open(@file_path, "w") do |output_file|
24
- File.foreach(TEMPLATE_PATH) do |input_line|
25
- output_file.write(input_line)
26
- end
27
- end
28
- true
29
- end
30
-
31
- # Retorna los datos del archivo de configuración
32
- def load
33
- if File.exist?(@file_path)
34
- data = YAML.load(File.read(@file_path))
35
- JSON.parse(data.to_json, object_class: OpenStruct)
36
- else
37
- raise Liri::FileNotFoundError.new(@file_path)
38
- end
39
- end
40
-
41
- # Borra el archivo de configuración
42
- def delete
43
- if File.exist?(@file_path)
44
- File.delete(@file_path)
45
- true
46
- else
47
- false
48
- end
49
- end
50
-
51
- def set(value, *keys)
52
- data = YAML.load(File.read(@file_path))
53
- keys = keys.first
54
- aux = data
55
- keys.each_with_index do |key, index|
56
- if (keys[index + 1])
57
- aux = data[key]
58
- else
59
- aux[key] = value
60
- end
61
- end
62
- File.open(@file_path, 'w') { |f| f.write data.to_yaml }
63
- end
64
-
65
- def path
66
- @file_path
67
- end
68
- end
69
- end
70
- end
@@ -1,38 +0,0 @@
1
- # Procesa el resultado de las pruebas unitarias
2
- module Liri
3
- class Manager
4
- class TestResult
5
- def initialize
6
- @example_quantity = 0
7
- @failure_quantity = 0
8
- @passed_quantity = 0
9
- end
10
- def update(test_result)
11
- @example_quantity += test_result['example_quantity']
12
- @failure_quantity += test_result['failure_quantity']
13
- @passed_quantity += (@example_quantity - @failure_quantity)
14
- end
15
-
16
- def print_process(test_result)
17
- passed_quantity = test_result['example_quantity'] - test_result['failure_quantity']
18
- passed_quantity.times do
19
- print '.'
20
- end
21
-
22
- test_result['failure_quantity'].times do
23
- print 'F'
24
- end
25
- end
26
-
27
- def print_summary
28
- print_examples_and_failures
29
- end
30
-
31
- private
32
-
33
- def print_examples_and_failures
34
- puts "#{@example_quantity} examples, #{@failure_quantity} failures\n\n"
35
- end
36
- end
37
- end
38
- end