rmayormartins commited on
Commit
11aa4b5
·
1 Parent(s): b2fdd63

JAVA-Judge

Browse files
Files changed (5) hide show
  1. README.md +70 -8
  2. app.py +123 -0
  3. requirements.txt +3 -0
  4. rubric.pdf +0 -0
  5. rubric_table.png +0 -0
README.md CHANGED
@@ -1,14 +1,76 @@
1
  ---
2
- title: Java Judge Oo
3
- emoji: 🚀
4
- colorFrom: yellow
5
- colorTo: pink
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: OO Paradigm in Java Code'
12
  ---
13
 
14
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: Java-Judge: OO Paradigm
3
+ emoji: ⚖️☕♨️🖥️
4
+ colorFrom: blue
5
+ colorTo: orange
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 uma rubrica bem definida.
16
+
17
+ ## Desenvolvedor
18
+
19
+ Desenvolvido por Ramon Mayor Martins (2024)
20
+
21
+ - Email: [email protected]
22
+ - Homepage: https://rmayormartins.github.io/
23
+ - Twitter: @rmayormartins
24
+ - GitHub: https://github.com/rmayormartins
25
+ - Space: https://huggingface.co/rmayormartins
26
+
27
+ ## Funcionalidades Principais
28
+
29
+ - **Análise de Sintaxe**:
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
+ - **Análise de POO**:
35
+ - Conta classes, objetos e métodos.
36
+ - Avalia encapsulamento, herança, polimorfismo e abstração.
37
+
38
+ - **Interface Amigável**:
39
+ - Permite upload de múltiplos arquivos Java.
40
+ - Exibe resultados detalhados em um formato legível e intuitivo.
41
+
42
+ ## Rubrica de Avaliação
43
+
44
+ ### Pontuação Essencial (60 pontos)
45
+ - **Classes e Objetos**: 20 pontos.
46
+ - **Métodos**: 20 pontos.
47
+ - **Atributos**: 20 pontos.
48
+
49
+ ### Pontuação Bonificada (40 pontos)
50
+ - **Encapsulamento**: 10 pontos.
51
+ - **Herança**: 10 pontos.
52
+ - **Polimorfismo**: 10 pontos.
53
+ - **Abstração**: 10 pontos.
54
+
55
+ > Para mais detalhes, visualize a rubrica completa no arquivo [rubric.pdf](rubric.pdf) ou confira a tabela resumida abaixo.
56
+
57
+ ![Tabela da Rubrica](rubric_table.png)
58
+
59
+ ## Como Usar
60
+
61
+ 1. Abra a interface do aplicativo.
62
+ 2. Envie um ou mais arquivos `.java`.
63
+ 3. Veja a pontuação e o feedback detalhado para cada arquivo.
64
+
65
+ ## Desenvolvimento Local
66
+
67
+ Para rodar localmente:
68
+
69
+ ```bash
70
+ pip install -r requirements.txt
71
+ python app.py
72
+ ```
73
+
74
+ ## Licença
75
+
76
+ Este projeto está licenciado sob a [MIT License](LICENSE).
app.py ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import javalang
3
+ from typing import Dict, List, Tuple
4
+
5
+ class JavaPOOEvaluator:
6
+ """Java-Judge: Evaluate POO in Java Code"""
7
+ def __init__(self):
8
+ self.rubric = {
9
+ "classes": 20,
10
+ "objetos": 20,
11
+ "metodos": 20,
12
+ "atributos": 20,
13
+ "encapsulamento": 10,
14
+ "heranca": 10,
15
+ "polimorfismo": 10,
16
+ "abstracao": 10,
17
+ }
18
+
19
+ def analyze_classes_and_objects(self, code: str) -> Tuple[float, List[str]]:
20
+ """Avalia a definição e o uso de classes e objetos"""
21
+ score = 0
22
+ feedback = []
23
+
24
+ try:
25
+ tree = javalang.parse.parse(code)
26
+ classes = list(tree.filter(javalang.tree.ClassDeclaration))
27
+
28
+ if classes:
29
+ score += 15
30
+ feedback.append(f"✓ {len(classes)} classe(s) declarada(s) corretamente.")
31
+ else:
32
+ feedback.append("⚠ Nenhuma classe declarada encontrada.")
33
+
34
+ objects = [node for _, node in tree.filter(javalang.tree.VariableDeclarator) if 'new' in str(node.initializer)]
35
+ if objects:
36
+ score += 5
37
+ feedback.append(f"✓ {len(objects)} objeto(s) criado(s) corretamente.")
38
+ else:
39
+ feedback.append("⚠ Nenhuma instância de objeto criada.")
40
+ except Exception as e:
41
+ feedback.append("⚠ Erro ao analisar classes e objetos.")
42
+
43
+ return score, feedback
44
+
45
+ # Métodos de análise para outros critérios continuam iguais ao seu código anterior...
46
+
47
+ def evaluate_code(self, code: str) -> Dict:
48
+ """Avalia o código Java"""
49
+ # Avaliações essenciais e bonificadas
50
+ cls_score, cls_feedback = self.analyze_classes_and_objects(code)
51
+ meth_score, meth_feedback = self.analyze_methods(code)
52
+
53
+ enc_score, enc_feedback = self.analyze_encapsulation(code)
54
+ inh_score, inh_feedback = self.analyze_inheritance(code)
55
+ poly_score, poly_feedback = self.analyze_polymorphism(code)
56
+ abs_score, abs_feedback = self.analyze_abstraction(code)
57
+
58
+ # Pontuações
59
+ essential_score = cls_score + meth_score
60
+ bonus_score = enc_score + inh_score + poly_score + abs_score
61
+ total_score = essential_score + bonus_score
62
+ total_score = min(100, total_score)
63
+
64
+ proficiency = "Necessita Melhorias"
65
+ if total_score >= 90:
66
+ proficiency = "Excelente"
67
+ elif total_score >= 75:
68
+ proficiency = "Bom"
69
+ elif total_score >= 60:
70
+ proficiency = "Satisfatório"
71
+
72
+ return {
73
+ "total_score": total_score,
74
+ "essential_score": essential_score,
75
+ "bonus_score": bonus_score,
76
+ "proficiency": proficiency,
77
+ "feedback": {
78
+ "classes_objetos": cls_feedback,
79
+ "metodos": meth_feedback,
80
+ "encapsulamento": enc_feedback,
81
+ "heranca": inh_feedback,
82
+ "polimorfismo": poly_feedback,
83
+ "abstracao": abs_feedback
84
+ }
85
+ }
86
+
87
+ # Interface Gradio
88
+ with gr.Blocks(title="Java-Judge: Evaluate POO in Java Code") as demo:
89
+ gr.Markdown("# Avaliador de POO em Java")
90
+ gr.Markdown("### [Visualizar a Rubrica em PDF](rubric.pdf)")
91
+ gr.Markdown("Ou confira a tabela resumida abaixo.")
92
+ gr.Image("rubric_table.png", label="Tabela Resumida da Rubrica")
93
+
94
+ upload = gr.File(label="Carregue arquivos Java para avaliação", file_types=[".java"], file_count="multiple")
95
+ evaluate_button = gr.Button("Avaliar Código")
96
+ output = gr.Textbox(label="Resultado da Avaliação", lines=25)
97
+
98
+ def evaluate_code_files(files) -> str:
99
+ """Função para avaliar múltiplos arquivos Java"""
100
+ evaluator = JavaPOOEvaluator()
101
+ results = []
102
+
103
+ for file in files:
104
+ with open(file.name, 'r', encoding='utf-8') as f:
105
+ code = f.read()
106
+ evaluation = evaluator.evaluate_code(code)
107
+
108
+ result = f"\nArquivo: {file.name}\n"
109
+ result += f"Pontuação Total: {evaluation['total_score']:.1f}/100\n"
110
+ result += f"Nível: {evaluation['proficiency']}\n\n"
111
+ result += "Feedback Detalhado:\n"
112
+ for category, comments in evaluation['feedback'].items():
113
+ result += f"\n{category.replace('_', ' ').title()}:\n"
114
+ for comment in comments:
115
+ result += f" {comment}\n"
116
+ results.append(result)
117
+
118
+ return "\n".join(results)
119
+
120
+ evaluate_button.click(fn=evaluate_code_files, inputs=upload, outputs=output)
121
+
122
+ if __name__ == "__main__":
123
+ demo.launch(share=True)
requirements.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ gradio
2
+ javalang==0.13.0
3
+
rubric.pdf ADDED
Binary file (143 kB). View file
 
rubric_table.png ADDED