rqrcode 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +6 -0
- data/README +12 -12
- data/lib/rqrcode/core_ext/array/behavior.rb +5 -5
- data/lib/rqrcode/qrcode/qr_code.rb +85 -50
- data/lib/rqrcode/qrcode/qr_polynomial.rb +1 -1
- data/lib/rqrcode/qrcode/qr_rs_block.rb +4 -4
- data/lib/rqrcode/qrcode/qr_util.rb +12 -12
- data/test/runtest.rb +45 -43
- metadata +3 -3
data/CHANGELOG
CHANGED
data/README
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
|
1
|
+
== rQRCode, Encode QRCodes
|
2
2
|
|
3
3
|
rQRCode is a library for encoding QR Codes in Ruby. It has a simple interface with all the standard qrcode options. It was adapted from the Javascript library by Kazuhiko Arase.
|
4
4
|
|
5
5
|
RubyForge Project Page http://rubyforge.org/projects/rqrcode/
|
6
6
|
|
7
|
-
|
7
|
+
== An Overview
|
8
8
|
|
9
9
|
Let's clear up some rQRCode stuff.
|
10
10
|
|
@@ -13,7 +13,7 @@ Let's clear up some rQRCode stuff.
|
|
13
13
|
# The interface is simple and assumes you just want to encode a string into a QR code
|
14
14
|
# QR code is trademarked by Denso Wave inc
|
15
15
|
|
16
|
-
|
16
|
+
== Rescources
|
17
17
|
|
18
18
|
wikipedia:: http://en.wikipedia.org/wiki/QR_Code
|
19
19
|
Denso-Wave website:: http://www.denso-wave.com/qrcode/index-e.html
|
@@ -31,12 +31,12 @@ You may get the latest stable version from Rubyforge. Source gems are also avail
|
|
31
31
|
You have installed the gem already, yeah?
|
32
32
|
|
33
33
|
require 'rubygems'
|
34
|
-
require '
|
34
|
+
require 'rqrcode'
|
35
35
|
|
36
36
|
=== Simple QRCode generation to screen
|
37
37
|
|
38
38
|
qr = RQRCode::QRCode.new( 'my string to generate', :size => 4, :level => :h )
|
39
|
-
puts qr.
|
39
|
+
puts qr.to_s
|
40
40
|
#
|
41
41
|
# Prints:
|
42
42
|
# xxxxxxx x x x x x xx xxxxxxx
|
@@ -52,10 +52,10 @@ You have installed the gem already, yeah?
|
|
52
52
|
<b>View: (minimal styling added)</b>
|
53
53
|
<style type="text/css">
|
54
54
|
table {
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
55
|
+
border-width: 0;
|
56
|
+
border-style: none;
|
57
|
+
border-color: #0000ff;
|
58
|
+
border-collapse: collapse;
|
59
59
|
}
|
60
60
|
td {
|
61
61
|
border-width: 0;
|
@@ -74,11 +74,11 @@ You have installed the gem already, yeah?
|
|
74
74
|
<table>
|
75
75
|
<% @qr.modules.each_index do |x| %>
|
76
76
|
<tr>
|
77
|
-
<%
|
77
|
+
<% @qr.modules.each_index do |y| %>
|
78
78
|
<% if @qr.is_dark(x,y) %>
|
79
|
-
|
79
|
+
<td class="black"/>
|
80
80
|
<% else %>
|
81
|
-
|
81
|
+
<td class="white"/>
|
82
82
|
<% end %>
|
83
83
|
<% end %>
|
84
84
|
</tr>
|
@@ -12,10 +12,10 @@
|
|
12
12
|
module RQRCode #:nodoc:
|
13
13
|
|
14
14
|
QRMODE = {
|
15
|
-
:mode_number
|
16
|
-
:
|
17
|
-
:mode_8bit_byte
|
18
|
-
:mode_kanji
|
15
|
+
:mode_number => 1 << 0,
|
16
|
+
:mode_alpha_numk => 1 << 1,
|
17
|
+
:mode_8bit_byte => 1 << 2,
|
18
|
+
:mode_kanji => 1 << 3
|
19
19
|
}
|
20
20
|
|
21
21
|
QRERRORCORRECTLEVEL = {
|
@@ -36,45 +36,57 @@ module RQRCode #:nodoc:
|
|
36
36
|
:pattern111 => 7
|
37
37
|
}
|
38
38
|
|
39
|
-
|
39
|
+
# StandardErrors
|
40
40
|
|
41
|
-
|
42
|
-
|
41
|
+
class QRCodeArgumentError < ArgumentError; end
|
42
|
+
class QRCodeRunTimeError < RuntimeError; end
|
43
43
|
|
44
|
-
|
45
|
-
|
46
|
-
|
44
|
+
# == Creation
|
45
|
+
#
|
46
|
+
# QRCode objects expect only one required constructor parameter
|
47
|
+
# and an optional hash of any other. Here's a few examples:
|
48
|
+
#
|
49
|
+
# qr = RQRCode::QRCode.new('hello world')
|
50
|
+
# qr = RQRCode::QRCode.new('hello world', :size => 1, :level => :m )
|
51
|
+
#
|
47
52
|
|
48
53
|
class QRCode
|
49
54
|
attr_reader :modules, :module_count
|
50
55
|
|
51
56
|
PAD0 = 0xEC
|
52
|
-
PAD1 = 0x11
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
57
|
+
PAD1 = 0x11
|
58
|
+
|
59
|
+
# Expects a string to be parsed in, other args are optional
|
60
|
+
#
|
61
|
+
# # string - the string you wish to encode
|
62
|
+
# # size - the size of the qrcode
|
63
|
+
# # level - the error correction level
|
64
|
+
# qr = RQRCode::QRCode.new('hello world', :size => 1, :level => :m )
|
65
|
+
#
|
66
|
+
|
67
|
+
def initialize( *args )
|
68
|
+
raise QRCodeArgumentError unless args.first.kind_of?( String )
|
69
|
+
|
70
|
+
@data = args.shift
|
71
|
+
options = args.extract_options!
|
72
|
+
level = options[:level] || :h
|
62
73
|
@error_correct_level = QRERRORCORRECTLEVEL[ level.to_sym ]
|
63
|
-
@type_number
|
64
|
-
|
65
|
-
@modules
|
66
|
-
@data_cache
|
67
|
-
|
74
|
+
@type_number = options[:size] || 4
|
75
|
+
@module_count = @type_number * 4 + 17
|
76
|
+
@modules = nil
|
77
|
+
@data_cache = nil
|
78
|
+
@data_list = QR8bitByte.new( @data )
|
68
79
|
|
69
|
-
|
80
|
+
self.make
|
70
81
|
end
|
71
82
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
83
|
+
# <tt>is_dark</tt> is called with a +col+ and +row+ parameter. This will
|
84
|
+
# return true or false based on whether that coordinate exists in the
|
85
|
+
# matrix returned. It would normally be called while iterating through
|
86
|
+
# <tt>modules</tt>. A simple example would be:
|
87
|
+
#
|
88
|
+
# instance.is_dark( 10, 10 ) => true
|
89
|
+
#
|
78
90
|
|
79
91
|
def is_dark( row, col )
|
80
92
|
if row < 0 || @module_count <= row || col < 0 || @module_count <= col
|
@@ -83,8 +95,31 @@ module RQRCode #:nodoc:
|
|
83
95
|
@modules[row][col]
|
84
96
|
end
|
85
97
|
|
86
|
-
|
87
|
-
|
98
|
+
# This is a public method that returns the QR Code you have
|
99
|
+
# generated as a string. It will not be able to be read
|
100
|
+
# in this format by a QR Code reader, but will give you an
|
101
|
+
# idea if the final outout. It takes two optional args
|
102
|
+
# +:true+ and +:false+ which are there for you to choose
|
103
|
+
# how the output looks. Here's an example of it's use:
|
104
|
+
#
|
105
|
+
# instance.to_s =>
|
106
|
+
# xxxxxxx x x x x x xx xxxxxxx
|
107
|
+
# x x xxx xxxxxx xxx x x
|
108
|
+
# x xxx x xxxxx x xx x xxx x
|
109
|
+
#
|
110
|
+
# instance._to_s( :true => 'E', :false => 'Q') =>
|
111
|
+
# EEEEEEEQEQQEQEQQQEQEQQEEQQEEEEEEE
|
112
|
+
# EQQQQQEQQEEEQQEEEEEEQEEEQQEQQQQQE
|
113
|
+
# EQEEEQEQQEEEEEQEQQQQQQQEEQEQEEEQE
|
114
|
+
#
|
115
|
+
|
116
|
+
def to_s( *args )
|
117
|
+
options = args.extract_options!
|
118
|
+
row = options[:true] || 'x'
|
119
|
+
col = options[:false] || ' '
|
120
|
+
|
121
|
+
res = []
|
122
|
+
|
88
123
|
@modules.each_index do |c|
|
89
124
|
tmp = []
|
90
125
|
@modules.each_index do |r|
|
@@ -95,17 +130,17 @@ module RQRCode #:nodoc:
|
|
95
130
|
end
|
96
131
|
end
|
97
132
|
res << tmp.join
|
98
|
-
|
99
|
-
|
133
|
+
end
|
134
|
+
res.join("\n")
|
100
135
|
end
|
101
136
|
|
102
|
-
|
137
|
+
protected
|
103
138
|
|
104
|
-
|
139
|
+
def make #:nodoc:
|
105
140
|
make_impl( false, get_best_mask_pattern )
|
106
|
-
|
141
|
+
end
|
107
142
|
|
108
|
-
|
143
|
+
private
|
109
144
|
|
110
145
|
|
111
146
|
def make_impl( test, mask_pattern ) #:nodoc:
|
@@ -196,7 +231,7 @@ module RQRCode #:nodoc:
|
|
196
231
|
@modules[row + r][col + c] = false
|
197
232
|
end
|
198
233
|
end
|
199
|
-
end
|
234
|
+
end
|
200
235
|
end
|
201
236
|
end
|
202
237
|
end
|
@@ -249,7 +284,7 @@ module RQRCode #:nodoc:
|
|
249
284
|
end
|
250
285
|
|
251
286
|
# fixed module
|
252
|
-
@modules[ @module_count - 8 ][8] = !test
|
287
|
+
@modules[ @module_count - 8 ][8] = !test
|
253
288
|
end
|
254
289
|
|
255
290
|
|
@@ -290,7 +325,7 @@ module RQRCode #:nodoc:
|
|
290
325
|
break
|
291
326
|
end
|
292
327
|
end
|
293
|
-
end
|
328
|
+
end
|
294
329
|
end
|
295
330
|
|
296
331
|
def QRCode.create_data( type_number, error_correct_level, data_list ) #:nodoc:
|
@@ -302,16 +337,16 @@ module RQRCode #:nodoc:
|
|
302
337
|
buffer.put(
|
303
338
|
data.get_length, QRUtil.get_length_in_bits( data.mode, type_number )
|
304
339
|
)
|
305
|
-
data.write( buffer )
|
340
|
+
data.write( buffer )
|
306
341
|
|
307
342
|
total_data_count = 0
|
308
343
|
( 0...rs_blocks.size ).each do |i|
|
309
|
-
total_data_count = total_data_count + rs_blocks[i].data_count
|
344
|
+
total_data_count = total_data_count + rs_blocks[i].data_count
|
310
345
|
end
|
311
346
|
|
312
347
|
if buffer.get_length_in_bits > total_data_count * 8
|
313
348
|
raise QRCodeRunTimeError,
|
314
|
-
|
349
|
+
"code length overflow. (#{buffer.get_length_in_bits}>#{total_data_count})"
|
315
350
|
end
|
316
351
|
|
317
352
|
if buffer.get_length_in_bits + 4 <= total_data_count * 8
|
@@ -374,8 +409,8 @@ module RQRCode #:nodoc:
|
|
374
409
|
( 0...rs_blocks.size ).each do |r|
|
375
410
|
if i < dcdata[r].size
|
376
411
|
index += 1
|
377
|
-
data[index-1] = dcdata[r][i]
|
378
|
-
end
|
412
|
+
data[index-1] = dcdata[r][i]
|
413
|
+
end
|
379
414
|
end
|
380
415
|
end
|
381
416
|
|
@@ -383,8 +418,8 @@ module RQRCode #:nodoc:
|
|
383
418
|
( 0...rs_blocks.size ).each do |r|
|
384
419
|
if i < ecdata[r].size
|
385
420
|
index += 1
|
386
|
-
data[index-1] = ecdata[r][i]
|
387
|
-
end
|
421
|
+
data[index-1] = ecdata[r][i]
|
422
|
+
end
|
388
423
|
end
|
389
424
|
end
|
390
425
|
|
@@ -44,7 +44,7 @@ module RQRCode #:nodoc:
|
|
44
44
|
[2, 35, 17],
|
45
45
|
[2, 35, 13],
|
46
46
|
|
47
|
-
# 4
|
47
|
+
# 4
|
48
48
|
[1, 100, 80],
|
49
49
|
[2, 50, 32],
|
50
50
|
[2, 50, 24],
|
@@ -62,7 +62,7 @@ module RQRCode #:nodoc:
|
|
62
62
|
[4, 43, 19],
|
63
63
|
[4, 43, 15],
|
64
64
|
|
65
|
-
# 7
|
65
|
+
# 7
|
66
66
|
[2, 98, 78],
|
67
67
|
[4, 49, 31],
|
68
68
|
[2, 32, 14, 4, 33, 15],
|
@@ -80,7 +80,7 @@ module RQRCode #:nodoc:
|
|
80
80
|
[4, 36, 16, 4, 37, 17],
|
81
81
|
[4, 36, 12, 4, 37, 13],
|
82
82
|
|
83
|
-
# 10
|
83
|
+
# 10
|
84
84
|
[2, 86, 68, 2, 87, 69],
|
85
85
|
[4, 69, 43, 1, 70, 44],
|
86
86
|
[6, 43, 19, 2, 44, 20],
|
@@ -94,7 +94,7 @@ module RQRCode #:nodoc:
|
|
94
94
|
|
95
95
|
if rs_block.nil?
|
96
96
|
raise QRCodeRunTimeError,
|
97
|
-
|
97
|
+
"bad rsblock @ typeno: #{type_no}/error_correct_level:#{error_correct_level}"
|
98
98
|
end
|
99
99
|
|
100
100
|
length = rs_block.size / 3
|
@@ -25,7 +25,7 @@ module RQRCode #:nodoc:
|
|
25
25
|
[6, 24, 42],
|
26
26
|
[6, 26, 46],
|
27
27
|
[6, 28, 50],
|
28
|
-
[6, 30, 54],
|
28
|
+
[6, 30, 54],
|
29
29
|
[6, 32, 58],
|
30
30
|
[6, 34, 62],
|
31
31
|
[6, 26, 46, 66],
|
@@ -57,7 +57,7 @@ module RQRCode #:nodoc:
|
|
57
57
|
[6, 30, 58, 86, 114, 142, 170]
|
58
58
|
]
|
59
59
|
|
60
|
-
G15 = 1 << 10 | 1 << 8 | 1 << 5 | 1 << 4 | 1 << 2 | 1 << 1 | 1 << 0
|
60
|
+
G15 = 1 << 10 | 1 << 8 | 1 << 5 | 1 << 4 | 1 << 2 | 1 << 1 | 1 << 0
|
61
61
|
G18 = 1 << 12 | 1 << 11 | 1 << 10 | 1 << 9 | 1 << 8 | 1 << 5 | 1 << 2 | 1 << 0
|
62
62
|
G15_MASK = 1 << 14 | 1 << 12 | 1 << 10 | 1 << 4 | 1 << 1
|
63
63
|
|
@@ -116,7 +116,7 @@ module RQRCode #:nodoc:
|
|
116
116
|
when QRMASKPATTERN[:pattern111]
|
117
117
|
( (i * j) % 3 + (i + j) % 2) % 2 == 0
|
118
118
|
else
|
119
|
-
raise QRCodeRunTimeError, "bad mask_pattern: #{mask_pattern}"
|
119
|
+
raise QRCodeRunTimeError, "bad mask_pattern: #{mask_pattern}"
|
120
120
|
end
|
121
121
|
end
|
122
122
|
|
@@ -137,7 +137,7 @@ module RQRCode #:nodoc:
|
|
137
137
|
|
138
138
|
# 1 - 9
|
139
139
|
case mode
|
140
|
-
when QRMODE[:mode_number] :
|
140
|
+
when QRMODE[:mode_number] : 10
|
141
141
|
when QRMODE[:mode_alpha_num] : 9
|
142
142
|
when QRMODE[:mode_8bit_byte] : 8
|
143
143
|
when QRMODE[:mode_kanji] : 8
|
@@ -149,7 +149,7 @@ module RQRCode #:nodoc:
|
|
149
149
|
|
150
150
|
# 10 -26
|
151
151
|
case mode
|
152
|
-
when QRMODE[:mode_number] :
|
152
|
+
when QRMODE[:mode_number] : 12
|
153
153
|
when QRMODE[:mode_alpha_num] : 11
|
154
154
|
when QRMODE[:mode_8bit_byte] : 16
|
155
155
|
when QRMODE[:mode_kanji] : 10
|
@@ -161,7 +161,7 @@ module RQRCode #:nodoc:
|
|
161
161
|
|
162
162
|
# 27 - 40
|
163
163
|
case mode
|
164
|
-
when QRMODE[:mode_number] :
|
164
|
+
when QRMODE[:mode_number] : 14
|
165
165
|
when QRMODE[:mode_alpha_num] : 13
|
166
166
|
when QRMODE[:mode_8bit_byte] : 16
|
167
167
|
when QRMODE[:mode_kanji] : 12
|
@@ -199,7 +199,7 @@ module RQRCode #:nodoc:
|
|
199
199
|
|
200
200
|
if same_count > 5
|
201
201
|
lost_point += (3 + same_count - 5)
|
202
|
-
end
|
202
|
+
end
|
203
203
|
end
|
204
204
|
end
|
205
205
|
|
@@ -211,8 +211,8 @@ module RQRCode #:nodoc:
|
|
211
211
|
count = count + 1 if qr_code.is_dark( row + 1, col )
|
212
212
|
count = count + 1 if qr_code.is_dark( row, col + 1 )
|
213
213
|
count = count + 1 if qr_code.is_dark( row + 1, col + 1 )
|
214
|
-
lost_point = lost_point + 3 if (count == 0 || count == 4)
|
215
|
-
end
|
214
|
+
lost_point = lost_point + 3 if (count == 0 || count == 4)
|
215
|
+
end
|
216
216
|
end
|
217
217
|
|
218
218
|
# level 3
|
@@ -239,15 +239,15 @@ module RQRCode #:nodoc:
|
|
239
239
|
( 0...module_count ).each do |row|
|
240
240
|
if qr_code.is_dark(row, col)
|
241
241
|
dark_count = dark_count + 1
|
242
|
-
end
|
242
|
+
end
|
243
243
|
end
|
244
244
|
end
|
245
245
|
|
246
246
|
ratio = (100 * dark_count / module_count / module_count - 50).abs / 5
|
247
247
|
lost_point = lost_point * 10
|
248
248
|
|
249
|
-
lost_point
|
250
|
-
end
|
249
|
+
lost_point
|
250
|
+
end
|
251
251
|
|
252
252
|
end
|
253
253
|
|
data/test/runtest.rb
CHANGED
@@ -2,75 +2,77 @@ require "test/unit"
|
|
2
2
|
require "lib/rqrcode"
|
3
3
|
|
4
4
|
class QRCodeTest < Test::Unit::TestCase
|
5
|
-
|
5
|
+
require "test/test_data"
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
7
|
+
def test_no_data_given
|
8
|
+
assert_raise(RQRCode::QRCodeArgumentError) {
|
9
|
+
RQRCode::QRCode.new( :size => 1, :level => :h )
|
10
|
+
RQRCode::QRCode.new( :size => 1 )
|
11
|
+
RQRCode::QRCode.new
|
12
|
+
}
|
13
|
+
assert_raise(RQRCode::QRCodeRunTimeError) {
|
14
|
+
qr = RQRCode::QRCode.new('duncan')
|
15
|
+
qr.is_dark(0,999999)
|
16
|
+
}
|
17
|
+
end
|
18
18
|
|
19
19
|
def test_H_
|
20
|
-
|
20
|
+
qr = RQRCode::QRCode.new( 'duncan', :size => 1 )
|
21
21
|
|
22
22
|
assert_equal qr.modules.size, 21
|
23
|
-
|
23
|
+
assert_equal qr.modules, MATRIX_1_H
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
25
|
+
qr = RQRCode::QRCode.new( 'duncan', :size => 1 )
|
26
|
+
assert_equal qr.modules, MATRIX_1_H
|
27
|
+
qr = RQRCode::QRCode.new( 'duncan', :size => 1, :level => :l )
|
28
|
+
assert_equal qr.modules, MATRIX_1_L
|
29
|
+
qr = RQRCode::QRCode.new( 'duncan', :size => 1, :level => :m )
|
30
|
+
assert_equal qr.modules, MATRIX_1_M
|
31
|
+
qr = RQRCode::QRCode.new( 'duncan', :size => 1, :level => :q )
|
32
|
+
assert_equal qr.modules, MATRIX_1_Q
|
33
33
|
end
|
34
34
|
|
35
35
|
def test_3_H_
|
36
|
-
|
36
|
+
qr = RQRCode::QRCode.new( 'duncan', :size => 3 )
|
37
37
|
|
38
38
|
assert_equal qr.modules.size, 29
|
39
|
-
|
39
|
+
assert_equal qr.modules, MATRIX_3_H
|
40
40
|
end
|
41
41
|
|
42
42
|
def test_5_H_
|
43
|
-
|
43
|
+
qr = RQRCode::QRCode.new( 'duncan', :size => 5 )
|
44
44
|
|
45
45
|
assert_equal qr.modules.size, 37
|
46
|
-
|
46
|
+
assert_equal qr.modules, MATRIX_5_H
|
47
47
|
end
|
48
48
|
|
49
49
|
def test_10_H_
|
50
|
-
|
50
|
+
qr = RQRCode::QRCode.new( 'duncan', :size => 10 )
|
51
51
|
|
52
52
|
assert_equal qr.modules.size, 57
|
53
|
-
|
53
|
+
assert_equal qr.modules, MATRIX_10_H
|
54
54
|
end
|
55
55
|
|
56
56
|
def test_4_H_
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
57
|
+
qr = RQRCode::QRCode.new('www.bbc.co.uk/programmes/b0090blw',
|
58
|
+
:level => :l )
|
59
|
+
assert_equal qr.modules, MATRIX_4_L
|
60
|
+
qr = RQRCode::QRCode.new('www.bbc.co.uk/programmes/b0090blw',
|
61
|
+
:level => :m )
|
62
|
+
assert_equal qr.modules, MATRIX_4_M
|
63
|
+
qr = RQRCode::QRCode.new('www.bbc.co.uk/programmes/b0090blw',
|
64
|
+
:level => :q )
|
65
|
+
assert_equal qr.modules, MATRIX_4_Q
|
66
66
|
|
67
|
-
|
67
|
+
qr = RQRCode::QRCode.new('www.bbc.co.uk/programmes/b0090blw')
|
68
68
|
assert_equal qr.modules.size, 33
|
69
|
-
|
69
|
+
assert_equal qr.modules, MATRIX_4_H
|
70
70
|
end
|
71
71
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
72
|
+
def test_to_s
|
73
|
+
qr = RQRCode::QRCode.new( 'duncan', :size => 1 )
|
74
|
+
assert_equal qr.to_s[0..21], "xxxxxxx xx x xxxxxxx\n"
|
75
|
+
assert_equal qr.to_s( :true => 'q', :false => 'n' )[0..21], "qqqqqqqnqqnqnnqqqqqqq\n"
|
76
|
+
assert_equal qr.to_s( :true => '@' )[0..21], "@@@@@@@ @@ @ @@@@@@@\n"
|
77
|
+
end
|
76
78
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rqrcode
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Duncan Robertson
|
@@ -9,11 +9,11 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-02-
|
12
|
+
date: 2008-02-28 00:00:00 +00:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
16
|
-
description: rQRCode is a library for encoding
|
16
|
+
description: rQRCode is a library for encoding QR Codes. The simple interface allows you to simply create QR Code data structures ready to be displayed in the way you choose.
|
17
17
|
email: duncan@whomwah.com
|
18
18
|
executables: []
|
19
19
|
|