@semacode/cli 0.8.8 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -3
- package/dist/drift.d.ts +30 -1
- package/dist/drift.js +373 -17
- package/dist/drift.js.map +1 -1
- package/dist/index.js +828 -53
- package/dist/index.js.map +1 -1
- package/docs/AGENT_STARTER.md +10 -4
- package/docs/como-ensinar-a-sema-para-ia.md +17 -11
- package/docs/fluxo-pratico-ia-sema.md +42 -38
- package/docs/instalacao-e-primeiro-uso.md +189 -0
- package/docs/integracao-com-ia.md +228 -0
- package/docs/pagamento-ponta-a-ponta.md +155 -0
- package/docs/prompt-base-ia-sema.md +10 -3
- package/docs/sintaxe.md +267 -0
- package/exemplos/automacao.sema +107 -0
- package/exemplos/cadastro_usuario.sema +54 -0
- package/exemplos/calculadora.sema +78 -0
- package/exemplos/crud_simples.sema +89 -0
- package/exemplos/operacao_estrategia.sema +402 -0
- package/exemplos/pagamento.sema +222 -0
- package/exemplos/pagamento_dominio.sema +35 -0
- package/exemplos/testes_embutidos.sema +45 -0
- package/exemplos/tratamento_erro.sema +157 -0
- package/node_modules/@sema/gerador-dart/package.json +1 -1
- package/node_modules/@sema/gerador-python/package.json +1 -1
- package/node_modules/@sema/gerador-typescript/package.json +1 -1
- package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +14 -1
- package/node_modules/@sema/nucleo/dist/formatador/index.js +131 -22
- package/node_modules/@sema/nucleo/dist/formatador/index.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/ir/conversor.js +546 -102
- package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +83 -5
- package/node_modules/@sema/nucleo/dist/lexer/lexer.js +1 -1
- package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/lexer/tokens.js +10 -0
- package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/parser/parser.js +230 -19
- package/node_modules/@sema/nucleo/dist/parser/parser.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +6 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.js +269 -10
- package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +1 -1
- package/node_modules/@sema/nucleo/package.json +1 -1
- package/node_modules/@sema/padroes/package.json +1 -1
- package/package.json +7 -6
package/docs/sintaxe.md
ADDED
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
# Sintaxe Canonica
|
|
2
|
+
|
|
3
|
+
A Sema usa blocos declarativos com chaves e forma previsivel. A regra aqui nao e "ficar bonitinho para humano"; e reduzir ambiguidade para parser, IR, drift e contexto de IA.
|
|
4
|
+
|
|
5
|
+
## Regras basicas
|
|
6
|
+
|
|
7
|
+
- um arquivo `.sema` contem um `module` principal
|
|
8
|
+
- cada bloco abre com palavra-chave e fecha com `}`
|
|
9
|
+
- campos usam `nome: valor`
|
|
10
|
+
- linhas declarativas continuam validas para regra, efeito, garantia, transicao e etapa de flow
|
|
11
|
+
- `tests` contem blocos `caso`
|
|
12
|
+
- quando uma palavra reservada aparece seguida de `:`, ela continua sendo campo, nao bloco
|
|
13
|
+
|
|
14
|
+
## Blocos de primeira classe
|
|
15
|
+
|
|
16
|
+
- `module`
|
|
17
|
+
- `use`
|
|
18
|
+
- `type`
|
|
19
|
+
- `entity`
|
|
20
|
+
- `enum`
|
|
21
|
+
- `state`
|
|
22
|
+
- `task`
|
|
23
|
+
- `flow`
|
|
24
|
+
- `route`
|
|
25
|
+
- `worker`
|
|
26
|
+
- `evento`
|
|
27
|
+
- `fila`
|
|
28
|
+
- `cron`
|
|
29
|
+
- `webhook`
|
|
30
|
+
- `cache`
|
|
31
|
+
- `storage`
|
|
32
|
+
- `policy`
|
|
33
|
+
- `tests`
|
|
34
|
+
- `docs`
|
|
35
|
+
- `comments`
|
|
36
|
+
|
|
37
|
+
## Subblocos mais usados
|
|
38
|
+
|
|
39
|
+
- `input`
|
|
40
|
+
- `output`
|
|
41
|
+
- `rules`
|
|
42
|
+
- `effects`
|
|
43
|
+
- `impl`
|
|
44
|
+
- `vinculos`
|
|
45
|
+
- `execucao`
|
|
46
|
+
- `guarantees`
|
|
47
|
+
- `error`
|
|
48
|
+
- `fields`
|
|
49
|
+
- `invariants`
|
|
50
|
+
- `transitions`
|
|
51
|
+
- `given`
|
|
52
|
+
- `when`
|
|
53
|
+
- `expect`
|
|
54
|
+
|
|
55
|
+
## Tipos compostos
|
|
56
|
+
|
|
57
|
+
A Sema agora aceita formas canonicas para payload mais denso sem empurrar tudo para `Json`.
|
|
58
|
+
|
|
59
|
+
```sema
|
|
60
|
+
input {
|
|
61
|
+
ids: Lista<Id> required
|
|
62
|
+
metadata: Mapa<Texto, Texto>
|
|
63
|
+
responsavel: Opcional<Usuario>
|
|
64
|
+
chave_publica: Texto|Id
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Formas suportadas:
|
|
69
|
+
|
|
70
|
+
- `Lista<T>`
|
|
71
|
+
- `Mapa<K, V>`
|
|
72
|
+
- `Opcional<T>`
|
|
73
|
+
- `T1|T2`
|
|
74
|
+
- `T?`
|
|
75
|
+
|
|
76
|
+
## Task com contrato operacional
|
|
77
|
+
|
|
78
|
+
```sema
|
|
79
|
+
task processar_pedido {
|
|
80
|
+
input {
|
|
81
|
+
pedido_id: Id required
|
|
82
|
+
itens: Lista<Texto> required
|
|
83
|
+
}
|
|
84
|
+
output {
|
|
85
|
+
protocolo: Id
|
|
86
|
+
status: Texto
|
|
87
|
+
}
|
|
88
|
+
impl {
|
|
89
|
+
ts: app.pedidos.processar
|
|
90
|
+
}
|
|
91
|
+
vinculos {
|
|
92
|
+
arquivo: "src/pedidos/processar.ts"
|
|
93
|
+
simbolo: app.pedidos.processar
|
|
94
|
+
fila: pedidos_processamento
|
|
95
|
+
}
|
|
96
|
+
execucao {
|
|
97
|
+
idempotencia: verdadeiro
|
|
98
|
+
timeout: "30s"
|
|
99
|
+
retry: "3x exponencial"
|
|
100
|
+
compensacao: "reverter_reserva"
|
|
101
|
+
criticidade_operacional: alta
|
|
102
|
+
}
|
|
103
|
+
effects {
|
|
104
|
+
persistencia pedidos criticidade = alta
|
|
105
|
+
auditoria pedidos criticidade = media
|
|
106
|
+
}
|
|
107
|
+
guarantees {
|
|
108
|
+
protocolo existe
|
|
109
|
+
status existe
|
|
110
|
+
}
|
|
111
|
+
error {
|
|
112
|
+
pedido_invalido {
|
|
113
|
+
mensagem: "payload invalido"
|
|
114
|
+
categoria: dominio
|
|
115
|
+
recuperabilidade: permanente
|
|
116
|
+
acao_chamador: corrigir_input
|
|
117
|
+
impacta_estado: falso
|
|
118
|
+
requer_compensacao: falso
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
tests {
|
|
122
|
+
caso "processa pedido valido" {
|
|
123
|
+
given {
|
|
124
|
+
pedido_id: "ped_1"
|
|
125
|
+
}
|
|
126
|
+
expect {
|
|
127
|
+
sucesso: verdadeiro
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## `impl`
|
|
135
|
+
|
|
136
|
+
`impl` liga a task ou a superficie ao simbolo real do runtime.
|
|
137
|
+
|
|
138
|
+
```sema
|
|
139
|
+
impl {
|
|
140
|
+
ts: app.pedidos.processar
|
|
141
|
+
py: services.orders.processar
|
|
142
|
+
cs: Pedidos.Api.Controllers.PedidosController.Processar
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Regras:
|
|
147
|
+
|
|
148
|
+
- cada origem aparece no maximo uma vez por bloco
|
|
149
|
+
- o caminho aponta para simbolo, nao para chamada com `()`
|
|
150
|
+
- `ts|typescript`, `py|python`, `dart`, `cs|csharp|dotnet`, `java`, `go|golang`, `rust|rs`, `cpp|cxx|cc|c++` sao origens validas
|
|
151
|
+
|
|
152
|
+
## `vinculos`
|
|
153
|
+
|
|
154
|
+
`vinculos` nao substitui `impl`. Ele complementa o contrato com rastros operacionais que ajudam IA e drift a mapear o sistema vivo.
|
|
155
|
+
|
|
156
|
+
Campos comuns:
|
|
157
|
+
|
|
158
|
+
- `arquivo`
|
|
159
|
+
- `simbolo`
|
|
160
|
+
- `rota`
|
|
161
|
+
- `superficie`
|
|
162
|
+
- `recurso`
|
|
163
|
+
- `tabela`
|
|
164
|
+
- `fila`
|
|
165
|
+
- `worker`
|
|
166
|
+
- `evento`
|
|
167
|
+
- `cron`
|
|
168
|
+
- `webhook`
|
|
169
|
+
- `cache`
|
|
170
|
+
- `storage`
|
|
171
|
+
- `policy`
|
|
172
|
+
|
|
173
|
+
Exemplo:
|
|
174
|
+
|
|
175
|
+
```sema
|
|
176
|
+
vinculos {
|
|
177
|
+
arquivo: "pacotes/cli/src/index.ts"
|
|
178
|
+
simbolo: cli.src.index.gerarContextoIa
|
|
179
|
+
webhook: "/interno/contexto-ia"
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## `execucao`
|
|
184
|
+
|
|
185
|
+
`execucao` explicita comportamento operacional em vez de deixar isso espalhado pelo codigo ou pela cabeca da IA.
|
|
186
|
+
|
|
187
|
+
```sema
|
|
188
|
+
execucao {
|
|
189
|
+
idempotencia: verdadeiro
|
|
190
|
+
timeout: "15s"
|
|
191
|
+
retry: "fila"
|
|
192
|
+
compensacao: "nenhuma"
|
|
193
|
+
criticidade_operacional: media
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
Campos canonicos:
|
|
198
|
+
|
|
199
|
+
- `idempotencia`
|
|
200
|
+
- `timeout`
|
|
201
|
+
- `retry`
|
|
202
|
+
- `compensacao`
|
|
203
|
+
- `criticidade_operacional`
|
|
204
|
+
|
|
205
|
+
## Superficies modernas
|
|
206
|
+
|
|
207
|
+
A Sema nao fica presa em HTTP. As bordas abaixo sao blocos irmaos de `route`, com shape minimo compativel com `task`, `impl`, `vinculos`, `execucao` e `effects`.
|
|
208
|
+
|
|
209
|
+
```sema
|
|
210
|
+
worker preparar_briefing {
|
|
211
|
+
task: medir_drift
|
|
212
|
+
vinculos {
|
|
213
|
+
arquivo: "pacotes/cli/src/index.ts"
|
|
214
|
+
worker: contexto_ia
|
|
215
|
+
}
|
|
216
|
+
execucao {
|
|
217
|
+
retry: "fila_contexto"
|
|
218
|
+
criticidade_operacional: alta
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
webhook confirmar_contexto {
|
|
223
|
+
task: mapear_projeto
|
|
224
|
+
vinculos {
|
|
225
|
+
webhook: "/interno/contexto-ia"
|
|
226
|
+
}
|
|
227
|
+
execucao {
|
|
228
|
+
timeout: "15s"
|
|
229
|
+
criticidade_operacional: media
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
## Flow com dependencia explicita
|
|
235
|
+
|
|
236
|
+
```sema
|
|
237
|
+
flow operar_contexto_ia {
|
|
238
|
+
entrada: Texto
|
|
239
|
+
etapa mapear usa mapear_projeto com entrada = entrada
|
|
240
|
+
etapa drift usa medir_drift com contrato = entrada depende_de mapear
|
|
241
|
+
etapa briefing usa preparar_briefing com entrada = entrada depende_de drift
|
|
242
|
+
effects {
|
|
243
|
+
auditoria contexto_ia criticidade = alta
|
|
244
|
+
}
|
|
245
|
+
vinculos {
|
|
246
|
+
simbolo: cli.src.index.comandoContextoIa
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
## Forma canonica
|
|
252
|
+
|
|
253
|
+
O formatador passa a preferir:
|
|
254
|
+
|
|
255
|
+
- `vinculos` com `arquivo` antes de `simbolo`
|
|
256
|
+
- `execucao` com `idempotencia`, `timeout`, `retry`, `compensacao` e `criticidade_operacional`
|
|
257
|
+
- strings operacionais como `arquivo`, `timeout`, `retry` e `compensacao` com aspas
|
|
258
|
+
- tipos compostos sem espacos quebrados em `Lista<T>` e `Mapa<K, V>`
|
|
259
|
+
|
|
260
|
+
## Resumo pratico
|
|
261
|
+
|
|
262
|
+
Se a duvida for "isso vai ajudar a IA a editar com menos chute?", a sintaxe nova aponta para quatro coisas:
|
|
263
|
+
|
|
264
|
+
- contrato rico
|
|
265
|
+
- vinculo rastreavel
|
|
266
|
+
- execucao explicita
|
|
267
|
+
- superficie moderna de primeira classe
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
module exemplos.automacao {
|
|
2
|
+
state onboarding_status {
|
|
3
|
+
origem: automacao
|
|
4
|
+
fields {
|
|
5
|
+
lead_id: Id
|
|
6
|
+
etapa_atual: Texto
|
|
7
|
+
concluido: Booleano
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
task executar_onboarding {
|
|
12
|
+
input {
|
|
13
|
+
lead_id: Id required
|
|
14
|
+
email: Email required
|
|
15
|
+
}
|
|
16
|
+
output {
|
|
17
|
+
protocolo: Id
|
|
18
|
+
}
|
|
19
|
+
rules {
|
|
20
|
+
lead_id deve_ser valido
|
|
21
|
+
email deve_ser email_valido
|
|
22
|
+
}
|
|
23
|
+
effects {
|
|
24
|
+
consulta crm
|
|
25
|
+
persistencia conta
|
|
26
|
+
notificacao email detalhe_boas_vindas
|
|
27
|
+
auditoria onboarding
|
|
28
|
+
}
|
|
29
|
+
guarantees {
|
|
30
|
+
protocolo existe
|
|
31
|
+
persistencia concluida
|
|
32
|
+
}
|
|
33
|
+
tests {
|
|
34
|
+
caso "onboarding completo" {
|
|
35
|
+
given {
|
|
36
|
+
lead_id: "lead_1"
|
|
37
|
+
email: "cliente@empresa.com"
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
expect {
|
|
41
|
+
sucesso: verdadeiro
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
task registrar_auditoria {
|
|
48
|
+
input {
|
|
49
|
+
protocolo: Id required
|
|
50
|
+
}
|
|
51
|
+
output {
|
|
52
|
+
auditoria_id: Id
|
|
53
|
+
}
|
|
54
|
+
effects {
|
|
55
|
+
auditoria onboarding
|
|
56
|
+
}
|
|
57
|
+
guarantees {
|
|
58
|
+
auditoria_id existe
|
|
59
|
+
}
|
|
60
|
+
tests {
|
|
61
|
+
caso "auditoria registrada" {
|
|
62
|
+
given {
|
|
63
|
+
protocolo: "prot_1"
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
expect {
|
|
67
|
+
sucesso: verdadeiro
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
task registrar_falha_onboarding {
|
|
74
|
+
input {
|
|
75
|
+
lead_id: Id required
|
|
76
|
+
}
|
|
77
|
+
output {
|
|
78
|
+
protocolo_falha: Id
|
|
79
|
+
}
|
|
80
|
+
effects {
|
|
81
|
+
auditoria falha_onboarding
|
|
82
|
+
persistencia onboarding_falha
|
|
83
|
+
}
|
|
84
|
+
guarantees {
|
|
85
|
+
protocolo_falha existe
|
|
86
|
+
}
|
|
87
|
+
tests {
|
|
88
|
+
caso "falha registrada" {
|
|
89
|
+
given {
|
|
90
|
+
lead_id: "lead_1"
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
expect {
|
|
94
|
+
sucesso: verdadeiro
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
flow onboarding_cliente {
|
|
101
|
+
lead_id: Id
|
|
102
|
+
email: Email
|
|
103
|
+
etapa receber usa executar_onboarding com lead_id = lead_id, email = email quando (sucesso existe ou persistencia concluida) em_sucesso auditar em_erro registrar_falha
|
|
104
|
+
etapa auditar usa registrar_auditoria com protocolo = receber.protocolo depende_de receber
|
|
105
|
+
etapa registrar_falha usa registrar_falha_onboarding com lead_id = lead_id depende_de receber
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
module exemplos.cadastro.usuario {
|
|
2
|
+
docs {
|
|
3
|
+
resumo: "Cadastro de usuario com entidade,validacoes e persistencia declarada."
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
entity Usuario {
|
|
7
|
+
fields {
|
|
8
|
+
id: Id
|
|
9
|
+
nome: Texto
|
|
10
|
+
email: Email
|
|
11
|
+
ativo: Booleano
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
task criar_usuario {
|
|
16
|
+
input {
|
|
17
|
+
nome: Texto required
|
|
18
|
+
email: Email required
|
|
19
|
+
}
|
|
20
|
+
output {
|
|
21
|
+
usuario: Usuario
|
|
22
|
+
}
|
|
23
|
+
rules {
|
|
24
|
+
nome deve_ser preenchido
|
|
25
|
+
email deve_ser email_valido
|
|
26
|
+
email deve_ser unico em Usuario.email
|
|
27
|
+
}
|
|
28
|
+
effects {
|
|
29
|
+
persistencia Usuario
|
|
30
|
+
evento usuario_criado
|
|
31
|
+
auditoria cadastro_usuario
|
|
32
|
+
}
|
|
33
|
+
guarantees {
|
|
34
|
+
usuario existe
|
|
35
|
+
persistencia concluida
|
|
36
|
+
}
|
|
37
|
+
error {
|
|
38
|
+
email_duplicado: "Ja existe usuario com este email."
|
|
39
|
+
entrada_invalida: "Os dados informados nao atendem as regras."
|
|
40
|
+
}
|
|
41
|
+
tests {
|
|
42
|
+
caso "cria usuario valido" {
|
|
43
|
+
given {
|
|
44
|
+
nome: "Ana"
|
|
45
|
+
email: "ana@empresa.com"
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
expect {
|
|
49
|
+
sucesso: verdadeiro
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
module exemplos.calculadora {
|
|
2
|
+
docs {
|
|
3
|
+
resumo: "Operacoes aritmeticas simples com garantias e testes."
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
comments {
|
|
7
|
+
observacao: "Exemplo base para demonstrar tarefas semanticas puras."
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
task somar {
|
|
11
|
+
input {
|
|
12
|
+
a: Numero required
|
|
13
|
+
b: Numero required
|
|
14
|
+
}
|
|
15
|
+
output {
|
|
16
|
+
resultado: Numero
|
|
17
|
+
}
|
|
18
|
+
rules {
|
|
19
|
+
a deve_ser numero_valido
|
|
20
|
+
b deve_ser numero_valido
|
|
21
|
+
}
|
|
22
|
+
effects {
|
|
23
|
+
auditoria operacao soma
|
|
24
|
+
}
|
|
25
|
+
guarantees {
|
|
26
|
+
resultado existe
|
|
27
|
+
}
|
|
28
|
+
error {
|
|
29
|
+
entrada_invalida: "Os valores precisam ser numericos."
|
|
30
|
+
}
|
|
31
|
+
tests {
|
|
32
|
+
caso "soma basica" {
|
|
33
|
+
given {
|
|
34
|
+
a: 2
|
|
35
|
+
b: 3
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
expect {
|
|
39
|
+
sucesso: verdadeiro
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
task dividir {
|
|
46
|
+
input {
|
|
47
|
+
dividendo: Numero required
|
|
48
|
+
divisor: Numero required
|
|
49
|
+
}
|
|
50
|
+
output {
|
|
51
|
+
resultado: Numero
|
|
52
|
+
}
|
|
53
|
+
rules {
|
|
54
|
+
divisor deve_ser diferente_de_zero
|
|
55
|
+
}
|
|
56
|
+
effects {
|
|
57
|
+
auditoria operacao divisao
|
|
58
|
+
}
|
|
59
|
+
guarantees {
|
|
60
|
+
resultado existe
|
|
61
|
+
}
|
|
62
|
+
error {
|
|
63
|
+
divisor_zero: "Nao e permitido dividir por zero."
|
|
64
|
+
}
|
|
65
|
+
tests {
|
|
66
|
+
caso "divisao valida" {
|
|
67
|
+
given {
|
|
68
|
+
dividendo: 10
|
|
69
|
+
divisor: 2
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
expect {
|
|
73
|
+
sucesso: verdadeiro
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
module exemplos.crud.simples {
|
|
2
|
+
entity Produto {
|
|
3
|
+
fields {
|
|
4
|
+
id: Id
|
|
5
|
+
nome: Texto
|
|
6
|
+
preco: Decimal
|
|
7
|
+
ativo: Booleano
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
task criar_produto {
|
|
12
|
+
input {
|
|
13
|
+
nome: Texto required
|
|
14
|
+
preco: Decimal required
|
|
15
|
+
}
|
|
16
|
+
output {
|
|
17
|
+
produto: Produto
|
|
18
|
+
}
|
|
19
|
+
rules {
|
|
20
|
+
nome deve_ser preenchido
|
|
21
|
+
preco deve_ser positivo
|
|
22
|
+
}
|
|
23
|
+
effects {
|
|
24
|
+
persistencia Produto
|
|
25
|
+
auditoria produto_criado
|
|
26
|
+
}
|
|
27
|
+
guarantees {
|
|
28
|
+
produto existe
|
|
29
|
+
}
|
|
30
|
+
tests {
|
|
31
|
+
caso "cria produto" {
|
|
32
|
+
given {
|
|
33
|
+
nome: "Caneca"
|
|
34
|
+
preco: 39.9
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
expect {
|
|
38
|
+
sucesso: verdadeiro
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
task atualizar_produto {
|
|
45
|
+
input {
|
|
46
|
+
id: Id required
|
|
47
|
+
nome: Texto
|
|
48
|
+
preco: Decimal
|
|
49
|
+
}
|
|
50
|
+
output {
|
|
51
|
+
produto: Produto
|
|
52
|
+
}
|
|
53
|
+
rules {
|
|
54
|
+
id deve_ser valido
|
|
55
|
+
}
|
|
56
|
+
effects {
|
|
57
|
+
persistencia Produto
|
|
58
|
+
auditoria produto_atualizado
|
|
59
|
+
}
|
|
60
|
+
guarantees {
|
|
61
|
+
produto existe
|
|
62
|
+
}
|
|
63
|
+
tests {
|
|
64
|
+
caso "atualiza produto" {
|
|
65
|
+
given {
|
|
66
|
+
id: "prod_1"
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
expect {
|
|
70
|
+
sucesso: verdadeiro
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
route produtos {
|
|
77
|
+
metodo: POST
|
|
78
|
+
caminho: /produtos
|
|
79
|
+
task: criar_produto
|
|
80
|
+
finalidade: cadastro_produto
|
|
81
|
+
input {
|
|
82
|
+
nome: Texto
|
|
83
|
+
preco: Decimal
|
|
84
|
+
}
|
|
85
|
+
output {
|
|
86
|
+
produto: Produto
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|