• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

APN-Pucky / pyfeyn2 / 14949175800

10 May 2025 09:12PM UTC coverage: 65.23% (-1.8%) from 67.018%
14949175800

push

github

web-flow
add: root renderer (#319)

* init root renderer

* Update docs folder

* Update readme

* Gallery only TIKZ

* Use warnings deprecated

* bump

* Updates

* Fixes

* fmt2

* fix smpl import

* rename: dir -> sense

* toml -> tomlib

* Fix wanring -> fail unicode

* fallback to tomli

* Fix typo

47 of 155 new or added lines in 9 files covered. (30.32%)

2 existing lines in 1 file now uncovered.

2180 of 3342 relevant lines covered (65.23%)

0.65 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

82.8
/pyfeyn2/render/all.py
1
import importlib
1✔
2
import shutil
1✔
3
import tempfile
1✔
4
import traceback
1✔
5
from typing import List
1✔
6

7
from feynml.shape import get_shapes
1✔
8
from feynml.type import get_types
1✔
9
from matplotlib import pyplot as plt
1✔
10
from pylatex import Figure, NoEscape, SubFigure
1✔
11

12
from pyfeyn2.render.js.mermaid import MermaidRender
1✔
13
from pyfeyn2.render.latex.dot import DotRender
1✔
14
from pyfeyn2.render.latex.feynmp import FeynmpRender
1✔
15
from pyfeyn2.render.latex.latex import LatexRender
1✔
16
from pyfeyn2.render.latex.tikzfeynman import TikzFeynmanRender
1✔
17
from pyfeyn2.render.mpl.feynmanrender import FeynmanRender
1✔
18
from pyfeyn2.render.ps.madgraph import MadGraphRender
1✔
19
from pyfeyn2.render.pyx.pyxrender import PyxRender
1✔
20
from pyfeyn2.render.text.ascii import ASCIIRender
1✔
21
from pyfeyn2.render.text.asciipdf import ASCIIPDFRender
1✔
22
from pyfeyn2.render.text.unicode import UnicodeRender
1✔
23
from pyfeyn2.render.text.unicodepdf import UnicodePDFRender
1✔
24

25
renders = {
1✔
26
    "tikz": TikzFeynmanRender,
27
    "pyx": PyxRender,
28
    "feynmp": FeynmpRender,
29
    "feynman": FeynmanRender,
30
    "dot": DotRender,
31
    "mermaid": MermaidRender,
32
    "asciipdf": ASCIIPDFRender,
33
    "unicodepdf": UnicodePDFRender,
34
    "madgraph": MadGraphRender,
35
}
36

37
try:
1✔
38
    from pyfeyn2.render.root.rootpdfrender import ROOTPDFRender
1✔
39

NEW
40
    renders["root"] = ROOTPDFRender
×
41
except ImportError:
1✔
42
    pass
1✔
43

44

45
def class_for_name(module_name, class_name):
1✔
46
    # load the module, will raise ImportError if module cannot be loaded
47
    m = importlib.import_module(module_name)
×
48
    # get the class, will raise AttributeError if class cannot be found
49
    c = getattr(m, class_name)
×
50
    return c
×
51

52

53
def renderer_from_string(s):
1✔
54
    if s is None:
1✔
55
        return None
×
56
    elif s.lower() == "ascii":
1✔
57
        return ASCIIRender
×
58
    elif s.lower() == "unicode":
1✔
59
        return UnicodeRender
×
60
    elif s.lower() in renders:
1✔
61
        return renders[s.lower()]
1✔
62
    else:
63
        return class_for_name(".".join(s.split(".")[0:-1]), s.split(".")[-1])
×
64

65

66
class AllRender(LatexRender):
1✔
67
    """Render all diagrams to PDF."""
68

69
    def __init__(
1✔
70
        self,
71
        fd=None,
72
        documentclass="standalone",
73
        document_options=None,
74
        *args,
75
        **kwargs,
76
    ):
77
        if document_options is None:
1✔
78
            document_options = ["varwidth"]
1✔
79
        super().__init__(
1✔
80
            *args,
81
            fd=fd,
82
            documentclass=documentclass,
83
            document_options=document_options,
84
            **kwargs,
85
        )
86

87
    def render(
1✔
88
        self,
89
        file=None,
90
        show=True,
91
        subfigure=False,
92
        resolution=None,
93
        width=None,
94
        height=None,
95
    ):
96
        fd = self.fd
1✔
97
        self.dirpath = tempfile.mkdtemp()
1✔
98
        dirpath = self.dirpath
1✔
99

100
        dynarg = {}
1✔
101
        if show and not subfigure:
1✔
102
            dynarg["show"] = True
1✔
103
            if resolution is not None:
1✔
104
                dynarg["resolution"] = resolution
×
105
            if width is not None:
1✔
106
                dynarg["width"] = width
×
107
            if height is not None:
1✔
108
                dynarg["height"] = height
×
109
        else:
110
            dynarg = {"show": False}
1✔
111

112
        with self.create(Figure(position="h!")):
1✔
113
            for i, name in enumerate(renders):
1✔
114
                render = renders[name]
1✔
115
                if name == "all":
1✔
116
                    continue
×
117
                try:
1✔
118
                    if not subfigure:
1✔
119
                        print(name + ":")
1✔
120
                    render(fd).render(dirpath + "/" + name + ".pdf", **dynarg)
1✔
121
                    plt.close()
1✔
122
                except Exception:
1✔
123
                    print(name + " failed:")
1✔
124
                    print(traceback.format_exc())
1✔
125
                with self.create(SubFigure(position="b")) as subfig:
1✔
126
                    subfig.add_image(
1✔
127
                        dirpath + "/" + name + ".pdf",
128
                        width=NoEscape("0.49\\textwidth"),
129
                    )
130
                    subfig.add_caption(name)
1✔
131
                if i % 2 == 1:
1✔
132
                    self.append(NoEscape(r"\\"))
1✔
133

134
        if subfigure:
1✔
135
            super().render(file, show, resolution, width, height)
×
136
        shutil.rmtree(self.dirpath)
1✔
137

138
    @classmethod
1✔
139
    def valid_styles(style: str) -> List[str]:
1✔
140
        return sorted(list({i for r in renders.values() for i in r.valid_styles()}))
×
141

142
    @classmethod
1✔
143
    def valid_attributes(attr: str) -> List[str]:
1✔
144
        return sorted(list({i for r in renders.values() for i in r.valid_attributes()}))
×
145

146
    @classmethod
1✔
147
    def valid_types(typ: str) -> List[str]:
1✔
148
        return sorted(get_types())
1✔
149
        # return [i for r in renders.values() for i in r.valid_types()]
150

151
    @classmethod
1✔
152
    def valid_shapes(typ: str) -> List[str]:
1✔
153
        return sorted(get_shapes())
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc