Compare View
Commits (3)
Showing
5 changed files
Show diff stats
demo/demo.yaml
@@ -75,9 +75,7 @@ questions: | @@ -75,9 +75,7 @@ questions: | ||
75 | - ref: tut-information | 75 | - ref: tut-information |
76 | - ref: tut-success | 76 | - ref: tut-success |
77 | - ref: tut-warning | 77 | - ref: tut-warning |
78 | - | ||
79 | - # choose one from the list: | ||
80 | - - ref: [tut-alert1, tut-alert2] | 78 | + - ref: tut-alert |
81 | 79 | ||
82 | - ref: tut-generator | 80 | - ref: tut-generator |
83 | - ref: tut-yamllint | 81 | - ref: tut-yamllint |
demo/questions/generate-question.py
1 | #!/usr/bin/env python3 | 1 | #!/usr/bin/env python3 |
2 | 2 | ||
3 | ''' | 3 | ''' |
4 | -Example of a question generator. | ||
5 | -Arguments are read from stdin. | 4 | +Example of a parameterized question generator. |
5 | +Parameters are read from stdin. | ||
6 | +The generated question is written to stdout in JSON format. | ||
6 | ''' | 7 | ''' |
7 | 8 | ||
8 | -from random import randint | 9 | +import json |
10 | +import random | ||
9 | import sys | 11 | import sys |
10 | 12 | ||
11 | # read two arguments from the field `args` specified in the question yaml file | 13 | # read two arguments from the field `args` specified in the question yaml file |
12 | a, b = (int(n) for n in sys.argv[1:]) | 14 | a, b = (int(n) for n in sys.argv[1:]) |
13 | 15 | ||
14 | -x = randint(a, b) | ||
15 | -y = randint(a, b) | 16 | +x = random.randint(a, b) |
17 | +y = random.randint(a, b) | ||
16 | r = x + y | 18 | r = x + y |
17 | 19 | ||
18 | -print(f"""--- | ||
19 | -type: text | ||
20 | -title: Geradores de perguntas | ||
21 | -text: | | ||
22 | - | ||
23 | - As perguntas podem ser estáticas (como as que vimos até aqui), ou serem | ||
24 | - geradas dinâmicamente por um programa externo. Para gerar uma pergunta, o | ||
25 | - programa deve escrever texto no `stdout` em formato `yaml` tal como os | ||
26 | - exemplos das perguntas estáticas dos tipos apresentados anteriormente. Pode | ||
27 | - também receber argumentos de linha de comando para parametrizar a pergunta. | ||
28 | - Aqui está um exemplo de uma pergunta gerada por um script python: | ||
29 | - | ||
30 | - ```python | ||
31 | - #!/usr/bin/env python3 | ||
32 | - | ||
33 | - from random import randint | ||
34 | - import sys | ||
35 | - | ||
36 | - a, b = (int(n) for n in sys.argv[1:]) # argumentos da linha de comando | ||
37 | - | ||
38 | - x = randint(a, b) # número inteiro no intervalo a..b | ||
39 | - y = randint(a, b) # número inteiro no intervalo a..b | ||
40 | - r = x + y # calcula resultado correcto | ||
41 | - | ||
42 | - print(f'''--- | ||
43 | - type: text | ||
44 | - title: Contas de somar | ||
45 | - text: | | ||
46 | - Calcule o resultado de ${{x}} + {{y}}$. | ||
47 | - correct: '{{r}}' | ||
48 | - solution: | | ||
49 | - A solução é {{r}}.''') | ||
50 | - ``` | ||
51 | - | ||
52 | - Este script deve ter permissões para poder ser executado no terminal. | ||
53 | - Podemos testar o programa no terminal `./gen-somar.py 1 100` e verificar que | ||
54 | - o output é uma pergunta válida em formato `yaml`. Agora é necessário indicar | ||
55 | - que este script deve ser usado para gerar uma pergunta. | ||
56 | - | ||
57 | - Uma pergunta gerada por um programa externo é declarada com | ||
58 | - | ||
59 | - ```yaml | ||
60 | - - type: generator | ||
61 | - ref: gen-somar | ||
62 | - script: gen-somar.py | ||
63 | - # argumentos opcionais | ||
64 | - args: [1, 100] | ||
65 | - ``` | ||
66 | - | ||
67 | - O programa pode receber uma lista de argumentos de linha de comando | ||
68 | - declarados em `args`. | ||
69 | - | ||
70 | - --- | ||
71 | - | ||
72 | - Calcule o resultado de ${x} + {y}$. | ||
73 | - | ||
74 | - Os números foram gerados aleatoriamente no intervalo de {a} a {b}. | ||
75 | -correct: '{r}' | ||
76 | -solution: | | ||
77 | - A solução é {r}.""") | 20 | +# ---------------------------------------------------------------------------- |
21 | +text = ''' | ||
22 | +As perguntas podem ser estáticas (como as que vimos até aqui), ou serem | ||
23 | +geradas dinâmicamente por um programa externo. Para gerar uma pergunta, o | ||
24 | +programa deve escrever texto no `stdout` em formato `yaml` tal como os | ||
25 | +exemplos das perguntas estáticas dos tipos apresentados anteriormente. Pode | ||
26 | +também receber argumentos de linha de comando para parametrizar a pergunta. | ||
27 | +Aqui está um exemplo de uma pergunta gerada por um script python: | ||
28 | + | ||
29 | +```python | ||
30 | + #!/usr/bin/env python3 | ||
31 | + | ||
32 | + import json | ||
33 | + import random | ||
34 | + import sys | ||
35 | + | ||
36 | + a, b = (int(n) for n in sys.argv[1:]) # argumentos da linha de comando | ||
37 | + | ||
38 | + x = random.randint(a, b) # número inteiro no intervalo a..b | ||
39 | + y = random.randint(a, b) # número inteiro no intervalo a..b | ||
40 | + r = x + y # calcula o resultado correcto | ||
41 | + | ||
42 | + question = { | ||
43 | + 'type': 'text', | ||
44 | + 'title': 'Geradores de perguntas', | ||
45 | + 'text': f'Quanto é {x} + {y}?', | ||
46 | + 'transform': ['trim'], | ||
47 | + 'correct': f'{r}', | ||
48 | + 'solution': f'A resposta correcta é {r}.' | ||
49 | + } | ||
50 | + json.dump(question, sys.stdout) | ||
51 | +``` | ||
52 | + | ||
53 | +Este script deve ter permissões para poder ser executado. | ||
54 | +Podemos testar o programa no terminal `./gen-somar.py 1 100` e verificar que | ||
55 | +o output é uma pergunta válida no formato JSON. Agora é necessário indicar | ||
56 | +que este script deve ser usado para gerar uma pergunta. | ||
57 | + | ||
58 | +Uma pergunta gerada por um programa externo é declarada com | ||
59 | + | ||
60 | +```yaml | ||
61 | +- type: generator | ||
62 | + ref: gen-somar | ||
63 | + script: gen-somar.py | ||
64 | + # argumentos opcionais | ||
65 | + args: [1, 100] | ||
66 | +``` | ||
67 | + | ||
68 | +O script vai receber a lista de argumentos declarados em `args`. | ||
69 | +A pergunta vai ser modificada, sendo acrescentados os campos gerados pelo | ||
70 | +script. O tipo da pergunta vai também ser preenchido pelo tipo correcto. | ||
71 | +Apenas a referência mantém-se. | ||
72 | + | ||
73 | +--- | ||
74 | + | ||
75 | +''' | ||
76 | +# ---------------------------------------------------------------------------- | ||
77 | + | ||
78 | +question = { | ||
79 | + 'type': 'text', | ||
80 | + 'title': 'Geradores de perguntas', | ||
81 | + 'text': text + f'Quanto é {x} + {y}?', | ||
82 | + 'transform': ['trim'], | ||
83 | + 'correct': f'{r}', | ||
84 | + 'solution': f'A resposta correcta é {r}.' | ||
85 | +} | ||
86 | + | ||
87 | +json.dump(question, sys.stdout) |
demo/questions/tutorial.yaml
@@ -10,7 +10,7 @@ | @@ -10,7 +10,7 @@ | ||
10 | ficheiros de perguntas a importar e uma selecção de perguntas e respectivas | 10 | ficheiros de perguntas a importar e uma selecção de perguntas e respectivas |
11 | cotações. | 11 | cotações. |
12 | 12 | ||
13 | - Exemplo: | 13 | + Exemplo de um ficheiro `test.yaml`: |
14 | 14 | ||
15 | ```yaml | 15 | ```yaml |
16 | --- | 16 | --- |
@@ -18,7 +18,7 @@ | @@ -18,7 +18,7 @@ | ||
18 | ref: tutorial # referência, pode ser reusada em vários turnos | 18 | ref: tutorial # referência, pode ser reusada em vários turnos |
19 | title: Demonstração # título da prova | 19 | title: Demonstração # título da prova |
20 | database: students.db # base de dados previamente criada com initdb | 20 | database: students.db # base de dados previamente criada com initdb |
21 | - answers_dir: ans # directório onde ficam os testes dos alunos | 21 | + answers_dir: ans # directório onde ficam as submissões dos alunos |
22 | 22 | ||
23 | # opcionais | 23 | # opcionais |
24 | duration: 60 # duração da prova em minutos (default: inf) | 24 | duration: 60 # duração da prova em minutos (default: inf) |
@@ -28,7 +28,7 @@ | @@ -28,7 +28,7 @@ | ||
28 | # não normaliza por defeito (default: None) | 28 | # não normaliza por defeito (default: None) |
29 | 29 | ||
30 | # -------------------------------------------------------------------------- | 30 | # -------------------------------------------------------------------------- |
31 | - # Ficheiros de perguntas a importar (relativamente a `questions_dir`) | 31 | + # Ficheiros de perguntas a importar |
32 | files: | 32 | files: |
33 | - tabelas.yaml | 33 | - tabelas.yaml |
34 | - topic1/questions.yaml | 34 | - topic1/questions.yaml |
@@ -46,19 +46,19 @@ | @@ -46,19 +46,19 @@ | ||
46 | - ref: pergunta2 | 46 | - ref: pergunta2 |
47 | points: 2.0 | 47 | points: 2.0 |
48 | 48 | ||
49 | - # por defeinto, a cotação da pergunta é 1.0 valor | 49 | + # por defeito, a pergunta tem a cotação de 1.0 valor |
50 | - ref: pergunta3 | 50 | - ref: pergunta3 |
51 | 51 | ||
52 | # escolhe aleatoriamente uma das variantes da pergunta | 52 | # escolhe aleatoriamente uma das variantes da pergunta |
53 | - - ref: [pergunta3a, pergunta3b] | 53 | + - ref: [pergunta4a, pergunta4b] |
54 | points: 0.5 | 54 | points: 0.5 |
55 | 55 | ||
56 | # -------------------------------------------------------------------------- | 56 | # -------------------------------------------------------------------------- |
57 | ``` | 57 | ``` |
58 | 58 | ||
59 | - A ordem das perguntas é mantida quando apresentada no teste. | 59 | + A ordem das perguntas é mantida. |
60 | 60 | ||
61 | - O mesmo teste pode ser realizado várias vezes em turnos diferentes, não é | 61 | + O mesmo teste pode ser repetido várias vezes em turnos diferentes, não é |
62 | necessário alterar nada. | 62 | necessário alterar nada. |
63 | 63 | ||
64 | # ---------------------------------------------------------------------------- | 64 | # ---------------------------------------------------------------------------- |
@@ -278,8 +278,8 @@ | @@ -278,8 +278,8 @@ | ||
278 | mantêm-se inalterados. | 278 | mantêm-se inalterados. |
279 | * `remove_space` remove todos os espaços (início, meio e fim). | 279 | * `remove_space` remove todos os espaços (início, meio e fim). |
280 | * `normalize_space` remove espaços do início e fim (trim), e substitui | 280 | * `normalize_space` remove espaços do início e fim (trim), e substitui |
281 | - múltiplos espaços por um único espaço (no meio). | ||
282 | - * `lower` e `upper` convertem respectivamente para minúsculas e maiúsculas. | 281 | + múltiplos espaços por um único espaço no meio. |
282 | + * `lower` e `upper` convertem para minúsculas e maiúsculas, respectivamente. | ||
283 | transform: ['trim', 'lower'] | 283 | transform: ['trim', 'lower'] |
284 | correct: ['azul'] | 284 | correct: ['azul'] |
285 | solution: | | 285 | solution: | |
@@ -314,15 +314,12 @@ | @@ -314,15 +314,12 @@ | ||
314 | - '[Vv]erde' | 314 | - '[Vv]erde' |
315 | ``` | 315 | ``` |
316 | 316 | ||
317 | - --- | ||
318 | - | ||
319 | - **Atenção:** A expressão regular deve seguir as convenções da suportadas em | ||
320 | - python (ver | ||
321 | - [Regular expression operations](https://docs.python.org/3/library/re.html)). | ||
322 | - Em particular, a expressão regular acima também aceita a resposta | ||
323 | - `verde, azul`. | ||
324 | - Deve marcar-se o início e final `^(VERDE|[Vv]erde)$` para evitar estas | ||
325 | - situações. | 317 | + **Atenção:** |
318 | + A expressão regular deve seguir as convenções suportadas em python, ver | ||
319 | + [Regular expression operations](https://docs.python.org/3/library/re.html). | ||
320 | + Em particular, a expressão regular acima também aceita a resposta `verde, | ||
321 | + azul`. Deve marcar-se o início e final da string `^(VERDE|[Vv]erde)$` para | ||
322 | + evitar estas situações. | ||
326 | 323 | ||
327 | correct: '(VERDE|[Vv]erde)' | 324 | correct: '(VERDE|[Vv]erde)' |
328 | solution: | | 325 | solution: | |
@@ -333,7 +330,7 @@ | @@ -333,7 +330,7 @@ | ||
333 | ref: tut-numeric-interval | 330 | ref: tut-numeric-interval |
334 | title: Resposta numérica em linha de texto | 331 | title: Resposta numérica em linha de texto |
335 | text: | | 332 | text: | |
336 | - Este tipo de perguntas esperam uma resposta numérica (vírgula flutuante). | 333 | + Este tipo de perguntas esperam uma resposta numérica em vírgula flutuante. |
337 | O resultado é considerado correcto se estiver dentro do intervalo fechado | 334 | O resultado é considerado correcto se estiver dentro do intervalo fechado |
338 | indicado. | 335 | indicado. |
339 | 336 | ||
@@ -354,7 +351,7 @@ | @@ -354,7 +351,7 @@ | ||
354 | 351 | ||
355 | **Atenção:** as respostas têm de usar o ponto como separador decimal. | 352 | **Atenção:** as respostas têm de usar o ponto como separador decimal. |
356 | Em geral são aceites números inteiros, como `123`, | 353 | Em geral são aceites números inteiros, como `123`, |
357 | - ou em vírgula flutuante, como em `0.23`, `1e-3`. | 354 | + ou em vírgula flutuante, como em `0.23`, `1e-3`, `1.2e4`. |
358 | correct: [3.14, 3.15] | 355 | correct: [3.14, 3.15] |
359 | solution: | | 356 | solution: | |
360 | Sabemos que $\pi\approx 3.14159265359$. | 357 | Sabemos que $\pi\approx 3.14159265359$. |
@@ -366,14 +363,14 @@ | @@ -366,14 +363,14 @@ | ||
366 | title: Resposta em múltiplas linhas de texto | 363 | title: Resposta em múltiplas linhas de texto |
367 | text: | | 364 | text: | |
368 | Este tipo de perguntas permitem respostas em múltiplas linhas de texto e | 365 | Este tipo de perguntas permitem respostas em múltiplas linhas de texto e |
369 | - são as mais flexíveis. | 366 | + são as mais flexíveis, sendo a resposta enviada para um programa externo |
367 | + para ser avaliada. | ||
370 | 368 | ||
371 | - A resposta é enviada para um programa externo para ser avaliada. | ||
372 | - O programa externo é um programa que tem de ser executável pelo pelo | ||
373 | - sistema operativo (pode ser um binário ou script desde que o respectivo | ||
374 | - interpretador instalado). | 369 | + O programa externo é um programa que tem de ser executável pelo sistema |
370 | + operativo (pode ser um binário ou script desde que o respectivo | ||
371 | + interpretador esteja instalado). | ||
375 | Este programa externo recebe a resposta submetida pelo aluno via `stdin` e | 372 | Este programa externo recebe a resposta submetida pelo aluno via `stdin` e |
376 | - devolve a classificação via `stdout`. | 373 | + devolve a classificação em formato JSON via `stdout`. |
377 | Exemplo: | 374 | Exemplo: |
378 | 375 | ||
379 | ```yaml | 376 | ```yaml |
@@ -390,7 +387,7 @@ | @@ -390,7 +387,7 @@ | ||
390 | resposta contém as três palavras red, green e blue, e calcula uma nota no | 387 | resposta contém as três palavras red, green e blue, e calcula uma nota no |
391 | intervalo 0.0 a 1.0. | 388 | intervalo 0.0 a 1.0. |
392 | O programa externo é executado num processo separado e a interacção faz-se | 389 | O programa externo é executado num processo separado e a interacção faz-se |
393 | - via stdin/stdout. | 390 | + via *stdin/stdout*. |
394 | 391 | ||
395 | Se o programa externo exceder o `timeout` indicado (em segundos), | 392 | Se o programa externo exceder o `timeout` indicado (em segundos), |
396 | este é automaticamente terminado e é atribuída a classificação de 0.0 | 393 | este é automaticamente terminado e é atribuída a classificação de 0.0 |
@@ -405,18 +402,29 @@ | @@ -405,18 +402,29 @@ | ||
405 | 0.75 | 402 | 0.75 |
406 | ``` | 403 | ``` |
407 | 404 | ||
408 | - ou opcionalmente escrever em formato json ou yaml, eventualmente com um | ||
409 | - comentário que será arquivado com o teste. | ||
410 | - Exemplo: | 405 | + ou escrever em formato JSON, eventualmente com um comentário que será |
406 | + arquivado com o teste. Exemplo: | ||
411 | 407 | ||
412 | - ```yaml | ||
413 | - grade: 0.5 | ||
414 | - comments: | | ||
415 | - Esqueceu-se de algumas cores. | ||
416 | - A resposta correcta era `red green blue`. | 408 | + ```json |
409 | + { "grade": 0.5, "comments": "Esqueceu-se de algumas cores." } | ||
417 | ``` | 410 | ``` |
418 | 411 | ||
419 | O comentário é mostrado na revisão de prova. | 412 | O comentário é mostrado na revisão de prova. |
413 | + | ||
414 | + Como este tipo de perguntas é mais complexo, incluem-se *unit tests* para | ||
415 | + testar os scripts de correcção das perguntas antes do início da prova. | ||
416 | + As opções seguintes mostram casos em que a resposta está correcta e casos | ||
417 | + em que a resposta está errada. O script de correcção é testado sobre todos | ||
418 | + estes casos e para cada pergunta de cada aluno: | ||
419 | + | ||
420 | + ```yaml | ||
421 | + tests_right: | ||
422 | + - 'red green blue' | ||
423 | + - 'green blue red' | ||
424 | + tests_wrong: | ||
425 | + - '' | ||
426 | + - 'blue yellow black' | ||
427 | + ``` | ||
420 | answer: | | 428 | answer: | |
421 | Aqui o aluno escreve a resposta. | 429 | Aqui o aluno escreve a resposta. |
422 | Esta caixa aumenta de tamanho automaticamente e | 430 | Esta caixa aumenta de tamanho automaticamente e |
@@ -425,13 +433,14 @@ | @@ -425,13 +433,14 @@ | ||
425 | timeout: 5 | 433 | timeout: 5 |
426 | tests_right: | 434 | tests_right: |
427 | - 'red green blue' | 435 | - 'red green blue' |
428 | - # tests_wrong: | ||
429 | - # - 'blue gray yellow' | 436 | + tests_wrong: |
437 | + - '' | ||
438 | + - 'blue gray yellow' | ||
430 | 439 | ||
431 | # --------------------------------------------------------------------------- | 440 | # --------------------------------------------------------------------------- |
432 | - type: information | 441 | - type: information |
433 | ref: tut-information | 442 | ref: tut-information |
434 | - title: Texto informativo | 443 | + title: Texto informativo (genérico) |
435 | text: | | 444 | text: | |
436 | As perguntas deste tipo não contam para avaliação. O objectivo é fornecer | 445 | As perguntas deste tipo não contam para avaliação. O objectivo é fornecer |
437 | instruções para os alunos, por exemplo tabelas para consulta, fórmulas, etc. | 446 | instruções para os alunos, por exemplo tabelas para consulta, fórmulas, etc. |
@@ -467,7 +476,7 @@ | @@ -467,7 +476,7 @@ | ||
467 | ref: tut-success | 476 | ref: tut-success |
468 | title: Texto informativo (sucesso) | 477 | title: Texto informativo (sucesso) |
469 | text: | | 478 | text: | |
470 | - Não conta para avaliação. É apenas o aspecto gráfico que muda. | 479 | + Semelhante ao anterior, mas com cores diferentes. |
471 | 480 | ||
472 | Um pedaço de código em linha, por exemplo `x = sqrt(z)` é marcado com uma | 481 | Um pedaço de código em linha, por exemplo `x = sqrt(z)` é marcado com uma |
473 | fonte e cor diferente. | 482 | fonte e cor diferente. |
@@ -508,7 +517,7 @@ | @@ -508,7 +517,7 @@ | ||
508 | ref: tut-warning | 517 | ref: tut-warning |
509 | title: Texto informativo (aviso) | 518 | title: Texto informativo (aviso) |
510 | text: | | 519 | text: | |
511 | - Não conta para avaliação. | 520 | + Semelhante aos anteriores. |
512 | 521 | ||
513 | Neste exemplo mostramos como se pode construir uma tabela como a seguinte: | 522 | Neste exemplo mostramos como se pode construir uma tabela como a seguinte: |
514 | 523 | ||
@@ -539,26 +548,10 @@ | @@ -539,26 +548,10 @@ | ||
539 | 548 | ||
540 | # ---------------------------------------------------------------------------- | 549 | # ---------------------------------------------------------------------------- |
541 | - type: alert | 550 | - type: alert |
542 | - ref: tut-alert1 | ||
543 | - title: Texto informativo (perigo) - versão 1 | 551 | + ref: tut-alert |
552 | + title: Texto informativo (perigo) | ||
544 | text: | | 553 | text: | |
545 | - Não conta para avaliação. Texto importante. | ||
546 | - | ||
547 | -  | ||
548 | - | ||
549 | - As imagens podem ser adicionadas usando a notação standard em markdown. Há | ||
550 | - duas possibilidads: | ||
551 | - | ||
552 | - - Imagens inline: não têm título definido e podem ser incluídas no meio de | ||
553 | - uma linha de texto usando``. | ||
554 | - - Imagens centradas com título: ``. | ||
555 | - O título é colocado por baixo da imagem. Pode ser uma string vazia. | ||
556 | - | ||
557 | -- type: alert | ||
558 | - ref: tut-alert2 | ||
559 | - title: Texto informativo (perigo) - versão 2 | ||
560 | - text: | | ||
561 | - Não conta para avaliação. Texto importante. | 554 | + Semelhante aos anteriores. |
562 | 555 | ||
563 |  | 556 |  |
564 | 557 | ||
@@ -599,11 +592,3 @@ | @@ -599,11 +592,3 @@ | ||
599 | yamllint test.yaml | 592 | yamllint test.yaml |
600 | yamllint questions.yaml | 593 | yamllint questions.yaml |
601 | ``` | 594 | ``` |
602 | - | ||
603 | - No caso de programas geradores de perguntas e programas de correcção de | ||
604 | - respostas pode usar-se um *pipe*: | ||
605 | - | ||
606 | - ```sh | ||
607 | - generate-question | yamllint - | ||
608 | - correct-answer | yamllint - | ||
609 | - ``` |
package.json
@@ -2,12 +2,12 @@ | @@ -2,12 +2,12 @@ | ||
2 | "description": "Javascript libraries required to run the server", | 2 | "description": "Javascript libraries required to run the server", |
3 | "email": "mjsb@uevora.pt", | 3 | "email": "mjsb@uevora.pt", |
4 | "dependencies": { | 4 | "dependencies": { |
5 | - "bootstrap": "^5.1.0", | ||
6 | - "bootstrap-icons": "^1.8.0", | 5 | + "bootstrap": "^5.3.3", |
6 | + "bootstrap-icons": "^1.11.3", | ||
7 | "codemirror": "^5.65.2", | 7 | "codemirror": "^5.65.2", |
8 | - "datatables": "^1.10.18", | ||
9 | - "jquery": "^3.6.0", | ||
10 | - "mathjax": "^3.2.0", | ||
11 | - "underscore": "^1.13.2" | 8 | + "datatables": "<2.0.0", |
9 | + "jquery": "^3.7.1", | ||
10 | + "mathjax": "^3.2.2", | ||
11 | + "underscore": "^1.13.6" | ||
12 | } | 12 | } |
13 | } | 13 | } |
setup.py
@@ -7,19 +7,19 @@ from setuptools import setup, find_packages | @@ -7,19 +7,19 @@ from setuptools import setup, find_packages | ||
7 | from perguntations import (__author__, __license__, | 7 | from perguntations import (__author__, __license__, |
8 | APP_NAME, APP_VERSION, APP_DESCRIPTION) | 8 | APP_NAME, APP_VERSION, APP_DESCRIPTION) |
9 | 9 | ||
10 | -with open("README.md", "r") as f: | 10 | +with open('README.md', 'r') as f: |
11 | long_description = f.read() | 11 | long_description = f.read() |
12 | 12 | ||
13 | setup( | 13 | setup( |
14 | name=APP_NAME, | 14 | name=APP_NAME, |
15 | version=APP_VERSION, | 15 | version=APP_VERSION, |
16 | author=__author__, | 16 | author=__author__, |
17 | - author_email="mjsb@uevora.pt", | 17 | + author_email='mjsb@uevora.pt', |
18 | license=__license__, | 18 | license=__license__, |
19 | description=APP_DESCRIPTION.split('\n')[0], | 19 | description=APP_DESCRIPTION.split('\n')[0], |
20 | long_description=APP_DESCRIPTION, | 20 | long_description=APP_DESCRIPTION, |
21 | - long_description_content_type="text/markdown", | ||
22 | - url="https://git.xdi.uevora.pt/mjsb/perguntations.git", | 21 | + long_description_content_type='text/markdown', |
22 | + url='https://git.xdi.uevora.pt/mjsb/perguntations.git', | ||
23 | packages=find_packages(), | 23 | packages=find_packages(), |
24 | include_package_data=True, # install files from MANIFEST.in | 24 | include_package_data=True, # install files from MANIFEST.in |
25 | python_requires='>=3.9', | 25 | python_requires='>=3.9', |