liri 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/agent/agent.rb CHANGED
@@ -11,16 +11,19 @@ module Liri
11
11
  class << self
12
12
  # Inicia la ejecución del Agent
13
13
  # @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
- Liri.create_folders('agent')
14
+ def run(work_folder_path, stop = false)
15
+ setup_manager = Liri.set_setup(work_folder_path)
16
+ agent_folder_path = setup_manager.agent_folder_path
16
17
 
17
- Liri.set_logger(Liri::AGENT_LOGS_FOLDER_PATH, 'liri-agent.log')
18
+ Liri.set_logger(setup_manager.logs_folder_path, 'liri-agent.log')
18
19
  Liri.logger.info("Proceso Agent iniciado")
19
- puts "Presione Ctrl + c para terminar el proceso Agent manualmente\n\n"
20
+ Liri.logger.info("Presione Ctrl + c para terminar el proceso Agent manualmente\n", true)
20
21
 
21
- source_code = Liri::Common::SourceCode.new(Liri::AGENT_FOLDER_PATH, Liri.compression_class, Liri.unit_test_class)
22
- runner = Liri::Agent::Runner.new(Liri.unit_test_class, source_code.decompressed_file_folder_path)
23
- agent = Agent.new(Liri.udp_port, Liri.tcp_port, source_code, runner)
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)
24
27
  threads = []
25
28
  threads << agent.start_server_socket_to_process_manager_connection_request # Esperar y procesar la petición de conexión del Manager
26
29
 
@@ -32,15 +35,20 @@ module Liri
32
35
  end
33
36
  end
34
37
 
35
- def initialize(udp_port, tcp_port, source_code, runner)
38
+ def initialize(udp_port, tcp_port, source_code, runner, tests_result, agent_folder_path)
36
39
  @udp_port = udp_port
37
40
  @udp_socket = UDPSocket.new
38
41
  @tcp_port = tcp_port
39
42
 
40
43
  @source_code = source_code
41
44
  @runner = runner
45
+ @tests_result = tests_result
46
+
47
+ @all_tests = {}
42
48
 
43
49
  @managers = {}
50
+
51
+ @agent_folder_path = agent_folder_path
44
52
  end
45
53
 
46
54
  # Inicia un servidor udp que se mantiene en espera de la primera petición de conexión del Manager
@@ -62,48 +70,51 @@ module Liri
62
70
  loop do
63
71
  @manager_request = @udp_socket.recvfrom(1024)
64
72
  manager_ip_address = @manager_request.last.last
65
- user, pass, dir = @manager_request.first.split(";")
66
- process_manager_connection_request(manager_ip_address, user, pass, dir)
73
+ manager_data = get_manager_data(JSON.parse(@manager_request.first))
74
+ process_manager_connection_request(manager_ip_address, manager_data)
67
75
  end
68
76
  end
69
77
  end
70
78
 
71
79
  # Inicia un cliente tcp para responder a la petición broadcast del Manager para que éste sepa donde enviar las pruebas
72
- def start_client_socket_to_process_tests(manager_ip_address)
80
+ def start_client_socket_to_process_tests(manager_ip_address, manager_data)
73
81
  tcp_socket = TCPSocket.open(manager_ip_address, @tcp_port)
74
82
 
75
- Liri.logger.info("Se inicia una conexión con el Manager: #{manager_ip_address} en el puerto TCP: #{@tcp_port}
76
- (Se establece una conexión para procesar la ejecución de las pruebas)
77
- ")
83
+ agent_ip_address = tcp_socket.addr[2]
84
+
85
+ tcp_socket.puts({ msg: 'Listo' }) # Se envía un mensaje inicial al Manager
86
+
87
+ Liri.logger.info("Se inicia una conexión para procesar pruebas con el Manager: #{manager_ip_address} en el puerto TCP: #{@tcp_port}")
88
+ Liri.logger.info("\nConexión iniciada con el Manager: #{manager_ip_address}", true)
89
+
90
+ response = JSON.parse(tcp_socket.gets)
91
+ return unless response['exist_tests']
78
92
 
79
- tcp_socket.print("Listo para ejecutar pruebas") # Se envía un mensaje inicial al Manager
80
- puts "\nConexión iniciada con el Manager: #{manager_ip_address}"
93
+ get_source_code(manager_ip_address, manager_data)
81
94
 
82
- # Se procesan las pruebas enviadds por el Manager
95
+ # Se procesan las pruebas enviadas por el Manager
83
96
  while line = tcp_socket.gets
84
97
  response = line.chop
85
98
  break if response == 'exit'
86
99
 
87
- tests = JSON.parse(response)
88
- Liri.logger.debug("Pruebas recibidas del Manager #{manager_ip_address}:")
89
- Liri.logger.debug(tests)
100
+ tests_batch = JSON.parse(response)
101
+ tests = get_tests(tests_batch, manager_ip_address)
90
102
 
91
- tests_result = @runner.run_tests(tests)
103
+ raw_tests_result = @runner.run_tests(tests)
92
104
 
93
- json_tests_result = tests_result.to_json
94
- Liri.logger.debug("Resultados de la ejecución de las pruebas recibidas del Manager #{manager_ip_address}:")
95
- Liri.logger.debug(json_tests_result)
105
+ tests_batch_number = tests_batch['tests_batch_number']
106
+ tests_result_file_name = @tests_result.build_file_name(agent_ip_address, tests_batch_number)
107
+ tests_result_file_path = @tests_result.save(tests_result_file_name, raw_tests_result)
96
108
 
97
- Liri.logger.info("
98
- #{tests.size} pruebas recibidas, #{tests_result[:example_quantity]} pruebas ejecutadas
99
- ")
100
- tcp_socket.print(json_tests_result) # Este no logra enviar toda la información, porque? en cambio el cliente recibe un json grande sin problemas
109
+ send_tests_results_file(manager_ip_address, manager_data, tests_result_file_path)
110
+ result = { tests_batch_number: tests_batch_number, tests_result_file_name: tests_result_file_name, tests_batch_keys_size: tests_batch['tests_batch_keys'].size}
111
+ tcp_socket.puts(result.to_json) # Envía el número de lote y el nombre del archivo de resultados.
101
112
  end
102
113
 
103
114
  tcp_socket.close
104
- Liri.logger.info("Se termina la conexión con el Manager #{manager_ip_address}")
115
+ Liri.logger.info("Se termina la conexión con el Manager #{manager_ip_address} en el puerto TCP: #{@tcp_port}")
105
116
 
106
- Liri.clean_folder(Liri::AGENT_FOLDER_PATH)
117
+ Liri.clean_folder_content(@agent_folder_path)
107
118
 
108
119
  start_client_to_close_manager_server(manager_ip_address, 'Conexión Terminada')
109
120
  unregister_manager(manager_ip_address)
@@ -112,11 +123,11 @@ module Liri
112
123
  rescue Errno::ECONNRESET => e
113
124
  tcp_socket.close
114
125
  Liri.logger.error("Exception(#{e}) Conexión cerrada en el puerto TCP #{@tcp_port}")
115
- Liri.logger.info("Se termina la conexión con el Manager #{manager_ip_address}")
126
+ Liri.logger.info("Se termina la conexión con el Manager #{manager_ip_address} en el puerto TCP: #{@tcp_port}")
116
127
  unregister_manager(manager_ip_address)
117
128
  rescue Errno::ECONNREFUSED => e
118
129
  Liri.logger.error("Exception(#{e}) Conexión rechazada en el puerto TCP #{@tcp_port}")
119
- Liri.logger.info("Se termina la conexión con el Manager #{manager_ip_address}")
130
+ Liri.logger.info("Se termina la conexión con el Manager #{manager_ip_address} en el puerto TCP: #{@tcp_port}")
120
131
  unregister_manager(manager_ip_address)
121
132
  end
122
133
 
@@ -125,15 +136,15 @@ module Liri
125
136
  # Inserta el ip recibido dentro del hash si es que ya no existe en el hash
126
137
  # Nota: Se requieren imprimir datos para saber el estado de la aplicación, sería muy útil usar algo para logear
127
138
  # estas cosas en los diferentes niveles, debug, info, etc.
128
- def process_manager_connection_request(manager_ip_address, user, pass, dir)
139
+ def process_manager_connection_request(manager_ip_address, manager_data)
129
140
  unless registered_manager?(manager_ip_address)
130
141
  register_manager(manager_ip_address)
131
142
  Liri.logger.info("Petición broadcast UDP recibida del Manager: #{manager_ip_address} en el puerto UDP: #{@udp_port}")
132
- if process_manager_connection_scp(manager_ip_address, user, pass, dir)
133
- start_client_socket_to_process_tests(manager_ip_address)
134
- else
135
- unregister_manager(manager_ip_address)
136
- end
143
+ #if get_source_code(manager_ip_address, manager_data)
144
+ start_client_socket_to_process_tests(manager_ip_address, manager_data)
145
+ #else
146
+ #unregister_manager(manager_ip_address)
147
+ #end
137
148
  end
138
149
  end
139
150
 
@@ -141,27 +152,28 @@ module Liri
141
152
  # Esta conexión permitirá al Manager cerrar sus hilos pendientes con servidores TCP en espera y terminar el proceso
142
153
  def start_client_to_close_manager_server(manager_ip_address, msg)
143
154
  tcp_socket = TCPSocket.open(manager_ip_address, @tcp_port)
144
- Liri.logger.info("Se termina cualquier proceso pendiente con el Manager #{manager_ip_address}")
145
- tcp_socket.print({msg: msg}.to_json)
155
+ Liri.logger.info("Se termina cualquier proceso pendiente con el Manager #{manager_ip_address} en el puerto TCP: #{@tcp_port}")
156
+ tcp_socket.print({ msg: msg }.to_json)
146
157
  tcp_socket.close
147
158
  end
148
159
 
149
- def process_manager_connection_scp(manager_ip_address, user, password, dir)
150
- # puts "User: #{user} Password: #{password}"
160
+ def get_source_code(manager_ip_address, manager_data)
161
+ #puts "#{manager_data.to_h}"
151
162
  puts ''
152
- Liri::Common::Benchmarking.start(start_msg: "Obteniendo código fuente. Espere... ") do
163
+ Liri::Common::Benchmarking.start(start_msg: "Obteniendo código fuente. Espere... ", stdout: true) do
153
164
  puts ''
154
- Net::SCP.start(manager_ip_address, user, :password => password) do |scp|
155
- scp.download!(dir, @source_code.compressed_file_folder_path)
165
+ Net::SCP.start(manager_ip_address, manager_data.user, password: manager_data.password) do |scp|
166
+ scp.download!(manager_data.compressed_file_path, @source_code.compressed_file_folder_path)
156
167
  end
157
168
  end
158
169
  puts ''
159
170
 
160
- downloaded_file_name = dir.split('/').last
171
+ downloaded_file_name = manager_data.compressed_file_path.split('/').last
161
172
  downloaded_file_path = File.join(@source_code.compressed_file_folder_path, '/', downloaded_file_name)
162
173
 
163
- Liri::Common::Benchmarking.start(start_msg: "Descomprimiendo código fuente. Espere... ") do
174
+ Liri::Common::Benchmarking.start(start_msg: "Descomprimiendo código fuente. Espere... ", stdout: true) do
164
175
  @source_code.decompress_file(downloaded_file_path)
176
+ @all_tests = @source_code.all_tests
165
177
  end
166
178
  puts ''
167
179
 
@@ -180,19 +192,19 @@ module Liri
180
192
  # Se setea la versión de ruby y el gemset para el código fuente descomprimido
181
193
  # Se especifica el Gemfile del cual se van a instalar los requerimientos
182
194
  # Esto se hace porque por defecto se usa la versión de Ruby de Liri y su Gemset y por ello hay que cambiarlos explicitamente aquí
183
- Liri::Common::Benchmarking.start(start_msg: "Ejecutando bundle install. Espere... ", end_msg: "Ejecución de bundle install. Duración: ") do
195
+ Liri::Common::Benchmarking.start(start_msg: "Ejecutando bundle install. Espere... ", end_msg: "Ejecución de bundle install. Duración: ", stdout: true) do
184
196
  puts ''
185
197
  system("bash -lc 'rvm use #{Liri.current_folder_ruby_and_gemset}; BUNDLE_GEMFILE=Gemfile bundle install'")
186
198
  end
187
199
  puts ''
188
200
 
189
- Liri::Common::Benchmarking.start(start_msg: "Ejecutando rake db:migrate RAILS_ENV=test. Espere... ", end_msg: "Ejecución de rake db:migrate RAILS_ENV=test. Duración: ") do
201
+ Liri::Common::Benchmarking.start(start_msg: "Ejecutando rake db:migrate RAILS_ENV=test. Espere... ", end_msg: "Ejecución de rake db:migrate RAILS_ENV=test. Duración: ", stdout: true) do
190
202
  puts ''
191
203
  system("bash -lc 'rvm use #{Liri.current_folder_ruby_and_gemset}; rake db:migrate RAILS_ENV=test'")
192
204
  end
193
205
  puts ''
194
206
 
195
- #Liri::Common::Benchmarking.start(start_msg: "Ejecutando rake db:migrate:reset RAILS_ENV=test. Espere... ", end_msg: "Ejecución de rake db:migrate:reset RAILS_ENV=test. Duración: ") do
207
+ #Liri::Common::Benchmarking.start(start_msg: "Ejecutando rake db:migrate:reset RAILS_ENV=test. Espere... ", end_msg: "Ejecución de rake db:migrate:reset RAILS_ENV=test. Duración: ", stdout: true) do
196
208
  # puts ''
197
209
  # system("bash -lc 'rvm use #{Liri.current_folder_ruby_and_gemset}; rake db:migrate:reset RAILS_ENV=test'")
198
210
  #end
@@ -220,6 +232,34 @@ module Liri
220
232
  false
221
233
  end
222
234
 
235
+ def get_manager_data(manager_data_hash)
236
+ Common::ManagerData.new(
237
+ folder_path: manager_data_hash['folder_path'],
238
+ compressed_file_path: manager_data_hash['compressed_file_path'],
239
+ user: manager_data_hash['user'],
240
+ password: manager_data_hash['password']
241
+ )
242
+ end
243
+
244
+ def send_tests_results_file(manager_ip_address, manager_data, tests_result_file_path)
245
+ puts ''
246
+ Liri::Common::Benchmarking.start(start_msg: "Enviando archivo de resultados. Espere... ", stdout: true) do
247
+ Net::SCP.start(manager_ip_address, manager_data.user, password: manager_data.password) do |scp|
248
+ scp.upload!(tests_result_file_path, manager_data.folder_path)
249
+ end
250
+ end
251
+ puts ''
252
+ end
253
+
254
+ def get_tests(tests_batch, manager_ip_address)
255
+ # Se convierte "[5, 9, 13, 1]" a un arreglo [5, 9, 13, 1]
256
+ tests_keys = tests_batch['tests_batch_keys']
257
+ Liri.logger.debug("Claves de pruebas recibidas del Manager #{manager_ip_address}: #{tests_keys}")
258
+ # Se buscan obtienen los tests que coincidan con las claves recibidas de @all_tests = {1=>"spec/hash_spec.rb:2", 2=>"spec/hash_spec.rb:13", 3=>"spec/hash_spec.rb:24", ..., 29=>"spec/liri_spec.rb:62"}
259
+ # Se retorna un arreglo con los tests a ejecutar ["spec/liri_spec.rb:4", "spec/hash_spec.rb:5", "spec/hash_spec.rb:59", ..., "spec/hash_spec.rb:37"]
260
+ tests_keys.map { |test_key| @all_tests[test_key] }
261
+ end
262
+
223
263
  def registered_manager?(manager_ip_address)
224
264
  @managers[manager_ip_address]
225
265
  end
data/lib/agent/runner.rb CHANGED
@@ -10,9 +10,7 @@ module Liri
10
10
  end
11
11
 
12
12
  def run_tests(tests)
13
- result_hash = @unit_test.run_tests(tests.values)
14
- result_hash[:test_keys] = tests.keys
15
- result_hash
13
+ @unit_test.run_tests(tests)
16
14
  end
17
15
  end
18
16
  end
data/lib/all_libraries.rb CHANGED
@@ -20,11 +20,13 @@ require 'agent/runner'
20
20
 
21
21
  require 'common/benchmarking'
22
22
  require 'common/log'
23
+ require 'common/manager_data'
24
+ require 'common/progressbar'
25
+ require 'common/setup'
23
26
  require 'common/source_code'
24
27
  require 'common/compressor/zip'
25
28
  require 'common/unit_test/rspec'
29
+ require 'common/tests_result'
26
30
 
27
31
  require 'manager/manager'
28
- require 'manager/setup'
29
32
  require 'manager/credential'
30
- require 'manager/test_result'
@@ -6,7 +6,7 @@
6
6
  # Este módulo se encarga de medir el tiempo de ejecución de algunos bloques de código
7
7
 
8
8
  require 'benchmark'
9
- require 'i18n' # requirimiento de la gema to_duration
9
+ require 'i18n' # requerimiento de la gema to_duration
10
10
  require 'to_duration'
11
11
 
12
12
  # Se configura la ubicación del archivo de internacionalización de la gema to_duration
@@ -17,18 +17,13 @@ module Liri
17
17
  module Common
18
18
  module Benchmarking
19
19
  class << self
20
- def start(start_msg: nil, end_msg: 'Duración: ')
21
- print start_msg
20
+ def start(start_msg: nil, end_msg: 'Duración: ', stdout: true)
21
+ Liri.logger.info(start_msg, stdout)
22
22
  seconds = Benchmark.realtime do
23
23
  yield
24
24
  end
25
- print_result(end_msg, seconds)
26
- end
27
-
28
- private
29
-
30
- def print_result(msg, seconds)
31
- print "#{msg}#{seconds.to_duration}"
25
+ Liri.logger.info("#{end_msg}#{seconds.to_duration}", stdout)
26
+ seconds
32
27
  end
33
28
  end
34
29
  end
data/lib/common/log.rb CHANGED
@@ -26,32 +26,38 @@ module Liri
26
26
  create_file_logger
27
27
  end
28
28
 
29
- def debug(text)
29
+ def debug(text, stdout = false)
30
+ puts(text) if stdout
30
31
  @stdout_logger.debug(text) if @stdout
31
32
  @file_logger.debug(text)
32
33
  end
33
34
 
34
- def info(text)
35
+ def info(text, stdout = false)
36
+ puts(text) if stdout
35
37
  @stdout_logger.info(text) if @stdout
36
38
  @file_logger.info(text)
37
39
  end
38
40
 
39
- def warn(text)
41
+ def warn(text, stdout = false)
42
+ puts(text) if stdout
40
43
  @stdout_logger.warn(text) if @stdout
41
44
  @file_logger.warn(text)
42
45
  end
43
46
 
44
- def error(text)
47
+ def error(text, stdout = false)
48
+ puts(text) if stdout
45
49
  @stdout_logger.error(text) if @stdout
46
50
  @file_logger.error(text)
47
51
  end
48
52
 
49
- def fatal(text)
53
+ def fatal(text, stdout = false)
54
+ puts(text) if stdout
50
55
  @stdout_logger.fatal(text) if @stdout
51
56
  @file_logger.fatal(text)
52
57
  end
53
58
 
54
- def unknown(text)
59
+ def unknown(text, stdout = false)
60
+ puts(text) if stdout
55
61
  @stdout_logger.unknown(text) if @stdout
56
62
  @file_logger.unknown(text)
57
63
  end
@@ -0,0 +1,30 @@
1
+ # = manager_data.rb
2
+ #
3
+ # @author Rodrigo Fernández
4
+ #
5
+ # == Clase ManagerData
6
+
7
+ module Liri
8
+ module Common
9
+ # Esta clase guarda los datos del Manager
10
+ class ManagerData
11
+ attr_accessor :folder_path, :compressed_file_path, :user, :password
12
+
13
+ def initialize(folder_path:, compressed_file_path:, user:, password:)
14
+ @folder_path = folder_path
15
+ @compressed_file_path = compressed_file_path
16
+ @user = user
17
+ @password = password
18
+ end
19
+
20
+ def to_h
21
+ {
22
+ folder_path: @folder_path,
23
+ compressed_file_path: @compressed_file_path,
24
+ user: @user,
25
+ password: @password
26
+ }
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,29 @@
1
+ # = progressbar.rb
2
+ #
3
+ # @author Rodrigo Fernández
4
+ #
5
+ # == Módulo Progressbar
6
+ # Este módulo se encarga de mostrar una barra de progreso
7
+
8
+ require 'ruby-progressbar'
9
+
10
+ module Liri
11
+ module Common
12
+ module Progressbar
13
+ class << self
14
+ def start(params = {})
15
+ @compressing = true
16
+ progressbar = ProgressBar.create(params)
17
+ Thread.new do
18
+ while @compressing
19
+ progressbar.increment
20
+ sleep(0.1)
21
+ end
22
+ end
23
+ yield
24
+ @compressing = false
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,103 @@
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
+ module Common
9
+ class Setup
10
+ SETUP_FOLDER_NAME = 'liri'
11
+ SETUP_FILE_NAME = 'liri-config.yml'
12
+ TEMPLATE_PATH = File.join(File.dirname(File.dirname(File.dirname(__FILE__))), 'template/liri-config.yml')
13
+ LOGS_FOLDER_NAME = 'logs'
14
+ MANAGER_FOLDER_NAME = 'manager'
15
+ AGENT_FOLDER_NAME = 'agent'
16
+
17
+ attr_reader :setup_folder_path, :setup_file_path, :logs_folder_path, :manager_folder_path, :agent_folder_path
18
+
19
+ def initialize(destination_folder_path)
20
+ @setup_folder_path = File.join(destination_folder_path, '/', SETUP_FOLDER_NAME)
21
+ @setup_file_path = File.join(@setup_folder_path, '/', SETUP_FILE_NAME)
22
+ @logs_folder_path = File.join(@setup_folder_path, '/', LOGS_FOLDER_NAME)
23
+ @manager_folder_path = File.join(@setup_folder_path, '/', MANAGER_FOLDER_NAME)
24
+ @agent_folder_path = File.join(@setup_folder_path, '/', AGENT_FOLDER_NAME)
25
+ end
26
+
27
+ def init
28
+ create_folder(@setup_folder_path)
29
+ create_folder(@logs_folder_path)
30
+ create_folder(@manager_folder_path)
31
+ create_folder(@agent_folder_path)
32
+ create_setup_file
33
+ end
34
+
35
+ # Retorna los datos del archivo de configuración
36
+ def load
37
+ if File.exist?(@setup_file_path)
38
+ data = YAML.load(File.read(@setup_file_path))
39
+ JSON.parse(data.to_json, object_class: OpenStruct)
40
+ else
41
+ raise Liri::FileNotFoundError.new(@setup_file_path)
42
+ end
43
+ end
44
+
45
+ def set(value, *keys)
46
+ data = YAML.load(File.read(@setup_file_path))
47
+ keys = keys.first
48
+ aux = data
49
+ keys.each_with_index do |key, index|
50
+ if (keys[index + 1])
51
+ aux = data[key]
52
+ else
53
+ aux[key] = value
54
+ end
55
+ end
56
+ File.open(@setup_file_path, 'w') { |f| f.write data.to_yaml }
57
+ end
58
+
59
+ def create_folder(folder_path)
60
+ if Dir.exist?(folder_path)
61
+ false
62
+ else
63
+ Dir.mkdir(folder_path)
64
+ Dir.exist?(folder_path) ? true : false
65
+ end
66
+ end
67
+
68
+ def delete_setup_folder
69
+ if Dir.exist?(@setup_folder_path)
70
+ FileUtils.rm_rf(@setup_folder_path)
71
+ Dir.exist?(@setup_folder_path) ? false : true
72
+ else
73
+ false
74
+ end
75
+ end
76
+
77
+ # Crea un archivo de configuración en la raiz del proyecto desde un template
78
+ def create_setup_file
79
+ if File.exist?(@setup_file_path)
80
+ false
81
+ else
82
+ File.open(@setup_file_path, 'w') do |output_file|
83
+ File.foreach(TEMPLATE_PATH) do |input_line|
84
+ output_file.write(input_line)
85
+ end
86
+ end
87
+
88
+ File.exist?(@setup_file_path) ? true : false
89
+ end
90
+ end
91
+
92
+ # Borra el archivo de configuración
93
+ def delete_setup_file
94
+ if File.exist?(@setup_file_path)
95
+ File.delete(@setup_file_path)
96
+ File.exist?(@setup_file_path) ? false : true
97
+ else
98
+ false
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
@@ -5,23 +5,23 @@
5
5
  module Liri
6
6
  module Common
7
7
  class SourceCode
8
- FOLDER_PATH = Dir.pwd
9
- FOLDER_NAME = FOLDER_PATH.split('/').last
10
8
  DECOMPRESSED_FOLDER_NAME = 'decompressed'
11
- attr_reader :compressed_file_folder_path, :compressed_file_path, :decompressed_file_folder_path
9
+ attr_reader :folder_path, :compressed_file_folder_path, :compressed_file_path, :decompressed_file_folder_path
12
10
 
13
- def initialize(compressed_file_folder_path, compression_class, unit_test_class)
11
+ def initialize(folder_path, compressed_file_folder_path, compression_class, unit_test_class)
12
+ @folder_path = folder_path
13
+ @folder_name = @folder_path.split('/').last
14
14
  @compressed_file_folder_path = compressed_file_folder_path
15
15
  @decompressed_file_folder_path = File.join(@compressed_file_folder_path, '/', DECOMPRESSED_FOLDER_NAME)
16
- @compressed_file_path = File.join(@compressed_file_folder_path, '/', "#{FOLDER_NAME}.zip")
16
+ @compressed_file_path = File.join(@compressed_file_folder_path, '/', "#{@folder_name}.zip")
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)
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
24
- @unit_test = Object.const_get(unit_test_class).new(FOLDER_PATH)
24
+ @unit_test = Object.const_get(unit_test_class).new(@folder_path)
25
25
  end
26
26
 
27
27
  def compress_folder
@@ -29,7 +29,12 @@ module Liri
29
29
  end
30
30
 
31
31
  def decompress_file(compressed_file_path = @compressed_file_path)
32
- @compressor.decompress(compressed_file_path, @decompressed_file_folder_path)
32
+ if File.exist?(compressed_file_path)
33
+ @compressor.decompress(compressed_file_path, @decompressed_file_folder_path)
34
+ Dir.exist?(@decompressed_file_folder_path) ? true : false
35
+ else
36
+ raise FileNotFoundError, compressed_file_path
37
+ end
33
38
  end
34
39
 
35
40
  def delete_compressed_file
@@ -41,12 +46,17 @@ module Liri
41
46
  end
42
47
  end
43
48
 
44
- def all_tests
45
- @unit_test.all_tests
49
+ def delete_decompressed_file_folder_path
50
+ if Dir.exist?(@decompressed_file_folder_path)
51
+ FileUtils.rm_rf(@decompressed_file_folder_path)
52
+ Dir.exist?(@decompressed_file_folder_path) ? false : true
53
+ else
54
+ false
55
+ end
46
56
  end
47
57
 
48
- def folder_path
49
- FOLDER_PATH
58
+ def all_tests
59
+ @unit_test.all_tests
50
60
  end
51
61
  end
52
62
  end