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

zostera / django-bootstrap4 / 7126543600

07 Dec 2023 09:58AM CUT coverage: 85.84%. Remained the same
7126543600

Pull #657

github

web-flow
Bump actions/setup-python from 4 to 5

Bumps [actions/setup-python](https://github.com/actions/setup-python) from 4 to 5.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Pull Request #657: Bump actions/setup-python from 4 to 5

272 of 344 branches covered (0.0%)

Branch coverage included in aggregate %.

704 of 793 relevant lines covered (88.78%)

3.55 hits per line

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

78.81
/src/bootstrap4/utils.py
1
import re
4✔
2
from collections.abc import Mapping
4✔
3
from urllib.parse import parse_qs, urlparse, urlunparse
4✔
4

5
from django import get_version
4✔
6
from django.forms.utils import flatatt
4✔
7
from django.template.base import FilterExpression, TemplateSyntaxError, Variable, VariableDoesNotExist, kwarg_re
4✔
8
from django.template.loader import get_template
4✔
9
from django.utils.encoding import force_str
4✔
10
from django.utils.html import format_html
4✔
11
from django.utils.http import urlencode
4✔
12
from django.utils.safestring import mark_safe
4✔
13

14
from .text import text_value
4✔
15

16
DJANGO_VERSION = int(get_version()[:1])
4✔
17

18
# RegEx for quoted string
19
QUOTED_STRING = re.compile(r'^["\'](?P<noquotes>.+)["\']$')
4✔
20

21

22
def handle_var(value, context):
4✔
23
    """Handle template tag variable."""
24
    # Resolve FilterExpression and Variable immediately
25
    if isinstance(value, FilterExpression) or isinstance(value, Variable):
4!
26
        return value.resolve(context)
4✔
27
    # Return quoted strings unquoted
28
    # http://djangosnippets.org/snippets/886
29
    stringval = QUOTED_STRING.search(value)
×
30
    if stringval:
×
31
        return stringval.group("noquotes")
×
32
    # Resolve variable or return string value
33
    try:
×
34
        return Variable(value).resolve(context)
×
35
    except VariableDoesNotExist:
×
36
        return value
×
37

38

39
def parse_token_contents(parser, token):
4✔
40
    """Parse template tag contents."""
41
    bits = token.split_contents()
4✔
42
    tag = bits.pop(0)
4✔
43
    args = []
4✔
44
    kwargs = {}
4✔
45
    asvar = None
4✔
46
    if len(bits) >= 2 and bits[-2] == "as":
4!
47
        asvar = bits[-1]
×
48
        bits = bits[:-2]
×
49
    if len(bits):
4!
50
        for bit in bits:
4✔
51
            match = kwarg_re.match(bit)
4✔
52
            if not match:
4!
53
                raise TemplateSyntaxError(f'Malformed arguments to tag "{tag}"')
×
54
            name, value = match.groups()
4✔
55
            if name:
4!
56
                kwargs[name] = parser.compile_filter(value)
4✔
57
            else:
58
                args.append(parser.compile_filter(value))
×
59
    return {"tag": tag, "args": args, "kwargs": kwargs, "asvar": asvar}
4✔
60

61

62
def split_css_classes(css_classes):
4✔
63
    """Turn string into a list of CSS classes."""
64
    classes_list = text_value(css_classes).split(" ")
4✔
65
    return [c for c in classes_list if c]
4✔
66

67

68
def add_css_class(css_classes, css_class, prepend=False):
4✔
69
    """Add a CSS class to a string of CSS classes."""
70
    classes_list = split_css_classes(css_classes)
4✔
71
    classes_to_add = [c for c in split_css_classes(css_class) if c not in classes_list]
4✔
72
    if prepend:
4✔
73
        classes_list = classes_to_add + classes_list
4✔
74
    else:
75
        classes_list += classes_to_add
4✔
76
    return " ".join(classes_list)
4✔
77

78

79
def remove_css_class(css_classes, css_class):
4✔
80
    """Remove a CSS class from a string of CSS classes."""
81
    remove = set(split_css_classes(css_class))
×
82
    classes_list = [c for c in split_css_classes(css_classes) if c not in remove]
×
83
    return " ".join(classes_list)
×
84

85

86
def render_script_tag(url):
4✔
87
    """Build a script tag."""
88
    url_dict = sanitize_url_dict(url)
4✔
89
    url_dict.setdefault("src", url_dict.pop("url", None))
4✔
90
    return render_tag("script", url_dict)
4✔
91

92

93
def render_link_tag(url, rel="stylesheet", media=None):
4✔
94
    """Build a link tag."""
95
    url_dict = sanitize_url_dict(url, url_attr="href")
4✔
96
    url_dict.setdefault("href", url_dict.pop("url", None))
4✔
97
    url_dict["rel"] = rel
4✔
98
    if media:
4!
99
        url_dict["media"] = media
×
100
    return render_tag("link", attrs=url_dict, close=False)
4✔
101

102

103
def render_tag(tag, attrs=None, content=None, close=True):
4✔
104
    """Render a HTML tag."""
105
    builder = "<{tag}{attrs}>{content}"
4✔
106
    if content or close:
4✔
107
        builder += "</{tag}>"
4✔
108
    return format_html(builder, tag=tag, attrs=mark_safe(flatatt(attrs)) if attrs else "", content=text_value(content))
4✔
109

110

111
def render_template_file(template, context=None):
4✔
112
    """Render a Template to unicode."""
113
    assert isinstance(context, Mapping)
4✔
114
    template = get_template(template)
4✔
115
    return template.render(context)
4✔
116

117

118
def url_replace_param(url, name, value):
4✔
119
    """Replace a GET parameter in an URL."""
120
    url_components = urlparse(force_str(url))
4✔
121

122
    params = parse_qs(url_components.query)
4✔
123

124
    if value is None:
4✔
125
        del params[name]
4✔
126
    else:
127
        params[name] = value
4✔
128

129
    return mark_safe(
4✔
130
        urlunparse(
131
            [
132
                url_components.scheme,
133
                url_components.netloc,
134
                url_components.path,
135
                url_components.params,
136
                urlencode(params, doseq=True),
137
                url_components.fragment,
138
            ]
139
        )
140
    )
141

142

143
def sanitize_url_dict(url, url_attr="src"):
4✔
144
    """Sanitize url dict as used in django-bootstrap4 settings."""
145
    if isinstance(url, str):
4✔
146
        return {url_attr: url}
4✔
147
    return url.copy()
4✔
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