def test_output2(): out = io.BytesIO() segno.make_qr('Good Times', error='M').save(out, kind='png', scale=10, color='red') f = tempfile.NamedTemporaryFile('w', suffix='.png', delete=False) f.close() cli.main(['-e=M', '--scale=10', '--color=red', '--output={0}'.format(f.name), 'Good', 'Times']) f = open(f.name, 'rb') content = f.read() f.close() os.unlink(f.name) assert out.getvalue() == content
def test_data_svg_no_charset(): qr = segno.make_qr('A') val = qr.svg_data_uri(omit_charset=True) assert val expected = "data:image/svg+xml,%3Csvg%20xmlns%3D%27" assert expected == val[:len(expected)] assert val.endswith('%3C%2Fsvg%3E')
def test_write_xpm_indicator(): qr = segno.make_qr('test', error='m', boost_error=False) out = io.StringIO() qr.save(out, kind='xpm') expected = '/* XPM */\n' val = out.getvalue() assert expected == val[:len(expected)]
def test_background_none(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='pdf') graphic = _find_graphic(out) assert 'rg' not in graphic assert 're' not in graphic
def test_background_set(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='pdf', background='yellow') graphic = _find_graphic(out) assert 'rg' in graphic assert 're' in graphic
def test_default_scale(): qr = segno.make_qr('test') out = io.BytesIO() scale = 1 scale_cmd = '{0} 0 0 {0} 0 0 cm'.format(scale) qr.save(out, kind='pdf', compresslevel=0) assert scale_cmd not in _find_graphic(out)
def test_scale_float(): qr = segno.make_qr('test') out = io.BytesIO() scale = 1.34 scale_cmd = '{0} 0 0 {0} 0 0 cm'.format(scale) qr.save(out, kind='pdf', scale=scale, compresslevel=0) assert scale_cmd in _find_graphic(out)
def test_custom_svg_class(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='svg', svgclass='test-class') root = _parse_xml(out) assert 'class' in root.attrib assert 'test-class' == root.attrib.get('class')
def create(content, error='H', version=None, mode=None, encoding=None): def translate_error(pyqrcode_error): try: if pyqrcode_error.upper() in ('L', 'M', 'Q', 'H'): return pyqrcode_error except AttributeError: pass try: return _ERROR_LEVEL[pyqrcode_error] except KeyError: raise ValueError('Unknown error level "{0}"'.format(pyqrcode_error)) def translate_mode(pyqrcode_mode): mode = pyqrcode_mode try: mode = pyqrcode_mode.lower() except AttributeError: pass return mode if mode != 'binary' else 'byte' return PyQRCode(segno.make_qr(content, error=translate_error(error), version=version, mode=translate_mode(mode), encoding=encoding, boost_error=False), content, encoding)
def test_data_svg_minimal_encoding(): qr = segno.make_qr('A') val = qr.svg_data_uri(encode_minimal=True) assert val expected = "data:image/svg+xml;charset=utf-8,%3Csvg xmlns='" assert expected == val[:len(expected)] assert val.endswith('%3C/svg%3E')
def test_no_line_class_empty_str(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='svg', lineclass='') root = _parse_xml(out) path_el = _get_path(root) assert 'class' not in path_el.attrib
def test_viewbox(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='svg', omitsize=True) root = _parse_xml(out) assert 'viewBox' in root.attrib assert 'height' not in root.attrib assert 'width' not in root.attrib
def test_scale(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='svg', scale=2) root = _parse_xml(out) path = _get_path(root) assert path is not None assert 'scale(2)' in path.attrib['transform']
def test_dpi(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='png', dpi=300) out.seek(0) assert b'pHYs' in out.getvalue() # pHYs 11811 (11811 meters = 300 dpi / 0.0254) assert b'\x70\x48\x59\x73\x00\x00\x2E\x23\x00\x00\x2E\x23\x01\x78\xA5\x3F\x76' in out.getvalue()
def test_write_txt(): # Test with default options qr = segno.make_qr('test', error='m', boost_error=False) out = io.StringIO() qr.save(out, kind='txt', border=0) expected = '11111110011' val = out.getvalue() assert expected == val[:len(expected)]
def test_svgid(): qr = segno.make_qr('test') out = io.BytesIO() ident = 'svgid' qr.save(out, kind='svg', svgid=ident) root = _parse_xml(out) assert 'id' in root.attrib assert ident == root.attrib['id']
def test_svgversion(): qr = segno.make_qr('test') out = io.BytesIO() version = 1.0 qr.save(out, kind='svg', svgversion=version) root = _parse_xml(out) assert 'version' in root.attrib assert str(version) == root.attrib['version']
def test_custom_line_class(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='svg', lineclass='test-class') root = _parse_xml(out) path_el = _get_path(root) assert 'class' in path_el.attrib assert 'test-class' == path_el.attrib.get('class')
def test_title3(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='svg', title='点') root = _parse_xml(out) title_el = _get_title(root) assert title_el is not None assert '点' == title_el.text
def test_save_png_buffer(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='png') out.seek(0) expected = b'\211PNG\r\n\032\n' # PNG magic number val = out.read(len(expected)) assert expected == val
def test_write_svg_background_rgba_svg2(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='svg', background='#0000ffcc', svgversion=2.0) assert b'fill-opacity' not in out.getvalue() root = _parse_xml(out) path = _get_path(root) assert path.attrib['fill'].startswith('rgba')
def test_scale_float(): qr = segno.make_qr('test') out = io.BytesIO() scale = 2.13 qr.save(out, kind='svg', scale=scale) root = _parse_xml(out) path = _get_path(root) assert path is not None assert 'scale({0})'.format(scale) in path.attrib['transform']
def test_module_color(): qr = segno.make_qr('test') out = io.BytesIO() color = '#800080' qr.save(out, kind='svg', color=color) root = _parse_xml(out) path = _get_path(root) assert path is not None assert color == path.attrib['stroke']
def test_scale(): qr = segno.make_qr('test') out = io.BytesIO() scale = 12 width, height = qr.symbol_size(scale=scale) qr.save(out, kind='png', scale=12) out.seek(0) png_width, png_height, matrix = _get_png_info(file=out) assert (width, height) == (png_width, png_height)
def test_desc3(): qr = segno.make_qr('test') out = io.BytesIO() desc = '点' qr.save(out, kind='svg', desc=desc) root = _parse_xml(out) desc_el = _get_desc(root) assert desc_el is not None assert desc == desc_el.text
def test_write_xpm_width_height(): scale = 5 border = 2 qr = segno.make_qr('test') width, height = qr.symbol_size(scale=scale, border=border) out = io.StringIO() qr.save(out, kind='xpm', border=border, scale=scale) img_data = _img_data(out.getvalue())[0] assert img_data.startswith('{0} {1}'.format(width, height))
def test_omit_svgns(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='svg', svgns=False) root = _parse_xml(out) path_el = _get_path(root) assert path_el is None # (since _get_path uses the SVG namespace) path_el = root.find('path') # Query w/o namespace MUST find the path assert path_el is not None
def test_title4(): qr = segno.make_qr('test') out = io.BytesIO() encoding = 'ISO-8859-1' qr.save(out, kind='svg', title='áà', encoding=encoding) root = _parse_xml(out) title_el = _get_title(root) assert title_el is not None assert 'áà' == title_el.text
def test_desc_escape(): qr = segno.make_qr('test') out = io.BytesIO() desc = '<desc>&</desc>' qr.save(out, kind='svg', desc=desc) assert b'<desc><desc>&</desc></desc>' in out.getvalue() root = _parse_xml(out) desc_el = _get_desc(root) assert desc_el is not None assert desc == desc_el.text
def test_background(): qr = segno.make_qr('test') out = io.BytesIO() color = '#800080' qr.save(out, kind='svg', background=color) root = _parse_xml(out) # Background should be the first path in the doc rect = _get_path(root) assert rect is not None assert color == rect.attrib['fill']
def test_unit_omitsize(): qr = segno.make_qr('test') out = io.BytesIO() with pytest.raises(ValueError): qr.save(out, kind='svg', unit='cm', omitsize=True)
def test_data_png(): qr = segno.make_qr('A') val = qr.png_data_uri() assert val assert val.startswith('data:image/png;base64,')
def test_write_tex(): # Test with default options qr = segno.make_qr('test', error='m', boost_error=False) out = io.StringIO() qr.save(out, kind='tex', border=4) assert r'\pgfpathmoveto{\pgfqpoint{4pt}{-4pt}}' in out.getvalue()
def test_pil_border(): qr = segno.make_qr('A') border = 0 width, height = qr.symbol_size(border=border) img = qr.to_pil(border=border) assert (width, height) == img.size
#!/usr/bin/python3 # https://pypi.org/project/segno/ # https://segno.readthedocs.io/en/latest/ import segno import io qr = segno.make_qr("This is a qrcode") qr = segno.make_qr("This is a qrcode", error='Q') ## Export/Save qr.save('myqr.svg') # SVG document qr.save('myqr.png') # PNG image qr.save('myqr.eps') # EPS document qr.save('myqr.txt') # Text output ## Extra parameters qr.save('myqr.svg', border=0) # No border qr.save('myqr.svg', border=10) # 10px border qr.save('myqr.png', scale=2) # enlarge qr.save('sgt-peppers.svg', dark='darkred', light='lightblue') #Use colors instead of B/W ## Save to Buffer buff = io.BytesIO() qr.save(buff, kind='svg', dark='darkblue', light='#eee') # ## Examples # # Email # segno.helpers.make_email(to, cc=None, bcc=None, subject=None, body=None) # segno.helpers.make_make_email_data(to, cc=None, bcc=None, subject=None, body=None)
def test_write_svg_background_rgba(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='svg', background='#0000ffcc') assert b'fill-opacity' in out.getvalue()
def test_svgid_empty_string(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='svg', svgid='') root = _parse_xml(out) assert 'id' not in root.attrib
def test_kanji_bytes(): data = '外来語' qr = segno.make_qr(data.encode('shift_jis')) assert 'kanji' == qr.mode
def test_kanji_enforce_byte2(): data = '点' qr = segno.make_qr(data.encode('utf-8')) assert 'byte' == qr.mode
def test_kanji_enforce_byte(): data = '点' qr = segno.make_qr(data) assert 'kanji' == qr.mode qr = segno.make_qr(data, encoding='utf-8') assert 'byte' == qr.mode
def test_valid_mode_autodetection(data, expected_mode): qr = segno.make_qr(data) assert expected_mode == qr.mode
def test_write_tex_color2(): qr = segno.make_qr('test', error='m', boost_error=False) out = io.StringIO() qr.save(out, kind='tex', border=4, dark='green') assert r'\color{green}' in out.getvalue()
def test_write_tex_color(): qr = segno.make_qr('test', error='m', boost_error=False) out = io.StringIO() qr.save(out, kind='tex', border=4) assert r'\color' not in out.getvalue()
def test_no_svg_class_empty_str(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='svg', svgclass='') root = _parse_xml(out) assert 'class' not in root.attrib
def test_svgversion_default(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='svg') root = _parse_xml(out) assert 'version' not in root.attrib
def test_color_rgba_and_trans2(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='png', dark=None, light='#0000ffcc') assert _has_palette(out.getvalue()) assert _has_transparency(out.getvalue())
def test_write_no_xmldecl(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='svg', xmldecl=False) xml_str = out.getvalue() assert xml_str.startswith(b'<svg')
def test_p1(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='pbm', plain=True) assert out.getvalue().startswith(b'P1')
def test_write_svg_color_rgba(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='svg', color='#0000ffcc') assert b'stroke-opacity' in out.getvalue()
def test_nodpi_zero(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='png', dpi=0) out.seek(0) assert b'pHYs' not in out.getvalue()
def test_color_trans(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='png', dark='blue', light=None) assert _has_palette(out.getvalue()) assert _has_transparency(out.getvalue())
def test_greyscale_trans2(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='png', dark=None, light='white') assert not _has_palette(out.getvalue()) assert _has_transparency(out.getvalue())
def test_not_plain(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='pbm', plain=False) assert out.getvalue().startswith(b'P4')
def test_write_tex_url(): qr = segno.make_qr('test', error='m', boost_error=False) out = io.StringIO() url = 'http://www.example.org/~xxx#aaa' qr.save(out, kind='tex', border=4, url=url) assert r'\href{' + url + '}' in out.getvalue()
def test_pil_scale_float(): qr = segno.make_qr('A') scale = 2.5 width, height = qr.symbol_size(scale=int(scale)) img = qr.to_pil(scale=scale) assert (width, height) == img.size
def test_hexcolor_too_long_background(): qr = segno.make_qr('test') with pytest.raises(ValueError): qr.save(io.BytesIO(), kind='png', light='#0000000')
def test_p4(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='pbm') assert out.getvalue().startswith(b'P4')
def test_dark_eq_light(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='png', dark='#000', light='#000') assert out.getvalue()
def test_write_tex_omit_url(): qr = segno.make_qr('test', error='m', boost_error=False) out = io.StringIO() url = '' qr.save(out, kind='tex', border=4, url=url) assert r'\href' not in out.getvalue()
def test_hexcolor_too_long(): qr = segno.make_qr('test') with pytest.raises(ValueError): qr.save(io.BytesIO(), kind='png', dark='#0000000')