Skip to content

Commit 58f6261

Browse files
committed
xref wip
1 parent 90e2967 commit 58f6261

File tree

10 files changed

+57
-40
lines changed

10 files changed

+57
-40
lines changed

calango/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ dependencies = [
1313

1414
[project.scripts]
1515
calango = "calango:main"
16-
farxrefs = "calango:xrefs"
16+
hello = "calango:hello"
1717

1818
[build-system]
1919
requires = ["hatchling"]

calango/src/calango/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
def main() -> None:
22
print("Hello from calango!")
3+
4+

calango/src/calango/xrefs.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import xml.etree.ElementTree as ET
1+
import subprocess
22
from enum import Enum, auto
33
from dataclasses import dataclass
44
from bs4 import BeautifulSoup
5+
from pathlib import Path
56

67

78
class Kind(Enum):
@@ -86,3 +87,36 @@ def validate(xref):
8687

8788
CHAPTER_NUMBER = {i:n for (n, i) in CHAPTER_ID.items()}
8889

90+
91+
def find_git_root():
92+
path = Path(__file__).resolve()
93+
while path != path.parent:
94+
if (path / '.git').is_dir():
95+
return path
96+
path = path.parent
97+
raise LookupError(f'no .git dir found in {path} or parents')
98+
99+
100+
INVALID_MSG = 'asciidoctor: INFO: possible invalid reference: '
101+
102+
def list_invalid_xrefs() -> list[str]:
103+
adoc = find_git_root() / 'vol1/vol1.adoc'
104+
cmd = f'''asciidoctor -v {adoc} -o lixo'''
105+
print(cmd)
106+
result = subprocess.run(cmd, shell=True, stderr=subprocess.PIPE, text=True)
107+
seen = set()
108+
xrefs = []
109+
for line in result.stderr.splitlines():
110+
assert line.startswith(INVALID_MSG), '? msg: ' + line
111+
xref = line[len(INVALID_MSG):].strip()
112+
if xref not in seen:
113+
xrefs.append(xref)
114+
seen.add(xref)
115+
if xref.endswith('_ex'):
116+
print(xref)
117+
118+
return xrefs
119+
120+
121+
if __name__ == '__main__':
122+
list_invalid_xrefs()

online/cap03.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -822,7 +822,7 @@ import builtins
822822
pylookup = ChainMap(locals(), globals(), vars(builtins))
823823
----
824824

825-
O <<environment_class_ex>> mostra uma subclasse de `ChainMap` usada para implementar
825+
A <<lispy_environ_sec>> explica uma subclasse de `ChainMap` usada para implementar
826826
um interpretador parcial da linguagem de programação Scheme.
827827

828828

online/cap08.adoc

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ def tokenize(s: str) -> list[str]:
8383

8484
A assinatura informa que a função `tokenize` recebe uma `str`
8585
e devolve `list[str]`: uma lista de strings.
86-
A utilidade dessa função será explicada no <<lis_parser_ex>>.
86+
A utilidade dessa função será explicada na <<lispy_parser_sec>>.
8787

8888
Um sistema de tipagem gradual:
8989

@@ -2101,8 +2101,10 @@ Arquivos stub não contém valores default, em vez disso eles usam `\...`.
21012101
O tipo de `__status` é `object`, o que significa que pode também ser `None`,
21022102
assim seria redundante escrever `Optional[object]`.
21032103

2104-
Na <<ch_class_metaprog>>,
2105-
o <<checked_class_bottom_ex>> usa `NoReturn` em `__flag_unknown_attrs`, um método projetado para produzir uma mensagem de erro completa e amigável, e então levanta um `AttributeError`.
2104+
Na <<enhancing_with_init_subclass_sec>>,
2105+
o método `__flag_unknown_attrs` tem o tipo de retorno `NoReturn`,
2106+
pois sua função é produzir uma mensagem de erro detalhada e amigável,
2107+
e então levantar `AttributeError`.
21062108

21072109
A última seção desse capítulo épico é sobre parâmetros posicionais e variádicos
21082110
((("", startref="THTusable08")))((("", startref="FTHusable08")))

online/cap18.adoc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,7 @@ não há um tipo de dados string, com operações como fatiamento (_slicing_), d
446446

447447
`Expression`:: Os componentes básicos de programas Scheme são expressões feitas de átomos e listas, possivelmente aninhados.
448448

449+
[[lispy_parser_sec]]
449450
==== O parser
450451

451452
O parser (_analisador sintático_)((("lis.py interpreter", "parser", id="lispyparser18"))) de Norvig tem 36 linhas de código que
@@ -495,6 +496,7 @@ uma representação conveniente de um programa Scheme como listas aninhadas form
495496
.Uma expressão `lambda` de Scheme, representada como código-fonte (sintaxe concreta de expressões-S), como uma árvore, e como uma sequência de objetos Python (sintaxe abstrata).
496497
image::../images/flpy_1801.png["Código Scheme, im diagram de árvore e objetos Python"]
497498

499+
[[lispy_environ_sec]]
498500
==== O ambiente
499501

500502
A((("lis.py interpreter", "Environment class", id="lispyenv18"))) classe `Environment` estende `collections.ChainMap`, acrescentando o método `change`, para atualizar um valor dentro de um dos dicts encadeados que as instâncias de `ChainMap` mantém em uma lista de mapeamentos: o atributo `self.maps`.

online/cap24.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ Instâncias de classes criadas por `record_factory` não são serializáveis--is
230230
Vamos ver agora como emular fábricas de classes mais modernas, como `typing.NamedTuple`, que recebe uma classe definida pelo usuário, escrita com o comando `class`, e a melhora automaticamente, acrescentando funcionalidade.((("", startref="CMfacfun24")))
231231

232232

233-
[[enhancing_with_init_subclass]]
233+
[[enhancing_with_init_subclass_sec]]
234234
=== Apresentando pass:[__init_subclass__]
235235

236236
Tanto((("class metaprogramming", "&#x005F;&#x005F;init_subclass&#x005F;&#x005F;", id="CMinitsub24", secondary-sortas="init")))((("&#x005F;&#x005F;init&#x005F;subclass&#x005F;&#x005F;", id="initsub24"))) `+__init_subclass__+` quanto `+__set_name__+` foram propostos na

print/xrefs/formatos.adoc

Lines changed: 4 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -85,34 +85,9 @@ Ex. do cap03, l.825
8585
O <<environment_class_ex>> mostra uma subclasse
8686
----
8787

88-
[source, html]
89-
----
90-
<div id="environment_class_ex" class="exampleblock">
91-
<div class="title">Exemplo 349. <em>lis.py</em>: a classe <code>Environment</code></div>
92-
<div class="content">
93-
<div class="listingblock">
94-
<div class="content">
95-
<pre class="highlight"><code class="language-py" data-lang="py">class Environment(ChainMap[Symbol, Any]):
96-
"A ChainMap that allows changing an item in-place."
97-
98-
def change(self, key: Symbol, value: Any) -&gt; None:
99-
"Find where key is defined and change the value there."
100-
for map in self.maps:
101-
if key in map:
102-
map[key] = value # type: ignore[index]
103-
return
104-
raise KeyError(key)</code></pre>
105-
</div>
106-
</div>
107-
</div>
108-
</div>
109-
----
110-
111-
Saída:
112-
113-
O Exemplo 349 [cap.18, vol.2, fpy.li/xyz].
114-
115-
Onde fpy.li/xyz direciona para:
88+
Decisão: no volume 1 havia só 3 referências para exemplos em outros volumes,
89+
a solução é complexa, e a numeração de exemplos não inclui o número capítulo,
90+
então editei tais ocorrências para apontar para a seção que
91+
contém o exemplo.
11692

117-
https://pythonfluente.com/2/#environment_class_ex
11893

vol1/cap03.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -822,7 +822,7 @@ import builtins
822822
pylookup = ChainMap(locals(), globals(), vars(builtins))
823823
----
824824

825-
O <<environment_class_ex>> mostra uma subclasse de `ChainMap` usada para implementar
825+
A <<lispy_environ_sec>> explica uma subclasse de `ChainMap` usada para implementar
826826
um interpretador parcial da linguagem de programação Scheme.
827827

828828

vol1/cap08.adoc

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ def tokenize(s: str) -> list[str]:
8383

8484
A assinatura informa que a função `tokenize` recebe uma `str`
8585
e devolve `list[str]`: uma lista de strings.
86-
A utilidade dessa função será explicada no <<lis_parser_ex>>.
86+
A utilidade dessa função será explicada no <<lispy_parser_sec>>.
8787

8888
Um sistema de tipagem gradual:
8989

@@ -2101,8 +2101,10 @@ Arquivos stub não contém valores default, em vez disso eles usam `\...`.
21012101
O tipo de `__status` é `object`, o que significa que pode também ser `None`,
21022102
assim seria redundante escrever `Optional[object]`.
21032103

2104-
Na <<ch_class_metaprog>>,
2105-
o <<checked_class_bottom_ex>> usa `NoReturn` em `__flag_unknown_attrs`, um método projetado para produzir uma mensagem de erro completa e amigável, e então levanta um `AttributeError`.
2104+
Na <<enhancing_with_init_subclass_sec>>,
2105+
o método `__flag_unknown_attrs` tem o tipo de retorno `NoReturn`,
2106+
pois sua função é produzir uma mensagem de erro detalhada e amigável,
2107+
e então levantar `AttributeError`.
21062108

21072109
A última seção desse capítulo épico é sobre parâmetros posicionais e variádicos
21082110
((("", startref="THTusable08")))((("", startref="FTHusable08")))

0 commit comments

Comments
 (0)