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.
- checksums.yaml +4 -4
- data/.gitignore +4 -2
- data/.simplecov +8 -0
- data/Gemfile +4 -1
- data/Gemfile.lock +27 -15
- data/bash_script_examples.sh +1 -0
- data/dummy-app/.gitignore +12 -0
- data/dummy-app/.rspec +3 -0
- data/dummy-app/.ruby-gemset +1 -0
- data/dummy-app/.ruby-version +1 -0
- data/dummy-app/CODE_OF_CONDUCT.md +84 -0
- data/dummy-app/Gemfile +10 -0
- data/dummy-app/Gemfile.lock +35 -0
- data/dummy-app/LICENSE.txt +21 -0
- data/dummy-app/README.md +43 -0
- data/dummy-app/Rakefile +8 -0
- data/dummy-app/bin/console +15 -0
- data/dummy-app/bin/setup +8 -0
- data/dummy-app/dummy-app.gemspec +39 -0
- data/dummy-app/lib/dummy/app/version.rb +7 -0
- data/dummy-app/lib/dummy/app.rb +10 -0
- data/dummy-app/spec/dummy/app_spec.rb +11 -0
- data/dummy-app/spec/dummy/dummy_spec.rb +11 -0
- data/dummy-app/spec/spec_helper.rb +15 -0
- data/exe/liri +9 -4
- data/lib/agent/agent.rb +91 -50
- data/lib/agent/runner.rb +1 -3
- data/lib/all_libraries.rb +4 -2
- data/lib/common/benchmarking.rb +5 -10
- data/lib/common/log.rb +12 -6
- data/lib/common/manager_data.rb +30 -0
- data/lib/common/progressbar.rb +29 -0
- data/lib/common/setup.rb +103 -0
- data/lib/common/source_code.rb +22 -12
- data/lib/common/tests_result.rb +115 -0
- data/lib/common/unit_test/rspec.rb +14 -35
- data/lib/liri.rb +26 -35
- data/lib/manager/manager.rb +167 -105
- data/lib/task.rb +2 -2
- data/liri.gemspec +8 -0
- data/spec_credentials.yml.example +4 -0
- data/template/liri-config.yml +5 -2
- metadata +55 -4
- data/lib/manager/setup.rb +0 -70
- data/lib/manager/test_result.rb +0 -38
data/lib/manager/manager.rb
CHANGED
@@ -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.
|
19
|
-
|
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
|
-
|
23
|
-
|
24
|
-
|
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
|
-
|
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
|
46
|
-
Liri.setup.
|
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
|
62
|
-
|
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 =
|
76
|
-
|
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
|
84
|
-
|
85
|
-
|
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
|
-
|
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,
|
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
|
-
@
|
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(
|
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
|
-
|
123
|
-
Liri.logger.info("Se emite un broadcast cada #{
|
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
|
132
|
+
while agents_search_processing_enabled
|
127
133
|
@udp_socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, true)
|
128
|
-
@udp_socket.send(
|
129
|
-
sleep(
|
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
|
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
|
-
|
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
|
-
|
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
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
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
|
-
|
187
|
-
#
|
197
|
+
|
198
|
+
# Se captura por si acaso los errores de parseo JSON
|
188
199
|
begin
|
189
|
-
tests_result = response
|
190
|
-
Liri.logger.debug("
|
191
|
-
|
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
|
-
|
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.
|
219
|
-
@
|
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
|
230
|
-
|
231
|
-
|
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
|
-
|
234
|
-
|
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
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
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
|
250
|
-
|
251
|
-
@
|
252
|
-
|
253
|
-
|
254
|
-
|
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
|
data/template/liri-config.yml
CHANGED
@@ -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
|
-
|
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
|
-
|
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.
|
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-
|
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
|
data/lib/manager/test_result.rb
DELETED
@@ -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
|