rmayormartins commited on
Commit
d9000eb
·
1 Parent(s): ac643f4

JAVA-judge33

Browse files
Files changed (5) hide show
  1. README.md +72 -8
  2. app.py +513 -0
  3. requirements.txt +3 -0
  4. rubric.pdf +0 -0
  5. rubric_table.png +0 -0
README.md CHANGED
@@ -1,14 +1,78 @@
1
  ---
2
- title: Java Judge Syntax Competencies
3
- emoji: 🏢
4
- colorFrom: pink
5
- colorTo: blue
6
  sdk: gradio
7
- sdk_version: 5.9.1
8
  app_file: app.py
9
  pinned: false
10
- license: ecl-2.0
11
- short_description: 'Java Judge: Syntax & Competencies'
12
  ---
13
 
14
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: Java-Judge-Syntax-Competencies
3
+ emoji: ⚖️✏️☕♨️🖥️
4
+ colorFrom: blue
5
+ colorTo: green
6
  sdk: gradio
7
+ sdk_version: 4.7.1
8
  app_file: app.py
9
  pinned: false
10
+ license: mit
 
11
  ---
12
 
13
+ # Avaliador de POO em Java
14
+
15
+ Este projeto avalia códigos Java com base nos conceitos da Programação Orientada a Objetos (POO), fornecendo feedback detalhado e pontuações de acordo com duas rubricas bem definidas: **Estrutural** e **Competências**.
16
+
17
+ ## Desenvolvedor
18
+
19
+ Desenvolvido por Ramon Mayor Martins (2024)
20
+
21
+ - **Email**: rmayormartins@gmail.com
22
+ - **Homepage**: [rmayormartins.github.io](https://rmayormartins.github.io/)
23
+ - **Twitter**: [@rmayormartins](https://twitter.com/rmayormartins)
24
+ - **GitHub**: [github.com/rmayormartins](https://github.com/rmayormartins)
25
+ - **Space**: [Hugging Face Space](https://huggingface.co/rmayormartins)
26
+
27
+ ## Funcionalidades Principais
28
+
29
+ ### **Avaliação Estrutural**
30
+ - Detecta tipos primitivos, constantes e variáveis.
31
+ - Identifica estruturas de controle como `if/else`, `switch/case`, laços e operadores.
32
+ - Analisa operações de entrada e saída (e.g., `System.out.print`, `Scanner`).
33
+
34
+ ### **Avaliação por Competências**
35
+ - Examina a corretude sintática de estruturas básicas e elementos essenciais.
36
+ - Avalia competências como organização, clareza e resolução de problemas.
37
+ - Fornece feedback detalhado com base no uso de estruturas adequadas.
38
+
39
+ ### **Interface Amigável**
40
+ - Permite upload de múltiplos arquivos Java.
41
+ - Exibe resultados detalhados em abas separadas para cada tipo de avaliação.
42
+
43
+ ## Rubricas de Avaliação
44
+
45
+ ### Avaliação Estrutural
46
+
47
+ | Categoria | Pontos |
48
+ |------------------------|--------|
49
+ | Declarações e Tipos | 25 |
50
+ | Estruturas de Controle | 25 |
51
+ | Operadores e Expressões| 25 |
52
+ | Entrada e Saída | 25 |
53
+
54
+ ### Avaliação por Competências
55
+
56
+ | Categoria | Pontos |
57
+ |---------------------------|--------|
58
+ | Corretude Sintática | 50 |
59
+ | Competências Demonstradas | 50 |
60
+
61
+ > Para mais detalhes, visualize a rubrica completa no arquivo [rubric.pdf](rubric.pdf) ou confira a tabela resumida abaixo.
62
+
63
+ ![Tabela da Rubrica](rubric_table.png)
64
+
65
+ ## Como Usar
66
+
67
+ 1. Abra a interface do aplicativo.
68
+ 2. Escolha entre **Avaliação Estrutural** ou **Avaliação por Competências**.
69
+ 3. Envie um ou mais arquivos `.java`.
70
+ 4. Veja a pontuação e o feedback detalhado para cada arquivo.
71
+
72
+ ## Desenvolvimento Local
73
+
74
+ Para rodar localmente:
75
+
76
+ ```bash
77
+ pip install -r requirements.txt
78
+ python app.py
app.py ADDED
@@ -0,0 +1,513 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Instalação das dependências
2
+ !pip install -q javalang gradio
3
+
4
+ import gradio as gr
5
+ import javalang
6
+ from typing import Dict, List, Tuple
7
+ import re
8
+
9
+ class JavaStructuralEvaluator:
10
+ """Avaliador baseado em estruturas usadas"""
11
+ def __init__(self):
12
+ self.rubric = {
13
+ "declaracoes": 25, # Declarações e tipos
14
+ "estruturas_controle": 25, # if, switch, loops
15
+ "operadores": 25, # Operadores e expressões
16
+ "io_strings": 25 # System.out, concatenação, etc
17
+ }
18
+
19
+ def analyze_declarations(self, code: str) -> Tuple[float, List[str]]:
20
+ """Analisa declarações e tipos"""
21
+ score = 0
22
+ feedback = []
23
+
24
+ try:
25
+ tree = javalang.parse.parse(code)
26
+
27
+ # Verificar tipos primitivos
28
+ primitives = {
29
+ 'int': 'números inteiros',
30
+ 'double': 'números decimais',
31
+ 'boolean': 'valores lógicos',
32
+ 'char': 'caracteres',
33
+ 'float': 'números decimais (float)',
34
+ 'long': 'números longos',
35
+ 'byte': 'valores byte',
36
+ 'short': 'números curtos'
37
+ }
38
+
39
+ used_types = set()
40
+ for _, node in tree.filter(javalang.tree.LocalVariableDeclaration):
41
+ type_name = node.type.name
42
+ used_types.add(type_name)
43
+
44
+ for type_name, description in primitives.items():
45
+ if type_name in used_types:
46
+ score += 3
47
+ feedback.append(f"✓ Uso correto de {type_name} para {description}")
48
+
49
+ # Verificar declarações de variáveis
50
+ total_vars = len(list(tree.filter(javalang.tree.LocalVariableDeclaration)))
51
+ if total_vars > 0:
52
+ score += 5
53
+ feedback.append(f"✓ {total_vars} variáveis declaradas corretamente")
54
+
55
+ # Verificar constantes
56
+ constants = list(tree.filter(javalang.tree.FieldDeclaration))
57
+ if any('final' in node.modifiers for _, node in tree.filter(javalang.tree.FieldDeclaration)):
58
+ score += 4
59
+ feedback.append("✓ Uso adequado de constantes (final)")
60
+
61
+ except Exception as e:
62
+ feedback.append("⚠ Erro na análise de declarações")
63
+
64
+ return score, feedback
65
+
66
+ def analyze_control_structures(self, code: str) -> Tuple[float, List[str]]:
67
+ """Analisa estruturas de controle"""
68
+ score = 0
69
+ feedback = []
70
+
71
+ try:
72
+ tree = javalang.parse.parse(code)
73
+
74
+ # If/Else
75
+ if_count = len(list(tree.filter(javalang.tree.IfStatement)))
76
+ if if_count > 0:
77
+ score += 5
78
+ feedback.append(f"✓ Uso correto de {if_count} estrutura(s) if/else")
79
+
80
+ # Switch
81
+ switch_count = len(list(tree.filter(javalang.tree.SwitchStatement)))
82
+ if switch_count > 0:
83
+ score += 5
84
+ feedback.append(f"✓ Uso correto de {switch_count} switch/case")
85
+
86
+ # For loops
87
+ for_count = len(list(tree.filter(javalang.tree.ForStatement)))
88
+ if for_count > 0:
89
+ score += 5
90
+ feedback.append(f"✓ Uso correto de {for_count} loop(s) for")
91
+
92
+ # While loops
93
+ while_count = len(list(tree.filter(javalang.tree.WhileStatement)))
94
+ if while_count > 0:
95
+ score += 5
96
+ feedback.append(f"✓ Uso correto de {while_count} loop(s) while")
97
+
98
+ # Do-While loops
99
+ do_while_count = len(list(tree.filter(javalang.tree.DoStatement)))
100
+ if do_while_count > 0:
101
+ score += 5
102
+ feedback.append(f"✓ Uso correto de {do_while_count} loop(s) do-while")
103
+
104
+ except Exception as e:
105
+ feedback.append("⚠ Erro na análise de estruturas de controle")
106
+
107
+ return score, feedback
108
+
109
+ def analyze_operators(self, code: str) -> Tuple[float, List[str]]:
110
+ """Analisa operadores e expressões"""
111
+ score = 0
112
+ feedback = []
113
+
114
+ try:
115
+ # Operadores aritméticos
116
+ arithmetic = ['+', '-', '*', '/', '%']
117
+ for op in arithmetic:
118
+ if op in code:
119
+ score += 2
120
+ feedback.append(f"✓ Uso do operador aritmético {op}")
121
+
122
+ # Operadores de comparação
123
+ comparison = ['==', '!=', '>', '<', '>=', '<=']
124
+ for op in comparison:
125
+ if op in code:
126
+ score += 2
127
+ feedback.append(f"✓ Uso do operador de comparação {op}")
128
+
129
+ # Operadores lógicos
130
+ logical = ['&&', '||', '!']
131
+ for op in logical:
132
+ if op in code:
133
+ score += 2
134
+ feedback.append(f"✓ Uso do operador lógico {op}")
135
+
136
+ # Operadores de atribuição
137
+ assignment = ['+=', '-=', '*=', '/=']
138
+ for op in assignment:
139
+ if op in code:
140
+ score += 2
141
+ feedback.append(f"✓ Uso do operador de atribuição {op}")
142
+
143
+ except Exception as e:
144
+ feedback.append("⚠ Erro na análise de operadores")
145
+
146
+ return score, feedback
147
+
148
+ def analyze_io_strings(self, code: str) -> Tuple[float, List[str]]:
149
+ """Analisa entrada/saída e manipulação de strings"""
150
+ score = 0
151
+ feedback = []
152
+
153
+ try:
154
+ # System.out
155
+ if 'System.out.print' in code:
156
+ score += 5
157
+ feedback.append("✓ Uso correto de System.out.print")
158
+
159
+ # Scanner
160
+ if 'Scanner' in code:
161
+ score += 5
162
+ feedback.append("✓ Uso correto da classe Scanner para entrada")
163
+
164
+ # Concatenação de strings
165
+ if '+' in code and '"' in code:
166
+ score += 5
167
+ feedback.append("✓ Concatenação de strings com operador +")
168
+
169
+ # Métodos de String
170
+ string_methods = ['concat', 'substring', 'length', 'equals', 'compareTo']
171
+ for method in string_methods:
172
+ if f'.{method}(' in code:
173
+ score += 2
174
+ feedback.append(f"✓ Uso do método String.{method}")
175
+
176
+ except Exception as e:
177
+ feedback.append("⚠ Erro na análise de I/O e strings")
178
+
179
+ return score, feedback
180
+
181
+ def evaluate_code(self, code: str) -> Dict:
182
+ """Avalia o código Java"""
183
+ # Análises individuais
184
+ decl_score, decl_feedback = self.analyze_declarations(code)
185
+ ctrl_score, ctrl_feedback = self.analyze_control_structures(code)
186
+ op_score, op_feedback = self.analyze_operators(code)
187
+ io_score, io_feedback = self.analyze_io_strings(code)
188
+
189
+ # Calcular pontuação total
190
+ total_score = sum([
191
+ decl_score,
192
+ ctrl_score,
193
+ op_score,
194
+ io_score
195
+ ])
196
+
197
+ # Normalizar para 100
198
+ total_score = min(100, total_score)
199
+
200
+ # Determinar nível
201
+ proficiency = "Necessita Melhorias"
202
+ if total_score >= 90:
203
+ proficiency = "Excelente"
204
+ elif total_score >= 75:
205
+ proficiency = "Bom"
206
+ elif total_score >= 60:
207
+ proficiency = "Satisfatório"
208
+
209
+ return {
210
+ "total_score": total_score,
211
+ "proficiency": proficiency,
212
+ "feedback": {
213
+ "declaracoes": decl_feedback,
214
+ "estruturas_controle": ctrl_feedback,
215
+ "operadores": op_feedback,
216
+ "io_strings": io_feedback
217
+ }
218
+ }
219
+
220
+ class CompetencyEvaluator:
221
+ """Avaliador baseado em competências"""
222
+ def __init__(self):
223
+ self.rubric = {
224
+ "syntax_correctness": 50, # Corretude sintática
225
+ "competencies": 50 # Competências demonstradas
226
+ }
227
+
228
+ def analyze_syntax_correctness(self, code: str) -> Tuple[float, List[str]]:
229
+ """Analisa corretude sintática (50 pontos)"""
230
+ score = 0
231
+ feedback = []
232
+
233
+ try:
234
+ tree = javalang.parse.parse(code)
235
+
236
+ # 1. Estrutura básica do programa (10 pontos)
237
+ if 'class' in code:
238
+ score += 5
239
+ feedback.append("✓ Estrutura de classe correta")
240
+ if 'public static void main' in code:
241
+ score += 5
242
+ feedback.append("✓ Método main corretamente declarado")
243
+
244
+ # 2. Declarações e Tipos (10 pontos)
245
+ declarations = list(tree.filter(javalang.tree.LocalVariableDeclaration))
246
+ if declarations:
247
+ score += 5
248
+ feedback.append("✓ Declarações de variáveis sintáticamente corretas")
249
+ if any(d.type.name in ['int', 'double', 'String', 'boolean'] for d in declarations):
250
+ score += 5
251
+ feedback.append("✓ Tipos de dados usados corretamente")
252
+
253
+ # 3. Expressões e Operadores (10 pontos)
254
+ if list(tree.filter(javalang.tree.BinaryOperation)):
255
+ score += 10
256
+ feedback.append("✓ Expressões e operadores usados corretamente")
257
+
258
+ # 4. Blocos e Estruturas (10 pontos)
259
+ open_braces = code.count('{')
260
+ close_braces = code.count('}')
261
+ if open_braces == close_braces and open_braces > 0:
262
+ score += 5
263
+ feedback.append("✓ Blocos corretamente delimitados")
264
+
265
+ semicolons = len(re.findall(';[^;]*$', code, re.MULTILINE))
266
+ if semicolons > 0:
267
+ score += 5
268
+ feedback.append("✓ Instruções corretamente terminadas")
269
+
270
+ # 5. Entrada/Saída (10 pontos)
271
+ if 'System.out' in code:
272
+ score += 5
273
+ feedback.append("✓ Sintaxe de saída correta")
274
+ if 'Scanner' in code:
275
+ score += 5
276
+ feedback.append("✓ Sintaxe de entrada correta")
277
+
278
+ except Exception as e:
279
+ feedback.append(f"⚠ Erro de sintaxe: {str(e)}")
280
+
281
+ return score, feedback
282
+
283
+ def analyze_competencies(self, code: str) -> Tuple[float, List[str]]:
284
+ """Analisa competências demonstradas (50 pontos)"""
285
+ score = 0
286
+ feedback = []
287
+
288
+ try:
289
+ tree = javalang.parse.parse(code)
290
+
291
+ # 1. Seleção de Estruturas (15 pontos)
292
+ structures = {
293
+ 'if': list(tree.filter(javalang.tree.IfStatement)),
294
+ 'for': list(tree.filter(javalang.tree.ForStatement)),
295
+ 'while': list(tree.filter(javalang.tree.WhileStatement))
296
+ }
297
+
298
+ appropriate_use = True
299
+ for struct_type, instances in structures.items():
300
+ if instances:
301
+ if struct_type == 'for' and any('length' in str(inst) for inst in instances):
302
+ score += 5
303
+ feedback.append("✓ Uso adequado de for para iteração em arrays")
304
+ elif struct_type == 'while' and any('hasNext' in str(inst) for inst in instances):
305
+ score += 5
306
+ feedback.append("✓ Uso adequado de while para leitura de dados")
307
+ else:
308
+ score += 5
309
+ feedback.append(f"✓ Uso apropriado de {struct_type}")
310
+
311
+ # 2. Manipulação de Dados (15 pontos)
312
+ operations = list(tree.filter(javalang.tree.BinaryOperation))
313
+ if operations:
314
+ if any(op.operator in ['*', '/', '+', '-'] for op in operations):
315
+ score += 5
316
+ feedback.append("✓ Cálculos implementados corretamente")
317
+ if any(op.operator in ['>', '<', '>=', '<=', '=='] for op in operations):
318
+ score += 5
319
+ feedback.append("✓ Comparações implementadas corretamente")
320
+ if any('=' in str(op) for op in operations):
321
+ score += 5
322
+ feedback.append("✓ Atribuições implementadas corretamente")
323
+
324
+ # 3. Clareza e Organização (10 pontos)
325
+ # Verificar nomes significativos
326
+ if all(len(decl.declarators[0].name) > 1 for _, decl in tree.filter(javalang.tree.LocalVariableDeclaration)):
327
+ score += 5
328
+ feedback.append("✓ Nomes de variáveis significativos")
329
+
330
+ # Verificar indentação e comentários
331
+ lines = code.split('\n')
332
+ if any('//' in line or '/*' in line for line in lines):
333
+ score += 5
334
+ feedback.append("✓ Código bem documentado")
335
+
336
+ # 4. Resolução do Problema (10 pontos)
337
+ # Verificar se tem entrada, processamento e saída
338
+ has_input = 'Scanner' in code
339
+ has_processing = bool(operations)
340
+ has_output = 'System.out' in code
341
+
342
+ if has_input and has_output:
343
+ score += 5
344
+ feedback.append("✓ Programa com entrada e saída")
345
+ if has_processing:
346
+ score += 5
347
+ feedback.append("✓ Lógica de processamento implementada")
348
+
349
+ except Exception as e:
350
+ feedback.append(f"⚠ Erro na análise de competências: {str(e)}")
351
+
352
+ return score, feedback
353
+
354
+ def evaluate_code(self, code: str) -> Dict:
355
+ # Análises individuais
356
+ syntax_score, syntax_feedback = self.analyze_syntax_correctness(code)
357
+ comp_score, comp_feedback = self.analyze_competencies(code)
358
+
359
+ # Calcular pontuação total
360
+ total_score = syntax_score + comp_score
361
+
362
+ # Determinar nível
363
+ proficiency = "Necessita Melhorias"
364
+ if total_score >= 90:
365
+ proficiency = "Excelente"
366
+ elif total_score >= 75:
367
+ proficiency = "Bom"
368
+ elif total_score >= 60:
369
+ proficiency = "Satisfatório"
370
+
371
+ return {
372
+ "total_score": total_score,
373
+ "proficiency": proficiency,
374
+ "feedback": {
375
+ "corretude_sintatica": syntax_feedback,
376
+ "competencias": comp_feedback
377
+ }
378
+ }
379
+
380
+ def process_java_files(files) -> str:
381
+ """Avalia código usando a rubrica estrutural"""
382
+ evaluator = JavaStructuralEvaluator()
383
+ return evaluate_files(files, evaluator, "Estrutural")
384
+
385
+ def evaluate_competency(files) -> str:
386
+ """Avalia código usando a rubrica de competências"""
387
+ evaluator = CompetencyEvaluator()
388
+ return evaluate_files(files, evaluator, "Competências")
389
+
390
+ def evaluate_files(files, evaluator, evaluation_type: str) -> str:
391
+ """Função auxiliar para avaliar arquivos com qualquer avaliador"""
392
+ results = []
393
+ project_files = {}
394
+
395
+ try:
396
+ if not isinstance(files, list):
397
+ files = [files]
398
+
399
+ # Primeiro, vamos ler todos os arquivos
400
+ for file in files:
401
+ with open(file.name, 'r', encoding='utf-8') as f:
402
+ content = f.read()
403
+ project_files[file.name] = content
404
+
405
+ # Identificar arquivo principal
406
+ main_file = None
407
+ other_files = {}
408
+ for filename, content in project_files.items():
409
+ if "public static void main" in content:
410
+ main_file = (filename, content)
411
+ else:
412
+ other_files[filename] = content
413
+
414
+ # Resumo do projeto
415
+ results.append(f"""
416
+ {'='*50}
417
+ AVALIAÇÃO {evaluation_type.upper()}
418
+ {'='*50}
419
+ Total de arquivos: {len(project_files)}
420
+ Arquivo principal: {main_file[0] if main_file else 'Não encontrado'}
421
+ Arquivos complementares: {len(other_files)}
422
+ {'='*50}
423
+ """)
424
+
425
+ # Avaliar arquivo principal
426
+ if main_file:
427
+ result = f"\nARQUIVO PRINCIPAL: {main_file[0]}\n{'-'*30}\n"
428
+ evaluation = evaluator.evaluate_code(main_file[1])
429
+
430
+ result += f"Pontuação Total: {evaluation['total_score']:.1f}/100\n"
431
+ result += f"Nível: {evaluation['proficiency']}\n\n"
432
+
433
+ result += "Feedback Detalhado:\n"
434
+ for category, comments in evaluation['feedback'].items():
435
+ if comments:
436
+ result += f"\n{category.title()}:\n"
437
+ for comment in comments:
438
+ result += f" {comment}\n"
439
+
440
+ results.append(result)
441
+
442
+ # Avaliar outros arquivos
443
+ if other_files:
444
+ results.append(f"\nARQUIVOS COMPLEMENTARES\n{'-'*30}")
445
+
446
+ for filename, content in other_files.items():
447
+ result = f"\nAvaliando: {filename}\n"
448
+ evaluation = evaluator.evaluate_code(content)
449
+
450
+ result += f"Pontuação: {evaluation['total_score']:.1f}/100\n"
451
+ result += f"Nível: {evaluation['proficiency']}\n\n"
452
+
453
+ result += "Feedback:\n"
454
+ for category, comments in evaluation['feedback'].items():
455
+ if comments:
456
+ result += f"\n{category.title()}:\n"
457
+ for comment in comments:
458
+ result += f" {comment}\n"
459
+
460
+ results.append(result)
461
+
462
+ return "\n".join(results)
463
+
464
+ except Exception as e:
465
+ return f"Erro ao processar arquivos: {str(e)}\nTipo do erro: {type(e)}"
466
+
467
+ # Interface Gradio com abas
468
+ with gr.Blocks(title="Java-Judge-Syntax-Competencies") as demo:
469
+ gr.Markdown("""
470
+ # Java-Judge-Syntax-Competencies
471
+
472
+ ### [Visualizar Rubrica em PDF](rubric.pdf)
473
+ ### [Visualizar Rubrica em PNG](rubric_table.png)
474
+ Este avaliador analisa código Java usando duas rubricas diferentes:
475
+ 1. **Avaliação Estrutural**: Foca no uso correto de elementos da linguagem
476
+ 2. **Avaliação por Competências**: Analisa qualidade e eficiência do código
477
+ """)
478
+
479
+ with gr.Tabs():
480
+ with gr.Tab("Avaliação Estrutural"):
481
+ upload_structural = gr.File(
482
+ file_count="multiple",
483
+ label="Upload dos arquivos Java"
484
+ )
485
+ evaluate_btn_structural = gr.Button("Avaliar Estruturas")
486
+ output_structural = gr.Textbox(
487
+ label="Resultado da Avaliação",
488
+ lines=25
489
+ )
490
+ evaluate_btn_structural.click(
491
+ fn=process_java_files,
492
+ inputs=upload_structural,
493
+ outputs=output_structural
494
+ )
495
+
496
+ with gr.Tab("Avaliação por Competências"):
497
+ upload_competency = gr.File(
498
+ file_count="multiple",
499
+ label="Upload dos arquivos Java"
500
+ )
501
+ evaluate_btn_competency = gr.Button("Avaliar Competências")
502
+ output_competency = gr.Textbox(
503
+ label="Resultado da Avaliação",
504
+ lines=25
505
+ )
506
+ evaluate_btn_competency.click(
507
+ fn=evaluate_competency,
508
+ inputs=upload_competency,
509
+ outputs=output_competency
510
+ )
511
+
512
+ if __name__ == "__main__":
513
+ demo.launch(share=True)
requirements.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ gradio
2
+ javalang==0.13.0
3
+
rubric.pdf ADDED
Binary file (170 kB). View file
 
rubric_table.png ADDED