MarvinRoque commited on
Commit
c97df6f
·
1 Parent(s): c668a5a
Files changed (3) hide show
  1. __pycache__/app.cpython-312.pyc +0 -0
  2. app.py +37 -1
  3. test.py +265 -0
__pycache__/app.cpython-312.pyc CHANGED
Binary files a/__pycache__/app.cpython-312.pyc and b/__pycache__/app.cpython-312.pyc differ
 
app.py CHANGED
@@ -1093,5 +1093,41 @@ demo = gr.Interface(
1093
  )
1094
 
1095
  if __name__ == "__main__":
1096
- demo.queue().launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1097
 
 
 
1093
  )
1094
 
1095
  if __name__ == "__main__":
1096
+ print("\n===== 🔍 TESTES AUTOMÁTICOS =====\n")
1097
+
1098
+ # Teste 1: detectar lesões
1099
+ texto1 = "Tenho dor no joelho direito e estou com tendinite no ombro."
1100
+ print("Lesões detectadas:", detectar_lesoes(texto1))
1101
+
1102
+ # Teste 2: detectar músculos
1103
+ texto2 = "Quero um treino focado em peito, tríceps e ombro."
1104
+ print("Músculos detectados:", detectar_musculos(texto2))
1105
+
1106
+ # Teste 3: detectar objetivo
1107
+ texto3 = "Meu objetivo é ganhar massa muscular e força."
1108
+ print("Objetivos detectados:", detectar_objetivos(texto3))
1109
+
1110
+ # Teste 4: detectar intenção
1111
+ tipo, valor = detectar_intencao("treino 5x por semana", ["peito", "costas"])
1112
+ print(f"Intenção: {tipo} → {valor}")
1113
+
1114
+ # Teste 5: extrair dados do usuário
1115
+ prompt = "Tenho 28 anos, peso 72kg, 1.75m, sou homem e quero ganhar massa. Treino 5x por semana."
1116
+ dados = extrair_dados_usuario(prompt)
1117
+ print("Dados extraídos:", json.dumps(dados, ensure_ascii=False, indent=2))
1118
+
1119
+ # Teste 6: gerar plano simples (se tiver todos os dados)
1120
+ if all(k in dados for k in ["idade", "sexo", "peso", "altura", "atividade", "objetivo"]):
1121
+ resumo, plano = gerar_plano(
1122
+ idade=dados["idade"],
1123
+ sexo=dados["sexo"],
1124
+ peso=dados["peso"],
1125
+ altura=dados["altura"],
1126
+ atividade=dados["atividade"],
1127
+ objetivo=dados["objetivo"],
1128
+ intensidade="moderada"
1129
+ )
1130
+ print("\nResumo nutricional:\n", resumo)
1131
+ print("\nPlano diário:\n", json.dumps(plano, ensure_ascii=False, indent=2))
1132
 
1133
+ print("\n===== ✅ FIM DOS TESTES =====\n")
test.py ADDED
@@ -0,0 +1,265 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Testes integrados realistas para o app.py.
3
+ Mocka dependências pesadas (gradio, transformers, torch etc.)
4
+ para permitir testes sem instalar libs grandes.
5
+ """
6
+ import sys, types
7
+
8
+ # ==============================
9
+ # 🧩 MOCK DO GRADIO
10
+ # ==============================
11
+ mock_gradio = types.ModuleType("gradio")
12
+
13
+ class MockBlocks:
14
+ def __init__(self, *a, **k): pass
15
+ def __enter__(self): return self
16
+ def __exit__(self, *a): pass
17
+ def launch(self, *a, **k): pass
18
+ def queue(self, *a, **k): return self
19
+ def load(self, *a, **k): return self
20
+ def __call__(self, *a, **k): return None
21
+
22
+ class MockComponent:
23
+ def __init__(self, *a, **k): pass
24
+
25
+ mock_gradio.Blocks = MockBlocks
26
+ mock_gradio.Interface = MockBlocks
27
+ mock_gradio.Row = mock_gradio.Column = mock_gradio.Tab = mock_gradio.Accordion = MockBlocks
28
+ mock_gradio.Markdown = mock_gradio.Textbox = mock_gradio.Button = mock_gradio.Dropdown = MockComponent
29
+ mock_gradio.Radio = mock_gradio.Number = mock_gradio.Slider = mock_gradio.Image = mock_gradio.Audio = MockComponent
30
+ mock_gradio.launch = lambda *a, **k: None
31
+ mock_gradio.update = lambda *a, **k: None
32
+ mock_gradio.inputs = mock_gradio.outputs = None
33
+
34
+ sys.modules["gradio"] = mock_gradio
35
+
36
+
37
+ # ==============================
38
+ # 🧩 MOCK DO TRANSFORMERS
39
+ # ==============================
40
+ mock_transformers = types.ModuleType("transformers")
41
+
42
+ class MockModel:
43
+ def __init__(self, *a, **k): pass
44
+ def to(self, *a, **k): return self
45
+ def eval(self): return self
46
+
47
+ class MockTokenizer:
48
+ def __init__(self, *a, **k): pass
49
+ def encode(self, text, *a, **k): return [0, 1, 2]
50
+ def decode(self, ids, *a, **k): return "texto gerado"
51
+ def __call__(self, *a, **k): return {"input_ids": [0, 1, 2]}
52
+
53
+ mock_transformers.AutoModelForCausalLM = MockModel
54
+ mock_transformers.AutoTokenizer = MockTokenizer
55
+
56
+ sys.modules["transformers"] = mock_transformers
57
+
58
+
59
+ # ==============================
60
+ # 🧩 MOCK DO SENTENCE_TRANSFORMERS
61
+ # ==============================
62
+ mock_st = types.ModuleType("sentence_transformers")
63
+
64
+ class MockSTModel:
65
+ def encode(self, text, *a, **k):
66
+ import numpy as np
67
+ if isinstance(text, str):
68
+ return np.random.rand(384)
69
+ return [np.random.rand(384) for _ in text]
70
+
71
+ mock_st.SentenceTransformer = MockSTModel
72
+ mock_st.util = types.SimpleNamespace(pytorch_cos_sim=lambda a, b: 0.9)
73
+
74
+ sys.modules["sentence_transformers"] = mock_st
75
+
76
+
77
+ # ==============================
78
+ # 🧩 MOCK DO TORCH (corrigido)
79
+ # ==============================
80
+ import types
81
+
82
+ mock_torch = types.ModuleType("torch")
83
+
84
+ # mock básico de funções
85
+ mock_torch.Tensor = type("MockTensor", (), {"to": lambda self, *a, **k: self})
86
+ mock_torch.device = lambda *a, **k: "cpu"
87
+ mock_torch.no_grad = lambda: (lambda: (yield)) # generator dummy
88
+ mock_torch.cuda = types.SimpleNamespace(is_available=lambda: False)
89
+ mock_torch.manual_seed = lambda x: None
90
+
91
+ # submódulo torch.nn
92
+ mock_nn = types.ModuleType("torch.nn")
93
+ mock_functional = types.ModuleType("torch.nn.functional")
94
+ mock_functional.softmax = lambda x, dim=None: x
95
+
96
+ mock_nn.functional = mock_functional
97
+ mock_torch.nn = mock_nn
98
+
99
+ # registrar tudo no sys.modules
100
+ import sys
101
+ sys.modules["torch"] = mock_torch
102
+ sys.modules["torch.nn"] = mock_nn
103
+ sys.modules["torch.nn.functional"] = mock_functional
104
+
105
+
106
+
107
+ # ==============================
108
+ # 🧩 MOCK DO NUTRITION (caso não exista)
109
+ # ==============================
110
+ mock_nutrition = types.ModuleType("nutrition")
111
+ mock_nutrition.UserProfile = lambda *a, **k: None
112
+ mock_nutrition.build_basic_plan = lambda *a, **k: "Plano nutricional gerado"
113
+ mock_nutrition.gerar_plano_diario = lambda *a, **k: "Plano diário de refeições"
114
+ sys.modules["nutrition"] = mock_nutrition
115
+
116
+
117
+ # ==============================
118
+ # ✅ AGORA IMPORTA O APP NORMALMENTE
119
+ # ==============================
120
+ from app import responder
121
+
122
+ from app import responder
123
+
124
+
125
+
126
+ def testar(prompt: str, descricao: str):
127
+ print(f"\n🧠 {descricao}")
128
+ print(f"👤 Prompt: {prompt}")
129
+ resposta = responder(prompt)
130
+ print(f"🤖 Resposta: {resposta[:300]}...\n") # preview de 300 chars
131
+ assert isinstance(resposta, str)
132
+ assert len(resposta) > 40 # deve conter texto substancial
133
+ return resposta
134
+
135
+
136
+ def test_responder_completo():
137
+ print("\n==============================")
138
+ print("🚀 Testes integrados do app.py com extração de dados")
139
+ print("==============================")
140
+
141
+ # 1️⃣ Bulking masculino intermediário
142
+ testar(
143
+ "Sou homem, 28 anos, 1.80m, 75kg, treino 5x por semana e quero ganhar massa muscular.",
144
+ "Treino e nutrição para bulking masculino intermediário"
145
+ )
146
+
147
+ # 2️⃣ Cutting feminino
148
+ testar(
149
+ "Sou mulher de 32 anos, 1,65m e 70kg. Quero perder gordura e definir, treino há 3 anos.",
150
+ "Plano de treino e dieta para cutting feminino"
151
+ )
152
+
153
+ # 3️⃣ Iniciante sedentário
154
+ testar(
155
+ "Tenho 40 anos, 1.70m, 85kg, sou sedentário e quero começar na academia para emagrecer.",
156
+ "Plano inicial para sedentário"
157
+ )
158
+
159
+ # 4️⃣ Treino de pernas com lesão no joelho
160
+ testar(
161
+ "Mulher, 29 anos, 1.67m, 62kg, intermediária. Quero treinar pernas e glúteos, mas tenho dor no joelho direito.",
162
+ "Treino personalizado respeitando lesão"
163
+ )
164
+
165
+ # 5️⃣ Treino upper body com foco em força
166
+ testar(
167
+ "Homem, 25 anos, 1.82m, 78kg, treino há 4 anos. Hoje quero um treino de upper body para ganhar força.",
168
+ "Treino de força para parte superior"
169
+ )
170
+
171
+ # 6️⃣ Full body iniciante
172
+ testar(
173
+ "Sou homem de 34 anos, 1.75m e 80kg, iniciante. Quero um treino completo 3x por semana.",
174
+ "Treino full body iniciante"
175
+ )
176
+
177
+ # 7️⃣ Dieta vegana para hipertrofia
178
+ testar(
179
+ "Sou homem de 30 anos, 1.78m e 72kg, vegano. Quero uma dieta rica em proteínas vegetais para hipertrofia.",
180
+ "Plano alimentar vegano para ganho de massa"
181
+ )
182
+
183
+ # 8️⃣ Alergia a leite e glúten
184
+ testar(
185
+ "Mulher, 35 anos, 1.60m e 60kg, treino 4x por semana, intolerante a lactose e glúten. Quero uma dieta para definição.",
186
+ "Plano alimentar com restrições (sem leite e glúten)"
187
+ )
188
+
189
+ # 9️⃣ Idoso ativo manutenção
190
+ testar(
191
+ "Tenho 65 anos, 1.70m, 68kg, homem ativo, treino leve 3x por semana. Quero manter a forma e saúde.",
192
+ "Plano de manutenção para idoso ativo"
193
+ )
194
+
195
+ # 🔟 Atleta avançado buscando performance
196
+ testar(
197
+ "Sou atleta masculino, 26 anos, 1.83m, 86kg, treino pesado 6x por semana. Quero melhorar explosão e potência.",
198
+ "Treino avançado para performance"
199
+ )
200
+
201
+ # 11️⃣ Pessoa com restrição alimentar a amendoim e ovo
202
+ testar(
203
+ "Sou mulher, 27 anos, 1.65m e 58kg, treino todos os dias. Tenho alergia a amendoim e ovo e quero ganhar massa.",
204
+ "Dieta para bulking sem amendoim nem ovo"
205
+ )
206
+
207
+ # 12️⃣ Reabilitação pós-lesão de ombro
208
+ testar(
209
+ "Homem, 33 anos, 1.80m, 82kg, avançado. Estou recuperando de lesão no ombro e quero adaptar meu treino.",
210
+ "Adaptação de treino para recuperação de ombro"
211
+ )
212
+
213
+ # 13️⃣ Treino em casa com elásticos
214
+ testar(
215
+ "Sou mulher de 31 anos, 1.68m, 64kg. Quero treinar em casa com elásticos e peso corporal para tonificar.",
216
+ "Treino funcional com elásticos em casa"
217
+ )
218
+
219
+ # 14️⃣ Foco em core e abdômen
220
+ testar(
221
+ "Homem, 29 anos, 1.79m, 74kg. Quero fortalecer o core e abdômen para melhorar postura e estabilidade.",
222
+ "Treino focado em core e abdômen"
223
+ )
224
+
225
+ # 15️⃣ Recuperação pós-treino e sono
226
+ testar(
227
+ "Tenho 36 anos, 1.76m, 78kg. O que posso fazer para melhorar recuperação e sono após treinos intensos?",
228
+ "Recomendações de recuperação e sono"
229
+ )
230
+
231
+ # 16️⃣ Treino para corrida e condicionamento
232
+ testar(
233
+ "Mulher, 30 anos, 1.64m, 58kg, faz corrida 3x por semana. Quer melhorar condicionamento e resistência.",
234
+ "Treino de resistência e condicionamento para corredora"
235
+ )
236
+
237
+ # 17️⃣ Recomendação de suplementos
238
+ testar(
239
+ "Sou homem de 27 anos, 1.81m, 80kg. Quais suplementos posso tomar para melhorar força e recuperação?",
240
+ "Recomendação de suplementação"
241
+ )
242
+
243
+ # 18️⃣ Pessoa com metabolismo lento e objetivo de secar
244
+ testar(
245
+ "Mulher, 35 anos, 1.70m, 68kg, metabolismo lento. Quero secar e definir.",
246
+ "Plano para acelerar metabolismo e reduzir gordura"
247
+ )
248
+
249
+ # 19️⃣ Iniciante querendo ajuda geral
250
+ testar(
251
+ "Tenho 24 anos, 1.74m e 82kg. Nunca treinei e quero ajuda com treino e alimentação para começar.",
252
+ "Primeiros passos para iniciante completo"
253
+ )
254
+
255
+ # 20️⃣ Manutenção pós-cutting
256
+ testar(
257
+ "Sou homem de 29 anos, 1.77m, 73kg. Terminei o cutting e quero manter o peso e a forma atual.",
258
+ "Plano de manutenção pós-cutting"
259
+ )
260
+
261
+ print("\n✅ Todos os testes integrados rodaram com sucesso!")
262
+
263
+
264
+ if __name__ == "__main__":
265
+ test_responder_completo()