diff --git a/app/Http/Controllers/ExercicioController.php b/app/Http/Controllers/ExercicioController.php
index 2fbfed7..6bf6841 100644
--- a/app/Http/Controllers/ExercicioController.php
+++ b/app/Http/Controllers/ExercicioController.php
@@ -30,13 +30,13 @@ class ExercicioController extends Controller
*/
public function index()
{
- $exercicios = Exercicio::orderBy('name');
- /** @var App\Models\User */
- $user = Auth::user();
- if(!$user || !$user->isAdmin()) {
+ $exercicios = Exercicio::orderBy('name');
+ /** @var \App\Models\User */
+ $user = Auth::user();
+ if (!$user || !$user->isAdmin()) {
$exercicios = $exercicios->published();
}
- return View('exercicio.index')->with('exercicios',$exercicios->get());
+ return View('exercicio.index')->with('exercicios', $exercicios->get());
}
/**
@@ -47,8 +47,8 @@ public function index()
public function create()
{
$this->authorize('create', Exercicio::class);
- return View('exercicio.create')->with('pacotesR',$this->getInstalledPackages());
- }
+ return View('exercicio.create')->with('pacotesR', $this->getInstalledPackages());
+ }
/**
* Store a newly created resource in storage.
@@ -56,15 +56,16 @@ public function create()
* @param \Illuminate\Http\Request $request
* @return mixed
*/
- private function validateExercicio (Request $request, Exercicio|Null $exercicio) {
+ private function validateExercicio(Request $request, Exercicio|null $exercicio)
+ {
$rules = array(
- 'name' => 'required|string|unique:exercicios'.($exercicio ? ',name,'.$exercicio->id : ''),
- 'description'=> 'required',
- 'precondicoes'=>'sometimes',
- 'dicas' => 'array',
+ 'name' => 'required|string|unique:exercicios' . ($exercicio ? ',name,' . $exercicio->id : ''),
+ 'description' => 'required',
+ 'precondicoes' => 'sometimes',
+ 'dicas' => 'array',
'condicoes' => 'array',
'pesos' => 'array',
- 'dicas.*' => 'required',
+ 'dicas.*' => 'required',
'condicoes.*' => 'required',
'pesos.*' => 'required|numeric|min:0',
'draft' => 'required|boolean',
@@ -72,116 +73,121 @@ private function validateExercicio (Request $request, Exercicio|Null $exercicio)
$data = $request->validate($rules);
// corrigir EOL
- $data['precondicoes'] = str_replace("\r\n","\n",$data['precondicoes']);
- $data['description'] = str_replace("\r\n","\n",$data['description']);
+ $data['precondicoes'] = str_replace("\r\n", "\n", $data['precondicoes']);
+ $data['description'] = str_replace("\r\n", "\n", $data['description']);
- return $data;
- }
+ return $data;
+ }
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
- * @return \Illuminate\Http\Response
+ * @return \Illuminate\Http\RedirectResponse
*/
public function store(Request $request)
{
- $this->authorize('create', Exercicio::class);
+ $this->authorize('create', Exercicio::class);
- $data = $this->validateExercicio($request, null);
+ $data = $this->validateExercicio($request, null);
// store
$exercicio = new Exercicio($data);
- DB::transaction(function() use ($data, $exercicio) {
+ DB::transaction(function () use ($data, $exercicio) {
$exercicio->save();
$n = count($data['dicas']);
for ($i = 0; $i < $n; $i++) {
- Teste::create(['condicao' => $data['condicoes'][$i],
- 'dica' => $data['dicas'][$i],
- 'peso' => $data['pesos'][$i],
- 'exercicio_id' => $exercicio->id
- ]);
+ Teste::create([
+ 'condicao' => $data['condicoes'][$i],
+ 'dica' => $data['dicas'][$i],
+ 'peso' => $data['pesos'][$i],
+ 'exercicio_id' => $exercicio->id
+ ]);
}
- });
+ });
- $test = $this->corretoR($exercicio, "/usr/local/src/notar/runtest.R");
- if ($test['status']=='danger') {
- return redirect()->action([ExercicioController::class,'edit'],['exercicio' => $exercicio])
- ->withErrors(['precondicoes' => 'Ocorreu um erro ao testar as precondições.']);
- }
+ $test = $this->corretoR($exercicio, "/usr/local/src/notar/runtest.R");
+ if ($test['status'] == 'danger') {
+ return redirect()->action(
+ [ExercicioController::class, 'edit'],
+ ['exercicio' => $exercicio]
+ )->withErrors(
+ ['precondicoes' => 'Ocorreu um erro ao testar as precondições.']
+ );
+ }
- return redirect()->action([ExercicioController::class,'show'],['exercicio' => $exercicio]);
+ return redirect()->action([ExercicioController::class, 'show'], ['exercicio' => $exercicio]);
}
/**
* Show the profile of a given Exercicio.
*
- * @param \App\Models\Exercicio $exercicio
+ * @param \App\Models\Exercicio $exercicio
* @return \Illuminate\View\View
*/
public function show(Exercicio $exercicio)
{
$this->authorize('view', $exercicio);
- $prazo = Auth::user() ? Auth::user()->prazo($exercicio) : false;
+ $prazo = Auth::user() ? Auth::user()->prazo($exercicio) : false;
- return View('exercicio.show')->with('exercicio',$exercicio)
- ->with('foraDoPrazo', $prazo ? $prazo->prazo <= now() : false);
+ return View('exercicio.show')->with('exercicio', $exercicio)
+ ->with('foraDoPrazo', $prazo ? $prazo->prazo <= now() : false);
}
/**
* Retorna uma lista de pacotes instalados no ambiente R
*
- * @return Array
+ * @return array | null
*/
- private function getInstalledPackages () {
- try {
- $cnx = new Connection('r');
-
- $rcode = 'pkgs <- installed.packages();'
- . 'pkgs[,1];'
- ;
- // resposta do R
- $r = $cnx->evalString($rcode);
-
- return ($r);
- }
- catch (Exception $e) {
- Log::error('Erro de conexão em getInstalledPackages');
- return null;
- }
+ private function getInstalledPackages()
+ {
+ try {
+ $cnx = new Connection('r');
+
+ $rcode = 'pkgs <- installed.packages();'
+ . 'pkgs[,1];'
+ ;
+ // resposta do R
+ $r = $cnx->evalString($rcode);
+
+ return ($r);
+ } catch (Exception $e) {
+ Log::error('Erro de conexão em getInstalledPackages');
+ return null;
+ }
}
/**
* Roda o corretoR usando o código
*
* @param Exercicio $exercicio
- * @param string $codigo
- * @return Array
+ * @param string $codigo
+ * @return array
*/
- private function corretoR (Exercicio $exercicio, string $file) {
+ private function corretoR(Exercicio $exercicio, string $file)
+ {
// resposta do R
try {
$cnx = new Connection('r');
$rcode = 'source("/usr/local/src/notar/corretor.R");'
- // database auth
- . 'dbusr <- "'. env('DB_USERNAME') . '";'
- . 'dbpass <- "'. env('DB_PASSWORD') . '";'
- . 'dbname <- "'. env('DB_DATABASE') . '";'
- . 'con <- connect(dbusr, dbpass, dbname);'
- // import files
- . 'file.copy(list.files("/arquivos/",recursive=TRUE,full.names=TRUE),".");'
- // run corretoR
- . 'res <- notaR('. $exercicio->id .',"'.$file.'");'
- . 'unlink("*",recursive=TRUE);'
- . 'res;'
- ;
+ // database auth
+ . 'dbusr <- "' . env('DB_USERNAME') . '";'
+ . 'dbpass <- "' . env('DB_PASSWORD') . '";'
+ . 'dbname <- "' . env('DB_DATABASE') . '";'
+ . 'con <- connect(dbusr, dbpass, dbname);'
+ // import files
+ . 'file.copy(list.files("/arquivos/",recursive=TRUE,full.names=TRUE),".");'
+ // run corretoR
+ . 'res <- notaR(' . $exercicio->id . ',"' . $file . '");'
+ . 'unlink("*",recursive=TRUE);'
+ . 'res;'
+ ;
$r = $cnx->evalString($rcode);
- }
- catch (RserveException $e){
+ } catch (RserveException $e) {
return [
'status' => 'danger',
- 'mensagem' => 'Ocorreu um erro na correção do exercício! Por favor verifique seu código ou contate um administrador.' ,
+ 'mensagem' => 'Ocorreu um erro na correção do exercício! Por favor verifique seu código ou contate um administrador.',
'resultado' => null,
'nota' => 0
];
@@ -191,23 +197,23 @@ private function corretoR (Exercicio $exercicio, string $file) {
if ($r === null) {
return [
'status' => 'danger',
- 'mensagem' => 'Ocorreu um erro na execução do seu código! Corrija e tente novamente.' ,
+ 'mensagem' => 'Ocorreu um erro na execução do seu código! Corrija e tente novamente.',
'resultado' => $r,
'nota' => 0
];
}
// garantee that $r is an array ffs
- if(is_bool($r)) {
+ if (is_bool($r)) {
$r = [$r];
}
// 100%
- if(in_array(false, $r, true) === false) {
+ if (in_array(false, $r, true) === false) {
return [
'status' => 'success',
'mensagem' => 'Parabéns! Seu código passou em todos os testes!
'
- . 'Toca aqui!',
+ . 'Toca aqui!',
'resultado' => $r,
'nota' => 100
];
@@ -218,17 +224,16 @@ private function corretoR (Exercicio $exercicio, string $file) {
// calcula nota
$nota = 0;
$firstmistake = -1;
- for($i = 0; $ipeso;
- }
- else if ($firstmistake == -1) {
+ } else if ($firstmistake == -1) {
$firstmistake = $i;
}
}
$dica = $testes[$firstmistake]->dica;
$notamax = $testes->sum('peso');
- $notanormalizada = 100*$nota/$notamax;
+ $notanormalizada = 100 * $nota / $notamax;
return [
'status' => 'warning',
@@ -243,7 +248,7 @@ private function corretoR (Exercicio $exercicio, string $file) {
* Ação de fazer exercício usando o form
*
* @param \Illuminate\Http\Request $request
- * @param \App\Models\Exercicio $exercicio
+ * @param \App\Models\Exercicio $exercicio
* @return \Illuminate\View\View
*/
public function submit(Request $request, Exercicio $exercicio)
@@ -253,15 +258,15 @@ public function submit(Request $request, Exercicio $exercicio)
);
$data = $request->validate($rules);
- $validator = Validator::make($request->all(), $rules);
- return $this->recebeCodigo($data['codigo'], $exercicio, $validator);
- }
+ $validator = Validator::make($request->all(), $rules);
+ return $this->recebeCodigo($data['codigo'], $exercicio, $validator);
+ }
/**
* Ação de fazer exercício usando file upload
*
* @param \Illuminate\Http\Request $request
- * @param \App\Models\Exercicio $exercicio
+ * @param \App\Models\Exercicio $exercicio
* @return \Illuminate\View\View
*/
public function upload(Request $request, Exercicio $exercicio)
@@ -273,259 +278,269 @@ public function upload(Request $request, Exercicio $exercicio)
$validator = Validator::make($request->all(), $rules);
- $codigo = $request->file('file')->get();
- // convert to
- $codigo = Encoding::toUTF8($codigo);
- return $this->recebeCodigo($codigo, $exercicio, $validator);
+ $codigo = $request->file('file')->get();
+ // convert to
+ $codigo = Encoding::toUTF8($codigo);
+ return $this->recebeCodigo($codigo, $exercicio, $validator);
}
- private function recebeCodigo (String $codigo, Exercicio $exercicio, \Illuminate\Contracts\Validation\Validator $validator) {
+ private function recebeCodigo(string $codigo, Exercicio $exercicio, \Illuminate\Contracts\Validation\Validator $validator)
+ {
- $user = Auth::user();
- if($user) {
- Log::info('User '.$user->id.' submitted an answer to exercise '.$exercicio->id);
- }
- else {
- Log::info('Guest submitted an answer to exercise '.$exercicio->id);
- }
+ $user = Auth::user();
+ if ($user) {
+ Log::info('User ' . $user->id . ' submitted an answer to exercise ' . $exercicio->id);
+ } else {
+ Log::info('Guest submitted an answer to exercise ' . $exercicio->id);
+ }
- $validator->after(function ($validator) use($codigo) {
- foreach(Impedimento::all()->pluck('palavra') as $palavra) {
- if (Str::contains($codigo,$palavra)) {
+ $validator->after(function ($validator) use ($codigo) {
+ foreach (Impedimento::all()->pluck('palavra') as $palavra) {
+ if (Str::contains($codigo, $palavra)) {
$validator->errors()->add(
- 'codigo', 'Código não pode conter a palavra: '.$palavra
+ 'codigo',
+ 'Código não pode conter a palavra: ' . $palavra
);
}
}
});
- if ($validator->fails()) {
- return redirect(URL::to('exercicio/'.$exercicio->id))
- ->withErrors($validator)
- ->withInput();
- }
+ if ($validator->fails()) {
+ return redirect(URL::to('exercicio/' . $exercicio->id))
+ ->withErrors($validator)
+ ->withInput();
+ }
// corrigir EOL
- $codigo = str_replace("\r\n","\n",$codigo);
+ $codigo = str_replace("\r\n", PHP_EOL, $codigo).PHP_EOL;
// salva um arquivo com o codigo
$tempfile = TmpFile::generateTmpFileName(md5($codigo), '.R');
Storage::put($tempfile, $codigo);
// corrige
- $respostaR = $this->corretoR($exercicio,$tempfile);
+ $respostaR = $this->corretoR($exercicio, $tempfile);
// deleta arquivo temporário
Storage::delete($tempfile);
// salvar nota no banco de dados
- if($user && !$exercicio->draft) {
+ if ($user && !$exercicio->draft) {
$exercicio->notas()->create([
'nota' => $respostaR['nota'],
'user_id' => $user->id,
'testes' => $respostaR['resultado'],
'codigo' => $codigo
]);
- }
+ }
- $prazo = $user ? $user->prazo($exercicio) : false;
+ $prazo = $user ? $user->prazo($exercicio) : false;
return View('exercicio.show')->with('exercicio', $exercicio)
- ->with('foraDoPrazo', $prazo ? $prazo->prazo <= now() : false)
- ->with('respostaR', $respostaR)
- ->with('codigo', $codigo);
+ ->with('foraDoPrazo', $prazo ? $prazo->prazo <= now() : false)
+ ->with('respostaR', $respostaR)
+ ->with('codigo', $codigo);
}
/**
* Show the form for editing the specified resource.
*
- * @param \App\Models\Exercicio $exercicio
+ * @param \App\Models\Exercicio $exercicio
* @return \Illuminate\Http\Response
*/
public function edit(Exercicio $exercicio)
{
$this->authorize('edit', $exercicio);
- return View('exercicio.edit')->with('exercicio',$exercicio)->with('exercicio.testes',$exercicio->testes)->with('pacotesR',$this->getInstalledPackages());
+ return View('exercicio.edit')->with('exercicio', $exercicio)->with('exercicio.testes', $exercicio->testes)->with('pacotesR', $this->getInstalledPackages());
}
- /**
- * Update the specified resource in storage.
- *
- * @param \Illuminate\Http\Request $request
- * @param \App\Models\Exercicio $exercicio
- * @return \Illuminate\Http\Response
- */
- public function update(Request $request, Exercicio $exercicio)
- {
- $this->authorize('edit',$exercicio);
- $data = $this->validateExercicio($request, $exercicio);
+ /**
+ * Update the specified resource in storage.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param \App\Models\Exercicio $exercicio
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function update(Request $request, Exercicio $exercicio)
+ {
+ $this->authorize('edit', $exercicio);
+ $data = $this->validateExercicio($request, $exercicio);
// store
- DB::transaction(function() use ($data, $exercicio) {
+ DB::transaction(function () use ($data, $exercicio) {
$exercicio->update($data);
$exercicio->testes()->delete(); // delete all testes because we're lazy
$n = count($data['dicas']);
for ($i = 0; $i < $n; $i++) {
- $teste = Teste::create(['condicao' => $data['condicoes'][$i],
- 'dica' => $data['dicas'][$i],
- 'peso' => $data['pesos'][$i],
- 'exercicio_id' => $exercicio->id
- ]);
+ $teste = Teste::create([
+ 'condicao' => $data['condicoes'][$i],
+ 'dica' => $data['dicas'][$i],
+ 'peso' => $data['pesos'][$i],
+ 'exercicio_id' => $exercicio->id
+ ]);
}
});
- // testa as preconds
- $test = $this->corretoR($exercicio, "/usr/local/src/notar/runtest.R");
- if ($test['status']=='danger') {
- return redirect()->action([ExercicioController::class,'edit'],['exercicio' => $exercicio])
- ->withErrors(['precondicoes' => 'Ocorreu um erro ao testar as precondições.']);
- }
+ // testa as preconds
+ $test = $this->corretoR($exercicio, "/usr/local/src/notar/runtest.R");
+ if ($test['status'] == 'danger') {
+ return redirect()->action(
+ [ExercicioController::class, 'edit'],
+ ['exercicio' => $exercicio]
+ )->withErrors(
+ ['precondicoes' => 'Ocorreu um erro ao testar as precondições.']
+ );
+ }
- return redirect()->action([ExercicioController::class,'show'],['exercicio' => $exercicio]);
- }
+ return redirect()->action(
+ [ExercicioController::class, 'show'],
+ ['exercicio' => $exercicio]
+ );
+ }
/**
* Export to text file
*
- * @param int $id
+ * @param int $id
* @return \Illuminate\Http\Response
*/
public function export(int $id)
{
- $exercicio = Exercicio::with('testes')->find($id);
- $this->authorize('edit', $exercicio);
-
- try
- {
- $filename = TmpFile::generateTmpFileName('notaR_exercicio'.$exercicio->name,'.yaml');
- Storage::put($filename, $exercicio->export());
- }
- catch (Exception $e)
- {
- return back()->withErrors('Erro ao exportar exercício.');
- };
+ $exercicio = Exercicio::with('testes')->find($id);
+ $this->authorize('edit', $exercicio);
+
+ try {
+ $filename = TmpFile::generateTmpFileName('notaR_exercicio' . $exercicio->name, '.yaml');
+ Storage::put($filename, $exercicio->export());
+ } catch (Exception $e) {
+ return back()->withErrors('Erro ao exportar exercício.');
+ }
+ ;
+ return response()->download($filename)->deleteFileAfterSend(true);
+ }
+
+ /** Export all exercicios
+ *
+ * @return \Illuminate\Http\Response
+ */
+ public function exportAll()
+ {
+ $this->authorize('bulk', Exercicio::class);
+
+ // Create files for each model
+ // Create a file containing all of that
+ $exercicios = Exercicio::with('testes')->get();
+ $filename = TmpFile::generateTmpFileName('notaR_exercicios', '.zip');
+
+ try {
+ $zip = new ZipArchive;
+ if ($zip->open($filename, ZipArchive::CREATE) === TRUE) {
+ foreach ($exercicios as $key => $value) {
+ $fn = Str::slug($value->name) . '.yaml';
+ $zip->addFromString($fn, $value->export());
+ }
+ $zip->close();
+ }
+ } catch (Exception $e) {
+ return back()->withErrors('Erro ao exportar exercícios.');
+ }
+ ;
return response()->download($filename)->deleteFileAfterSend(true);
- }
-
- /** Export all exercicios
- *
- * @return \Illuminate\Http\Response
- */
- public function exportAll ()
- {
- $this->authorize('bulk', Exercicio::class);
-
- // Create files for each model
- // Create a file containing all of that
- $exercicios = Exercicio::with('testes')->get();
- $filename = TmpFile::generateTmpFileName('notaR_exercicios','.zip');
-
- try
- {
- $zip = new ZipArchive;
- if ($zip->open($filename, ZipArchive::CREATE) === TRUE) {
- foreach ($exercicios as $key => $value) {
- $fn = Str::slug($value->name).'.yaml';
- $zip->addFromString($fn, $value->export());
- }
- $zip->close();
- }
- }
- catch (Exception $e)
- {
- return back()->withErrors('Erro ao exportar exercícios.');
- };
- return response()->download($filename)->deleteFileAfterSend(true);
- }
-
- private function importInput ($data) {
- $input = ['from_import' => true];
- if (property_exists($data,'testes')) {
- $testes = collect($data->testes);
- $input = [
- 'dicas' => $testes->pluck('dica'),
- 'condicoes' => $testes->pluck('condicao'),
- 'pesos' => $testes->pluck('peso'),
- 'from_import' => true
- ];
- }
-
- if (property_exists($data, 'name')) {
- $input['name'] = $data->name;
- }
-
- if (property_exists($data, 'description')) {
- $input['description'] = $data->description;
- }
-
- if (property_exists($data, 'precondicoes')) {
- $input['precondicoes'] = $data->precondicoes;
- }
-
- return $input;
- }
+ }
+
+ private function importInput($data)
+ {
+ $input = ['from_import' => true];
+ if (property_exists($data, 'testes')) {
+ $testes = collect($data->testes);
+ $input = [
+ 'dicas' => $testes->pluck('dica'),
+ 'condicoes' => $testes->pluck('condicao'),
+ 'pesos' => $testes->pluck('peso'),
+ 'from_import' => true
+ ];
+ }
+
+ if (property_exists($data, 'name')) {
+ $input['name'] = $data->name;
+ }
+
+ if (property_exists($data, 'description')) {
+ $input['description'] = $data->description;
+ }
+
+ if (property_exists($data, 'precondicoes')) {
+ $input['precondicoes'] = $data->precondicoes;
+ }
+
+ return $input;
+ }
/**
* Import from yaml file
*
- * @param \Illuminate\Http\Request $request
- * @param \App\Models\Exercicio $exercicio
- * @return \Illuminate\Http\Response
- */
- public function importEdit (Request $request, Exercicio $exercicio)
+ * @param \Illuminate\Http\Request $request
+ * @param \App\Models\Exercicio $exercicio
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function importEdit(Request $request, Exercicio $exercicio)
{
- $this->authorize('edit', $exercicio);
- $request->validate([
- 'file' => 'required',
- ]);
+ $this->authorize('edit', $exercicio);
+ $request->validate([
+ 'file' => 'required',
+ ]);
+
+ $j = $request->file('file')->get();
+
+ $data = Yaml::parse($j);
+ if (is_null($data)) {
+ return redirect()->action(
+ [ExercicioController::class, 'edit'],
+ ['exercicio' => $exercicio]
+ )->withErrors(['file' => 'O arquivo enviado não é um json válido']);
+ }
- $j = $request->file('file')->get();
+ return redirect()->action(
+ [ExercicioController::class, 'edit'],
+ ['exercicio' => $exercicio]
+ )->withInput($this->importInput((object) $data));
+ }
- $data = Yaml::parse($j);
- if( is_null($data)) {
- return redirect()->action([ExercicioController::class,'edit'],['exercicio' => $exercicio])
- ->withErrors(['file' => 'O arquivo enviado não é um json válido']);
- }
- return redirect()->action([ExercicioController::class,'edit'],['exercicio' => $exercicio])
- ->withInput($this->importInput((object)$data));
- }
+ /**
+ * Import from json file
+ *
+ * @param \Illuminate\Http\Request $request
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function import(Request $request)
+ {
+ $this->authorize('create', Exercicio::class);
+ $request->validate([
+ 'file' => 'required',
+ ]);
+
+ $j = $request->file('file')->get();
+
+ $data = Yaml::parse($j);
+ if (is_null($data)) {
+ return redirect()->action([ExercicioController::class, 'create'])
+ ->withErrors(['file' => 'O arquivo enviado não é um yaml válido']);
+ }
+
+ return redirect()->action([ExercicioController::class, 'create'])
+ ->withInput($this->importInput((object) $data));
+ }
/**
- * Import from json file
+ * Remove the specified resource from storage.
*
- * @param \Illuminate\Http\Request $request
- * @return \Illuminate\Http\Response
- */
- public function import (Request $request)
+ * @param \App\Models\Exercicio $exercicio
+ * @return \Illuminate\Http\Response
+ */
+ public function destroy(Exercicio $exercicio)
{
- $this->authorize('create', Exercicio::class );
- $request->validate([
- 'file' => 'required',
- ]);
-
- $j = $request->file('file')->get();
-
- $data = Yaml::parse($j);
- if( is_null($data)) {
- return redirect()->action([ExercicioController::class,'create'])
- ->withErrors(['file' => 'O arquivo enviado não é um yaml válido']);
- }
-
- return redirect()->action([ExercicioController::class,'create'])
- ->withInput($this->importInput((object) $data));
- }
-
-
- /**
- * Remove the specified resource from storage.
- *
- * @param \App\Models\Exercicio $exercicio
- * @return \Illuminate\Http\Response
- */
- public function destroy(Exercicio $exercicio)
- {
- $this->authorize('delete', $exercicio);
- $exercicio->testes()->delete();
- $exercicio->delete();
- return redirect()->action([ExercicioController::class,'index']);
- }
+ $this->authorize('delete', $exercicio);
+ $exercicio->testes()->delete();
+ $exercicio->delete();
+ return redirect()->action([ExercicioController::class, 'index']);
+ }
}
diff --git a/app/Http/Controllers/ImpedimentoController.php b/app/Http/Controllers/ImpedimentoController.php
index ed71b7c..7b16485 100644
--- a/app/Http/Controllers/ImpedimentoController.php
+++ b/app/Http/Controllers/ImpedimentoController.php
@@ -8,15 +8,15 @@
class ImpedimentoController extends Controller
{
- /**
- * List impedimentos.
- *
- * @return \Illuminate\Http\Response
- */
- public function index()
- {
+ /**
+ * List impedimentos.
+ *
+ * @return \Illuminate\Http\Response
+ */
+ public function index()
+ {
$this->authorize('view', Impedimento::class);
- return View('impedimento.index')->with('impedimentos',Impedimento::all());
+ return View('impedimento.index')->with('impedimentos', Impedimento::all());
}
/**
@@ -40,66 +40,66 @@ public function store(Request $request)
{
$this->authorize('create', Impedimento::class);
$rules = array(
- 'palavra' => 'required|string',
+ 'palavra' => 'required|string',
);
$data = $request->validate($rules);
// store
$impedimento = tap(new Impedimento($data))->save();
- return redirect()->action([ImpedimentoController::class,'index']);
+ return redirect()->action([ImpedimentoController::class, 'index']);
}
/**
* Show the profile of a given Impedimento.
*
- * @param App\Models\Impedimento $impedimento
+ * @param \App\Models\Impedimento $impedimento
* @return \Illuminate\View\View
*/
public function show(Impedimento $impedimento)
{
- return redirect()->action([ImpedimentoController::class,'index']);
+ return redirect()->action([ImpedimentoController::class, 'index']);
}
/**
* Show the form for editing the specified resource.
*
- * @param App\Models\Impedimento $impedimento
+ * @param \App\Models\Impedimento $impedimento
* @return \Illuminate\Http\Response
*/
public function edit(Impedimento $impedimento)
{
$this->authorize('edit', $impedimento);
- return View('impedimento.edit')->with('impedimento',$impedimento);
+ return View('impedimento.edit')->with('impedimento', $impedimento);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
- * @param App\Models\Impedimento $impedimento
+ * @param \App\Models\Impedimento $impedimento
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Impedimento $impedimento)
{
$this->authorize('edit', $impedimento);
$rules = array(
- 'palavra' => 'required|string',
+ 'palavra' => 'required|string',
);
$data = $request->validate($rules);
- $impedimento->update($data);
- return redirect()->action([get_class($this),'index']);
+ $impedimento->update($data);
+ return redirect()->action([get_class($this), 'index']);
}
/**
* Remove the specified resource from storage.
*
- * @param App\Models\Impedimento $impedimento
+ * @param \App\Models\Impedimento $impedimento
* @return \Illuminate\Http\Response
*/
public function destroy(Impedimento $impedimento)
{
$this->authorize('delete', $impedimento);
- $impedimento->delete();
- return redirect()->action([get_class($this),'index']);
+ $impedimento->delete();
+ return redirect()->action([get_class($this), 'index']);
}
}
diff --git a/docker/R/Dockerfile b/docker/R/Dockerfile
index d15e4c5..b991070 100644
--- a/docker/R/Dockerfile
+++ b/docker/R/Dockerfile
@@ -1,5 +1,5 @@
# Using a fixed version R to ensure consistency
-FROM r-base:4.3.2
+FROM r-base:4.4.0
# Install system dependencies
RUN apt-get update --fix-missing \
&& apt-get install -y --no-install-recommends \
diff --git a/docker/R/corretor.R b/docker/R/corretor.R
index 6ac6f94..40eea4e 100644
--- a/docker/R/corretor.R
+++ b/docker/R/corretor.R
@@ -7,7 +7,7 @@ connect <- function (dbuser, dbpass, dbname) {
con<- dbConnect(MySQL(), user=dbuser, password=dbpass, dbname=dbname, host='mysql')
return (con);
}
-# Construida na chamada PHP como
+# Construida na chamada PHP como
# con <- connect($DBUSER, $DBPASS, $DBNAME)
# Funcao acessoria para testar se um objeto MySQL nao tem resultados
@@ -15,8 +15,8 @@ no.results <- function(object) {
length(object[,1]) == 0
}
-# corretoR recebe:
-# texto
+# corretoR recebe:
+# texto
# E devolve um um vector logico com o resultado dos testes
# Caso o codigo tenha erros de sintaxe, retorna NULL
corretoR <- function (id.exerc, texto) {
@@ -29,16 +29,19 @@ corretoR <- function (id.exerc, texto) {
paste("SELECT condicao FROM testes
WHERE exercicio_id=", id.exerc,
" ORDER BY id ASC", sep=""));
- precondi <- dbGetQuery(con,
- paste("SELECT precondicoes FROM exercicios
+ precondi <- dbGetQuery(con,
+ paste("SELECT precondicoes FROM exercicios
WHERE id=", id.exerc, sep=""));
# Executa as precondicoes
if(!no.results(precondi)) eval(parse(text=precondi), envir=corrEnv);
# Executa o texto da resposta
+ getError <- try(eval(
+ c(parse(text=texto),"TRUE"), # Evita que o codigo retorne matrizes
+ envir=corrEnv
+ ));
# try pega erros de sintaxe
- getError <- try(eval(parse(text=texto), envir=corrEnv));
if (class(getError) == "try-error") return (NULL);
# Executa os testes cadastrados, sequencialmente
@@ -47,7 +50,7 @@ corretoR <- function (id.exerc, texto) {
for (i in 1:notaMax) {
# A avaliacao pode retornar TRUE, FALSE ou erro
# No momento, erro esta sendo tratado como FALSE
- # Edit fev 2013:
+ # Edit fev 2013:
# O [1] no final tem a funcao de evitar condicoes com comprimento 0.
# Agora essas condicoes se tornam [1] NA, que serao transformados em FALSE abaixo
notas[i] <- (try(eval(parse(text=testes[i,1]), envir=corrEnv))[1] == TRUE)[1];
@@ -68,7 +71,7 @@ notaR <- function (id.exerc, arquivo) {
return (nota);
}
-# Exemplos:
+# Exemplos:
# con <- connect('notaR', 'notaRPW', 'notaR')
# corretoR(1, "y<-1;x<-2")
# ou
diff --git a/storage/app/public/examples/breaking.R b/storage/app/public/examples/breaking.R
new file mode 100644
index 0000000..6d91790
--- /dev/null
+++ b/storage/app/public/examples/breaking.R
@@ -0,0 +1,5 @@
+# This should overwhelm any system
+
+m <- matrix(1:1000,nrow=1)
+while(TRUE)
+ m <- rbind(m,m)