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

zostera / django-icons / 7614203720

22 Jan 2024 04:23PM UTC coverage: 97.047%. First build
7614203720

Pull #431

github

web-flow
Bump ruff from 0.1.13 to 0.1.14

Bumps [ruff](https://github.com/astral-sh/ruff) from 0.1.13 to 0.1.14.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/v0.1.13...v0.1.14)

---
updated-dependencies:
- dependency-name: ruff
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Pull Request #431: Bump ruff from 0.1.13 to 0.1.14

98 of 103 branches covered (0.0%)

Branch coverage included in aggregate %.

395 of 405 relevant lines covered (97.53%)

15.59 hits per line

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

97.47
/src/django_icons/core.py
1
import warnings
16✔
2
from copy import deepcopy
16✔
3

4
from django.conf import settings
16✔
5
from django.utils.functional import keep_lazy_text
16✔
6
from django.utils.module_loading import import_string
16✔
7
from django.utils.safestring import mark_safe
16✔
8

9
from django_icons.css import merge_css_list
16✔
10
from django_icons.renderers import Bootstrap3Renderer, FontAwesome4Renderer, IconRenderer, ImageRenderer
16✔
11
from django_icons.renderers.material import MaterialRenderer
16✔
12

13
DEFAULT_RENDERERS = {
16✔
14
    "icon": IconRenderer,
15
    "fontawesome4": FontAwesome4Renderer,
16
    "bootstrap3": Bootstrap3Renderer,
17
    "material": MaterialRenderer,
18
    "image": ImageRenderer,
19
}
20

21

22
def icon(name, *args, **kwargs):
16✔
23
    """
24
    Render an icon.
25

26
    Deprecated because of frequent name collisions.
27
    """
28
    warnings.warn("The `icon` function is deprecated, user `render_icon` instead.", DeprecationWarning)
16✔
29
    return render_icon(name, *args, **kwargs)
16✔
30

31

32
@keep_lazy_text
16✔
33
def render_icon(name, *args, **kwargs):
16✔
34
    """
35
    Render an icon.
36

37
    **Parameters**:
38

39
        name
40
            The name of the icon to be rendered.
41

42
        title
43
            The title attribute for the icon
44

45
            :default: None (no title attribute rendered).
46

47
        renderer
48
            The renderer to use for the icon
49

50
            :default: The default renderer as per ``settings.py``, or ultimately `IconRenderer`.
51

52
        tag
53
            The tag to use for the icon
54

55
            :default: Each renderer has a default tag set. This parameter overrides the renderer's default tag.
56

57
    **Usage**::
58

59
        render_icon(name)
60

61
    **Example**::
62

63
        render_icon("pencil")
64
        render_icon("trash", title="Delete")
65
    """
66
    icon_kwargs = get_icon_kwargs(name, *args, **kwargs)
16✔
67
    renderer_class = get_icon_renderer(icon_kwargs.get("renderer", None))
16✔
68
    renderer = renderer_class(**icon_kwargs)
16✔
69
    return renderer.render()
16✔
70

71

72
def _get_setting(section, name, default=None):
16✔
73
    """Return a setting from a section, optionally provide default."""
74
    try:
16✔
75
        # Read from settings
76
        setting = deepcopy(settings.DJANGO_ICONS[section][name])
16✔
77
    except (AttributeError, KeyError, TypeError):
16✔
78
        # Set to default
79
        setting = default
16✔
80

81
    return setting
16✔
82

83

84
def _render_settings_content(content):
16✔
85
    """Render content from icon settings."""
86
    if not isinstance(content, list):
16!
87
        content = [content]
×
88
    result = mark_safe("")
16✔
89
    for item in content:
16✔
90
        result += render_icon(**item) if isinstance(item, dict) else str(item)
16✔
91
    return result
16✔
92

93

94
def get_icon_kwargs_from_settings(name):
16✔
95
    """Return the kwargs from settings, return a dict with at least a `name` key."""
96
    kwargs_from_settings = _get_setting("ICONS", name, {})
16✔
97
    if isinstance(kwargs_from_settings, str):
16✔
98
        kwargs_from_settings = {"name": kwargs_from_settings}
16✔
99
    kwargs_from_settings.setdefault("name", name)
16✔
100
    if "content" in kwargs_from_settings:
16✔
101
        kwargs_from_settings["content"] = _render_settings_content(kwargs_from_settings["content"])
16✔
102
    return kwargs_from_settings
16✔
103

104

105
def get_icon_kwargs(name, *args, **kwargs):
16✔
106
    """Build the kwargs for the icon function based on args and kwargs of the template tag."""
107
    icon_kwargs = get_icon_kwargs_from_settings(name)
16✔
108
    extra_classes = icon_kwargs.get("extra_classes", "")
16✔
109

110
    icon_kwargs.update(kwargs)
16✔
111

112
    extra_classes = merge_css_list(extra_classes, args, kwargs.get("extra_classes", ""))
16✔
113
    if extra_classes:
16✔
114
        icon_kwargs["extra_classes"] = extra_classes
16✔
115

116
    return icon_kwargs
16✔
117

118

119
def _get_icon_renderer_by_name(name):
16✔
120
    """Return class or dotted path to renderer class with this name from dict in settings."""
121
    default = DEFAULT_RENDERERS.get(name, None)
16✔
122
    renderer_class = _get_setting("RENDERERS", name, default)
16✔
123
    return renderer_class if renderer_class else name
16✔
124

125

126
def get_icon_renderer(renderer=None):
16✔
127
    """Return the default icon renderer."""
128
    renderer_class = renderer or _get_setting("DEFAULTS", "renderer", IconRenderer)
16✔
129

130
    if isinstance(renderer_class, str):
16✔
131
        renderer_class = _get_icon_renderer_by_name(renderer_class)
16✔
132
        if isinstance(renderer_class, str):
16✔
133
            if "." not in renderer_class:
16✔
134
                renderer_class = f"django_icons.renderers.{renderer_class}"
16✔
135
            renderer_class = import_string(renderer_class)
16✔
136

137
    return renderer_class
16✔
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

© 2025 Coveralls, Inc