rqrcode 2.2.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 46c752f56b2f26a71997009f105896a93874304e47b5453f6d399790ec5d67ee
4
- data.tar.gz: 3a32e1b77c24d1118510084ad0b0f700ff54c8605c5e5cf77aca2c5efc782438
3
+ metadata.gz: eac90f6e8b69031c243aab170efd37d9bfe552a5972dbc6c0dbf9e8d73d0653d
4
+ data.tar.gz: 203c2f454559f54c9d2f0629dd787ca799d668e0944edfbee5cfaffcaa1e1c6c
5
5
  SHA512:
6
- metadata.gz: 28ae604413d674f2c8fe6aac337aab7253874357d6d0e4e656c7e3cf743c8a65d102a5eeb8790601678d4c65172bbdd882cf1a51766d23df99b4253f0801a11d
7
- data.tar.gz: 34fbe27e846970fe5b8571c446d6bee7327d46c3b645aaf07b141cf96d98c7beb918f6cc929408fd612940d260a0258c5656937f7283acbcf6cab0d00e09c082
6
+ metadata.gz: 4e437e362fd0f12e9cba38500d5abf29586db767ee8c1983b893747b5664ca57000a92383f3944f278fa4f9bf5b6b7446853bf261d6fb008742f6c0eec9a4c35
7
+ data.tar.gz: 9f3518501241b15821eeb5fddaca92433971415323932c8d63d5c973738f319d148e1a97e4b5a2dd62b68dd55e237e5ff290f3059031f35812385debd8a6f118
data/CHANGELOG.md CHANGED
@@ -7,21 +7,53 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [3.2.0] - 2025-06-12
11
+
12
+ ### Added
13
+
14
+ - Comprehensive benchmarking suite in `benchmark/` directory for measuring performance and memory usage across all export formats (SVG, PNG, HTML, ANSI)
15
+ - `benchmark_helper.rb` providing shared utilities for IPS, memory, and stack profiling
16
+ - Rake tasks for running benchmarks individually or all at once
17
+ - `benchmark/README.md` explaining usage, metrics, and interpretation of results
18
+ - `AGENTS.md` as a development guide for AI agents
19
+
20
+ ### Changed
21
+
22
+ - **SVG rendering**: Improved by **+130%** (from 184 i/s to 424 i/s) with **71% memory reduction**
23
+ - **HTML rendering**: Now the fastest export format at **1,876 i/s** (rendering-only benchmark)
24
+ - **Memory efficiency**: HTML now uses **6x less memory** than SVG (previously 22x)
25
+ - Updated minimum Ruby version requirement to >= 3.2.0
26
+ - Updated GitHub workflow Ruby matrix to test only supported versions (3.2, 3.3, 3.4, 4.0)
27
+ - Updated `README.md` with benchmark documentation and contribution guidelines
28
+
29
+ ## [3.1.1] - 2025-11-25
30
+
31
+ - Update required_ruby_version to support >= rather than ~> ready for Ruby 4
32
+
33
+ ## [3.1.0] - 2025-04-28
34
+
35
+ - Added support for `offset_x` and `offset_y` options in the `as_svg` method for independent x and y padding around QR codes [#153]
36
+
37
+ ## [3.0.0] - 2025-04-24
38
+
39
+ - Drop support for Ruby <3.0 in order to keep up with dev dependencies.
40
+ - **Breaking Change**: The `rqrcode_core` gem has been updated to version 2.0.0, which includes breaking changes. Please refer to the [rqrcode_core changelog](https://github.com/whomwah/rqrcode_core/blob/main/CHANGELOG.md)
41
+
10
42
  ## [2.2.0] - 2023-06-17
11
43
 
12
44
  ### Changed
13
45
 
14
- * Allow all ChunkyPNG::Color options to be passed into `fill` and `color` on `as_png` [#135]
15
- * Add 3.2 to CI [@petergoldstein](https://github.com/petergoldstein) [#133]
16
- * Development dependency upgrades. Minimum Ruby change [#130]
17
- * README updates
46
+ - Allow all ChunkyPNG::Color options to be passed into `fill` and `color` on `as_png` [#135]
47
+ - Add 3.2 to CI [@petergoldstein](https://github.com/petergoldstein) [#133]
48
+ - Development dependency upgrades. Minimum Ruby change [#130]
49
+ - README updates
18
50
 
19
51
  ## [2.1.2] - 2022-07-26
20
52
 
21
53
  ### Changed
22
54
 
23
- * Remove setup script as it just calls bundle install [#128]
24
- * Change inline styles to the fill property to allow for strict CSP style-src directive [#127]
55
+ - Remove setup script as it just calls bundle install [#128]
56
+ - Change inline styles to the fill property to allow for strict CSP style-src directive [#127]
25
57
 
26
58
  ## [2.1.1] - 2022-02-11
27
59
 
@@ -60,7 +92,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
60
92
 
61
93
  ### Breaking Change
62
94
 
63
- - The dependency `rqrcode_core-1.0.0` has a tiny breaking change to the `to_s` public method. https://github.com/whomwah/rqrcode_core/blob/master/CHANGELOG.md#breaking-changes
95
+ - The dependency `rqrcode_core-1.0.0` has a tiny breaking change to the `to_s` public method. https://github.com/whomwah/rqrcode_core/blob/main/CHANGELOG.md#breaking-changes
64
96
 
65
97
  ## [1.2.0] - 2020-12-26
66
98
 
@@ -70,7 +102,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
70
102
  - bump dependencies
71
103
  - fix `required_ruby_version` for Ruby 3 support
72
104
 
73
- [unreleased]: https://github.com/whomwah/rqrcode/compare/v2.2.0...HEAD
105
+ [unreleased]: https://github.com/whomwah/rqrcode/compare/v3.2.0...HEAD
106
+ [3.2.0]: https://github.com/whomwah/rqrcode/compare/v3.1.1...v3.2.0
107
+ [3.1.1]: https://github.com/whomwah/rqrcode/compare/v3.1.0...v3.1.1
108
+ [3.1.0]: https://github.com/whomwah/rqrcode/compare/v3.0.0...v3.1.0
109
+ [3.0.0]: https://github.com/whomwah/rqrcode/compare/v2.2.0...v3.0.0
74
110
  [2.2.0]: https://github.com/whomwah/rqrcode/compare/v2.1.2...v2.2.0
75
111
  [2.1.2]: https://github.com/whomwah/rqrcode/compare/v2.1.1...v2.1.2
76
112
  [2.1.1]: https://github.com/whomwah/rqrcode/compare/v2.1.0...v2.1.1
data/README.md CHANGED
@@ -3,20 +3,17 @@
3
3
  ![](https://github.com/whomwah/rqrcode/actions/workflows/ruby.yml/badge.svg)
4
4
  [![Ruby Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://github.com/testdouble/standard)
5
5
 
6
-
7
6
  [RQRCode](https://github.com/whomwah/rqrcode) is a library for creating and rendering QR codes into various formats. It has a simple interface with all the standard QR code options. It was adapted from the Javascript library by Kazuhiko Arase.
8
7
 
9
- * QR code is trademarked by Denso Wave inc
10
- * Minimum Ruby version is `>= 2.6`
11
- * For `rqrcode` releases `< 2.0.0` please use [this README](https://github.com/whomwah/rqrcode/blob/v1.2.0/README.md)
12
- * For `rqrcode` releases `< 1.0.0` please use [this README](https://github.com/whomwah/rqrcode/blob/v0.9.0/README.md)
8
+ - QR code is trademarked by Denso Wave inc
9
+ - Minimum Ruby version is `>= 3.2.0`
13
10
 
14
11
  ## Installing
15
12
 
16
13
  Add this line to your application's `Gemfile`:
17
14
 
18
15
  ```ruby
19
- gem "rqrcode", "~> 2.0"
16
+ gem "rqrcode", "~> 3.0"
20
17
  ```
21
18
 
22
19
  or install manually:
@@ -70,19 +67,18 @@ Expects a string or array (for multi-segment encoding) to be parsed in, other ar
70
67
  * :number
71
68
  * :alphanumeric
72
69
  * :byte_8bit
73
- * :kanji
74
70
  ```
75
71
 
76
72
  Example
77
73
 
78
74
  ```ruby
79
- simple_qrcode = RQRCodeCore::QRCode.new("https://kyan.com", size: 1, level: :m, mode: :alphanumeric)
75
+ simple_qrcode = RQRCodeCore::QRCode.new("https://kyan.com", size: 2, level: :m, mode: :byte_8bit)
80
76
 
81
- segment_qrcode = QRCodeCore::QRCode.new({ data: "foo", mode: :byte_8bit })
77
+ segment_qrcode = RQRCodeCore::QRCode.new([{ data: "foo", mode: :byte_8bit }])
82
78
 
83
79
  multi_qrcode = RQRCodeCore::QRCode.new([
84
80
  { data: 'foo', mode: :byte_8bit },
85
- { data: 'bar1', mode: :alphanumeric }
81
+ { data: 'BAR1', mode: :alphanumeric }
86
82
  ])
87
83
  ```
88
84
 
@@ -99,6 +95,10 @@ Options:
99
95
 
100
96
  offset - Padding around the QR Code in pixels
101
97
  (default 0)
98
+ offset_x - X Padding around the QR Code in pixels
99
+ (default offset)
100
+ offset_y - Y Padding around the QR Code in pixels
101
+ (default offset)
102
102
  fill - Background color e.g "ffffff" or :white or :currentColor
103
103
  (default none)
104
104
  color - Foreground color e.g "000" or :black or :currentColor
@@ -118,7 +118,9 @@ viewbox - Replace the `svg.width` and `svg.height` attribute with `svg.v
118
118
  svg_attributes - A optional hash of custom <svg> attributes. Existing attributes will remain.
119
119
  (default {})
120
120
  ```
121
+
121
122
  Example
123
+
122
124
  ```ruby
123
125
  require "rqrcode"
124
126
 
@@ -209,7 +211,6 @@ IO.binwrite("/tmp/github-qrcode.png", png.to_s)
209
211
 
210
212
  ![QR code with github url](./images/github-qrcode.png)
211
213
 
212
-
213
214
  ### `as_ansi`
214
215
 
215
216
  The ANSI renderer will produce as a string with ANSI color codes.
@@ -226,7 +227,9 @@ fill_character - The written character
226
227
  quiet_zone_size - Padding around the edge
227
228
  (default 4)
228
229
  ```
230
+
229
231
  Example
232
+
230
233
  ```ruby
231
234
  require "rqrcode"
232
235
 
@@ -272,6 +275,10 @@ $ rake standard # checks
272
275
  $ rake standard:fix # fixes
273
276
  ```
274
277
 
278
+ ## Benchmarks
279
+
280
+ RQRCode includes comprehensive performance benchmarks for tracking export format performance over time. See the [benchmark README](benchmark/README.md) for details on running benchmarks, interpreting results, and current performance baselines.
281
+
275
282
  ## Contributing
276
283
 
277
284
  I am not currently accepting any new renderers as the current `as_png`, `as_svg` and `as_ansi` work for most cases. If you need something different from what's available, the [`rqrcode_core`](https://github.com/whomwah/rqrcode_core) gem gives you access to all the QR Code information you will need so makes it simple to generate your own.
@@ -280,9 +287,9 @@ The motivation for the above is because the rendering side of this gem takes up
280
287
 
281
288
  Any contribution PR's will be greatly accepted. It's important that they are well tested and backwards compatible.
282
289
 
283
- * Fork the project
284
- * Send a pull request
285
- * Don't touch the .gemspec, I'll do that when I release a new version
290
+ - Fork the project
291
+ - Send a pull request
292
+ - Don't touch the .gemspec, I'll do that when I release a new version
286
293
 
287
294
  Thanks D.
288
295
 
@@ -296,9 +303,9 @@ Oh, and thanks to my bosses at https://kyan.com for giving me time to maintain t
296
303
 
297
304
  ## Resources
298
305
 
299
- * wikipedia:: http://en.wikipedia.org/wiki/QR_Code
300
- * Denso-Wave website:: http://www.denso-wave.com/qrcode/index-e.html
301
- * kaywa:: http://qrcode.kaywa.com
306
+ - wikipedia:: http://en.wikipedia.org/wiki/QR_Code
307
+ - Denso-Wave website:: http://www.denso-wave.com/qrcode/index-e.html
308
+ - kaywa:: http://qrcode.kaywa.com
302
309
 
303
310
  ## Copyright
304
311
 
@@ -3,49 +3,34 @@
3
3
  module RQRCode
4
4
  module Export
5
5
  module HTML
6
- #
7
- # Use this module to HTML-ify the QR code if you just want the default HTML
8
- def as_html
9
- ["<table>", rows.as_html, "</table>"].join
10
- end
11
-
12
- private
13
-
14
- def rows
15
- Rows.new(@qrcode)
16
- end
6
+ TABLE_OPEN = "<table>"
7
+ TABLE_CLOSE = "</table>"
8
+ TR_OPEN = "<tr>"
9
+ TR_CLOSE = "</tr>"
10
+ TD_BLACK = '<td class="black"></td>'
11
+ TD_WHITE = '<td class="white"></td>'
17
12
 
18
- class Rows < Struct.new(:qr)
19
- def as_html
20
- rows.map(&:as_html).join
21
- end
22
-
23
- def rows
24
- qr.modules.each_with_index.map { |qr_module, row_index| Row.new(qr, qr_module, row_index) }
25
- end
26
- end
27
-
28
- class Row < Struct.new(:qr, :qr_module, :row_index)
29
- def as_html
30
- ["<tr>", cells.map(&:as_html).join, "</tr>"].join
31
- end
32
-
33
- def cells
34
- qr.modules.each_with_index.map { |qr_module, col_index| Cell.new(qr, col_index, row_index) }
35
- end
36
- end
37
-
38
- class Cell < Struct.new(:qr, :col_index, :row_index)
39
- def as_html
40
- "<td class=\"#{html_class}\"></td>"
13
+ def as_html
14
+ qr = @qrcode
15
+ module_count = qr.module_count
16
+
17
+ estimated_size = (module_count * module_count * 26) + (module_count * 9) + 15
18
+ result = String.new(capacity: estimated_size)
19
+
20
+ result << TABLE_OPEN
21
+ module_count.times do |row_index|
22
+ result << TR_OPEN
23
+ module_count.times do |col_index|
24
+ result << (qr.checked?(row_index, col_index) ? TD_BLACK : TD_WHITE)
25
+ end
26
+ result << TR_CLOSE
41
27
  end
28
+ result << TABLE_CLOSE
42
29
 
43
- def html_class
44
- qr.checked?(row_index, col_index) ? "black" : "white"
45
- end
30
+ result
46
31
  end
47
32
  end
48
33
  end
49
34
  end
50
35
 
51
- RQRCode::QRCode.send :include, RQRCode::Export::HTML
36
+ RQRCode::QRCode.include RQRCode::Export::HTML
@@ -15,108 +15,171 @@ module RQRCode
15
15
  end
16
16
 
17
17
  class Path < BaseOutputSVG
18
- def build(module_size, offset, color)
18
+ # Direction constants for edge representation
19
+ # Edges stored as [start_x, start_y, direction] arrays instead of Struct
20
+ DIR_UP = 0
21
+ DIR_DOWN = 1
22
+ DIR_LEFT = 2
23
+ DIR_RIGHT = 3
24
+
25
+ # Pre-computed end coordinate deltas: [dx, dy] for each direction
26
+ DIR_DELTAS = [
27
+ [0, -1], # UP
28
+ [0, 1], # DOWN
29
+ [-1, 0], # LEFT
30
+ [1, 0] # RIGHT
31
+ ].freeze
32
+
33
+ # SVG path commands indexed by direction constant
34
+ DIR_PATH_COMMANDS = ["v-", "v", "h-", "h"].freeze
35
+
36
+ def build(module_size, options = {})
37
+ color = options[:color]
38
+ offset_x = options[:offset_x].to_i
39
+ offset_y = options[:offset_y].to_i
40
+
19
41
  modules_array = @qrcode.modules
20
- matrix_width = matrix_height = modules_array.length + 1
21
- empty_row = [Array.new(matrix_width - 1, false)]
22
- edge_matrix = Array.new(matrix_height) { Array.new(matrix_width) }
23
-
24
- (empty_row + modules_array + empty_row).each_cons(2).with_index do |row_pair, row_index|
25
- first_row, second_row = row_pair
26
-
27
- # horizontal edges
28
- first_row.zip(second_row).each_with_index do |cell_pair, column_index|
29
- edge = case cell_pair
30
- when [true, false] then Edge.new column_index + 1, row_index, :left
31
- when [false, true] then Edge.new column_index, row_index, :right
42
+ module_count = modules_array.length
43
+ matrix_size = module_count + 1
44
+
45
+ # Edge matrix stores arrays of [x, y, direction] tuples
46
+ edge_matrix = Array.new(matrix_size) { Array.new(matrix_size) }
47
+ edge_count = 0
48
+
49
+ # Process horizontal edges (between vertically adjacent cells)
50
+ (module_count + 1).times do |row_index|
51
+ module_count.times do |col_index|
52
+ above = row_index > 0 && modules_array[row_index - 1][col_index]
53
+ below = row_index < module_count && modules_array[row_index][col_index]
54
+
55
+ if above && !below
56
+ # Edge going left at (col+1, row)
57
+ x = col_index + 1
58
+ y = row_index
59
+ (edge_matrix[y][x] ||= []) << [x, y, DIR_LEFT]
60
+ edge_count += 1
61
+ elsif !above && below
62
+ # Edge going right at (col, row)
63
+ x = col_index
64
+ y = row_index
65
+ (edge_matrix[y][x] ||= []) << [x, y, DIR_RIGHT]
66
+ edge_count += 1
32
67
  end
33
-
34
- (edge_matrix[edge.start_y][edge.start_x] ||= []) << edge if edge
35
68
  end
69
+ end
36
70
 
37
- # vertical edges
38
- ([false] + second_row + [false]).each_cons(2).each_with_index do |cell_pair, column_index|
39
- edge = case cell_pair
40
- when [true, false] then Edge.new column_index, row_index, :down
41
- when [false, true] then Edge.new column_index, row_index + 1, :up
71
+ # Process vertical edges (between horizontally adjacent cells)
72
+ module_count.times do |row_index|
73
+ (module_count + 1).times do |col_index|
74
+ left = col_index > 0 && modules_array[row_index][col_index - 1]
75
+ right = col_index < module_count && modules_array[row_index][col_index]
76
+
77
+ if left && !right
78
+ # Edge going down at (col, row)
79
+ x = col_index
80
+ y = row_index
81
+ (edge_matrix[y][x] ||= []) << [x, y, DIR_DOWN]
82
+ edge_count += 1
83
+ elsif !left && right
84
+ # Edge going up at (col, row+1)
85
+ x = col_index
86
+ y = row_index + 1
87
+ (edge_matrix[y][x] ||= []) << [x, y, DIR_UP]
88
+ edge_count += 1
42
89
  end
43
-
44
- (edge_matrix[edge.start_y][edge.start_x] ||= []) << edge if edge
45
90
  end
46
91
  end
47
92
 
48
- edge_count = edge_matrix.flatten.compact.count
49
- path = []
93
+ path_parts = []
50
94
 
51
- while edge_count > 0
52
- edge_loop = []
53
- next_matrix_cell = edge_matrix.find(&:any?).find { |cell| cell&.any? }
54
- edge = next_matrix_cell.first
55
-
56
- while edge
57
- edge_loop << edge
58
- matrix_cell = edge_matrix[edge.start_y][edge.start_x]
59
- matrix_cell.delete edge
60
- edge_matrix[edge.start_y][edge.start_x] = nil if matrix_cell.empty?
61
- edge_count -= 1
95
+ # Track search position to avoid re-scanning from beginning
96
+ search_y = 0
97
+ search_x = 0
62
98
 
63
- # try to find an edge continuing the current edge
64
- edge = edge_matrix[edge.end_y][edge.end_x]&.first
99
+ while edge_count > 0
100
+ # Find next non-empty cell, starting from last position
101
+ start_edge = nil
102
+ found_y = search_y
103
+ found_x = search_x
104
+
105
+ # Continue from where we left off
106
+ (search_y...matrix_size).each do |y|
107
+ start_col = (y == search_y) ? search_x : 0
108
+ (start_col...matrix_size).each do |x|
109
+ cell = edge_matrix[y][x]
110
+ next unless cell && !cell.empty?
111
+
112
+ start_edge = cell.first
113
+ found_y = y
114
+ found_x = x
115
+ break
116
+ end
117
+ break if start_edge
65
118
  end
66
119
 
67
- first_edge = edge_loop.first
68
- edge_loop_string = SVG_PATH_COMMANDS[:move]
69
- edge_loop_string += "#{first_edge.start_x} #{first_edge.start_y}"
120
+ # Update search position for next iteration
121
+ search_y = found_y
122
+ search_x = found_x
123
+
124
+ # Build path string directly without intermediate edge_loop array
125
+ path_str = String.new(capacity: 64)
126
+ path_str << "M" << start_edge[0].to_s << " " << start_edge[1].to_s
127
+
128
+ current_edge = start_edge
129
+ current_dir = nil
130
+ current_count = 0
131
+
132
+ while current_edge
133
+ ex, ey, edir = current_edge
134
+
135
+ # Remove edge from matrix
136
+ cell = edge_matrix[ey][ex]
137
+ cell.delete(current_edge)
138
+ edge_matrix[ey][ex] = nil if cell.empty?
139
+ edge_count -= 1
140
+
141
+ # Accumulate consecutive edges in same direction
142
+ if edir == current_dir
143
+ current_count += 1
144
+ else
145
+ # Flush previous direction
146
+ path_str << DIR_PATH_COMMANDS[current_dir] << current_count.to_s if current_dir
147
+ current_dir = edir
148
+ current_count = 1
149
+ end
70
150
 
71
- edge_loop.chunk(&:direction).to_a[0...-1].each do |direction, edges|
72
- edge_loop_string << "#{SVG_PATH_COMMANDS[direction]}#{edges.length}"
151
+ # Find next edge at end coordinates
152
+ delta = DIR_DELTAS[edir]
153
+ next_x = ex + delta[0]
154
+ next_y = ey + delta[1]
155
+ next_cell = edge_matrix[next_y]&.[](next_x)
156
+ current_edge = next_cell&.first
73
157
  end
74
- edge_loop_string << SVG_PATH_COMMANDS[:close]
75
158
 
76
- path << edge_loop_string
159
+ # Don't output the last direction segment - close path instead
160
+ path_str << "z"
161
+ path_parts << path_str
77
162
  end
78
163
 
79
- # Prefix hexadecimal colors unless using a named color (symbol)
80
- color = "##{color}" unless color.is_a?(Symbol)
81
-
82
- @result << %{<path d="#{path.join}" fill="#{color}" transform="translate(#{offset},#{offset}) scale(#{module_size})"/>}
164
+ @result << %{<path d="#{path_parts.join}" fill="#{color}" transform="translate(#{offset_x},#{offset_y}) scale(#{module_size})"/>}
83
165
  end
84
166
  end
85
167
 
86
168
  class Rect < BaseOutputSVG
87
- def build(module_size, offset, color)
88
- # Prefix hexadecimal colors unless using a named color (symbol)
89
- color = "##{color}" unless color.is_a?(Symbol)
169
+ def build(module_size, options = {})
170
+ # Extract values from options
171
+ color = options[:color]
172
+ offset_x = options[:offset_x].to_i
173
+ offset_y = options[:offset_y].to_i
90
174
 
91
175
  @qrcode.modules.each_index do |c|
92
- tmp = []
93
176
  @qrcode.modules.each_index do |r|
94
- y = c * module_size + offset
95
- x = r * module_size + offset
96
-
97
177
  next unless @qrcode.checked?(c, r)
98
- tmp << %(<rect width="#{module_size}" height="#{module_size}" x="#{x}" y="#{y}" fill="#{color}"/>)
99
- end
100
-
101
- @result << tmp.join
102
- end
103
- end
104
- end
105
178
 
106
- class Edge < Struct.new(:start_x, :start_y, :direction)
107
- def end_x
108
- case direction
109
- when :right then start_x + 1
110
- when :left then start_x - 1
111
- else start_x
112
- end
113
- end
114
-
115
- def end_y
116
- case direction
117
- when :down then start_y + 1
118
- when :up then start_y - 1
119
- else start_y
179
+ x = r * module_size + offset_x
180
+ y = c * module_size + offset_y
181
+ @result << %(<rect width="#{module_size}" height="#{module_size}" x="#{x}" y="#{y}" fill="#{color}"/>)
182
+ end
120
183
  end
121
184
  end
122
185
  end
@@ -143,6 +206,10 @@ module RQRCode
143
206
  # Options:
144
207
  # offset - Padding around the QR Code in pixels
145
208
  # (default 0)
209
+ # offset_x - X Padding around the QR Code in pixels
210
+ # (default offset)
211
+ # offset_y - Y Padding around the QR Code in pixels
212
+ # (default offset)
146
213
  # fill - Background color e.g "ffffff"
147
214
  # (default none)
148
215
  # color - Foreground color e.g "000"
@@ -164,18 +231,22 @@ module RQRCode
164
231
  def as_svg(options = {})
165
232
  fill = options[:fill]
166
233
  use_path = options[:use_path]
167
- offset = options[:offset].to_i || 0
234
+ offset = options[:offset].to_i
235
+ offset_x = options.key?(:offset_x) ? options[:offset_x].to_i : offset
236
+ offset_y = options.key?(:offset_y) ? options[:offset_y].to_i : offset
168
237
  color = options[:color] || "000"
169
238
  shape_rendering = options[:shape_rendering] || "crispEdges"
170
239
  module_size = options[:module_size] || 11
171
- standalone = options[:standalone].nil? ? true : options[:standalone]
240
+ standalone = options[:standalone].nil? || options[:standalone]
172
241
  viewbox = options[:viewbox].nil? ? false : options[:viewbox]
173
242
  svg_attributes = options[:svg_attributes] || {}
174
243
 
175
244
  # height and width dependent on offset and QR complexity
176
- dimension = (@qrcode.module_count * module_size) + (2 * offset)
245
+ width = (@qrcode.module_count * module_size) + (2 * offset_x)
246
+ height = (@qrcode.module_count * module_size) + (2 * offset_y)
247
+ dimension = [width, height].max
177
248
  # use dimensions differently if we are using a viewBox
178
- dimensions_attr = viewbox ? %(viewBox="0 0 #{dimension} #{dimension}") : %(width="#{dimension}" height="#{dimension}")
249
+ dimensions_attr = viewbox ? %(viewBox="0 0 #{width} #{height}") : %(width="#{width}" height="#{height}")
179
250
 
180
251
  svg_tag_attributes = (DEFAULT_SVG_ATTRIBUTES + [
181
252
  dimensions_attr,
@@ -186,8 +257,11 @@ module RQRCode
186
257
  open_tag = %(<svg #{svg_tag_attributes}>)
187
258
  close_tag = "</svg>"
188
259
 
260
+ # Prefix hexadecimal colors unless using a named color (symbol)
261
+ color = "##{color}" unless color.is_a?(Symbol)
262
+
189
263
  output_tag = (use_path ? Path : Rect).new(@qrcode)
190
- output_tag.build(module_size, offset, color)
264
+ output_tag.build(module_size, offset_x: offset_x, offset_y: offset_y, color: color)
191
265
 
192
266
  if fill
193
267
  # Prefix hexadecimal colors unless using a named color (symbol)
@@ -206,4 +280,4 @@ module RQRCode
206
280
  end
207
281
  end
208
282
 
209
- RQRCode::QRCode.send :include, RQRCode::Export::SVG
283
+ RQRCode::QRCode.include RQRCode::Export::SVG
@@ -5,6 +5,7 @@ require "forwardable"
5
5
  module RQRCode # :nodoc:
6
6
  class QRCode
7
7
  extend Forwardable
8
+
8
9
  def_delegators :@qrcode, :to_s
9
10
  def_delegators :@qrcode, :modules # deprecated
10
11
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RQRCode
4
- VERSION = "2.2.0"
4
+ VERSION = "3.2.0"
5
5
  end
metadata CHANGED
@@ -1,17 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rqrcode
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 3.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Duncan Robertson
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2023-05-17 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
- name: rqrcode_core
13
+ name: chunky_png
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
16
  - - "~>"
@@ -25,21 +24,21 @@ dependencies:
25
24
  - !ruby/object:Gem::Version
26
25
  version: '1.0'
27
26
  - !ruby/object:Gem::Dependency
28
- name: chunky_png
27
+ name: rqrcode_core
29
28
  requirement: !ruby/object:Gem::Requirement
30
29
  requirements:
31
30
  - - "~>"
32
31
  - !ruby/object:Gem::Version
33
- version: '1.0'
32
+ version: '2.0'
34
33
  type: :runtime
35
34
  prerelease: false
36
35
  version_requirements: !ruby/object:Gem::Requirement
37
36
  requirements:
38
37
  - - "~>"
39
38
  - !ruby/object:Gem::Version
40
- version: '1.0'
39
+ version: '2.0'
41
40
  - !ruby/object:Gem::Dependency
42
- name: bundler
41
+ name: benchmark-ips
43
42
  requirement: !ruby/object:Gem::Requirement
44
43
  requirements:
45
44
  - - "~>"
@@ -52,6 +51,34 @@ dependencies:
52
51
  - - "~>"
53
52
  - !ruby/object:Gem::Version
54
53
  version: '2.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: bundler
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '4.0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '4.0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: memory_profiler
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '1.0'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '1.0'
55
82
  - !ruby/object:Gem::Dependency
56
83
  name: rake
57
84
  requirement: !ruby/object:Gem::Requirement
@@ -81,19 +108,33 @@ dependencies:
81
108
  - !ruby/object:Gem::Version
82
109
  version: '3.5'
83
110
  - !ruby/object:Gem::Dependency
84
- name: standardrb
111
+ name: stackprof
85
112
  requirement: !ruby/object:Gem::Requirement
86
113
  requirements:
87
114
  - - "~>"
88
115
  - !ruby/object:Gem::Version
89
- version: '1.0'
116
+ version: '0.2'
90
117
  type: :development
91
118
  prerelease: false
92
119
  version_requirements: !ruby/object:Gem::Requirement
93
120
  requirements:
94
121
  - - "~>"
95
122
  - !ruby/object:Gem::Version
96
- version: '1.0'
123
+ version: '0.2'
124
+ - !ruby/object:Gem::Dependency
125
+ name: standard
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '1.41'
131
+ type: :development
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '1.41'
97
138
  description: |
98
139
  rqrcode is a library for encoding QR Codes. The simple
99
140
  interface allows you to create QR Code data structures
@@ -104,20 +145,9 @@ executables: []
104
145
  extensions: []
105
146
  extra_rdoc_files: []
106
147
  files:
107
- - ".github/workflows/ruby.yml"
108
- - ".gitignore"
109
- - ".rspec"
110
148
  - CHANGELOG.md
111
- - Gemfile
112
- - Gemfile.lock
113
149
  - LICENSE.txt
114
150
  - README.md
115
- - Rakefile
116
- - _config.yml
117
- - bin/console
118
- - images/ansi-screen-shot.png
119
- - images/github-qrcode.png
120
- - images/github-qrcode.svg
121
151
  - lib/rqrcode.rb
122
152
  - lib/rqrcode/export.rb
123
153
  - lib/rqrcode/export/ansi.rb
@@ -127,14 +157,12 @@ files:
127
157
  - lib/rqrcode/qrcode.rb
128
158
  - lib/rqrcode/qrcode/qrcode.rb
129
159
  - lib/rqrcode/version.rb
130
- - rqrcode.gemspec
131
160
  homepage: https://github.com/whomwah/rqrcode
132
161
  licenses:
133
162
  - MIT
134
163
  metadata:
135
164
  bug_tracker_uri: https://github.com/whomwah/rqrcode/issues
136
- changelog_uri: https://github.com/whomwah/rqrcode/blob/master/CHANGELOG.md
137
- post_install_message:
165
+ changelog_uri: https://github.com/whomwah/rqrcode/blob/main/CHANGELOG.md
138
166
  rdoc_options: []
139
167
  require_paths:
140
168
  - lib
@@ -142,15 +170,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
142
170
  requirements:
143
171
  - - ">="
144
172
  - !ruby/object:Gem::Version
145
- version: '2.6'
173
+ version: '3.2'
146
174
  required_rubygems_version: !ruby/object:Gem::Requirement
147
175
  requirements:
148
176
  - - ">="
149
177
  - !ruby/object:Gem::Version
150
178
  version: '0'
151
179
  requirements: []
152
- rubygems_version: 3.4.6
153
- signing_key:
180
+ rubygems_version: 4.0.3
154
181
  specification_version: 4
155
182
  summary: A library to encode QR Codes
156
183
  test_files: []
@@ -1,28 +0,0 @@
1
- name: rqrcode
2
-
3
- on:
4
- push:
5
- branches:
6
- - master
7
- pull_request:
8
- branches:
9
- - master
10
-
11
- jobs:
12
- Build:
13
- strategy:
14
- fail-fast: false
15
- matrix:
16
- os: [ubuntu-latest, macos-latest]
17
- ruby: ['2.6', '2.7', '3.0', '3.1', '3.2']
18
- runs-on: ${{ matrix.os }}
19
- steps:
20
- - uses: actions/checkout@v3
21
- - uses: ruby/setup-ruby@v1
22
- with:
23
- ruby-version: ${{ matrix.ruby }}
24
- bundler-cache: true # runs 'bundle install' and caches installed gems automatically
25
- - name: Run Tests for Ruby ${{ matrix.ruby }} on ${{ matrix.os }}
26
- run: bundle exec rake spec
27
- - name: StandardRB check for Ruby ${{ matrix.ruby }} on ${{ matrix.os }}
28
- run: bundle exec standardrb --format progress
data/.gitignore DELETED
@@ -1,13 +0,0 @@
1
- /.bundle/
2
- /.yardoc
3
- /_yardoc/
4
- /coverage/
5
- /doc/
6
- /pkg/
7
- /spec/reports/
8
- /tmp/
9
- /.devcontainer/
10
- .rvmrc
11
- *.sublime-project
12
- *.sublime-workspace
13
- *.gem
data/.rspec DELETED
@@ -1,2 +0,0 @@
1
- --color
2
- --require spec_helper
data/Gemfile DELETED
@@ -1,4 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- # Specify your gem's dependencies in rqrcode-base.gemspec
4
- gemspec
data/Gemfile.lock DELETED
@@ -1,72 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- rqrcode (2.2.0)
5
- chunky_png (~> 1.0)
6
- rqrcode_core (~> 1.0)
7
-
8
- GEM
9
- remote: https://rubygems.org/
10
- specs:
11
- ast (2.4.2)
12
- chunky_png (1.4.0)
13
- diff-lcs (1.5.0)
14
- json (2.6.3)
15
- language_server-protocol (3.17.0.2)
16
- parallel (1.22.1)
17
- parser (3.1.3.0)
18
- ast (~> 2.4.1)
19
- rainbow (3.1.1)
20
- rake (13.0.6)
21
- regexp_parser (2.6.1)
22
- rexml (3.2.5)
23
- rqrcode_core (1.2.0)
24
- rspec (3.12.0)
25
- rspec-core (~> 3.12.0)
26
- rspec-expectations (~> 3.12.0)
27
- rspec-mocks (~> 3.12.0)
28
- rspec-core (3.12.0)
29
- rspec-support (~> 3.12.0)
30
- rspec-expectations (3.12.1)
31
- diff-lcs (>= 1.2.0, < 2.0)
32
- rspec-support (~> 3.12.0)
33
- rspec-mocks (3.12.1)
34
- diff-lcs (>= 1.2.0, < 2.0)
35
- rspec-support (~> 3.12.0)
36
- rspec-support (3.12.0)
37
- rubocop (1.40.0)
38
- json (~> 2.3)
39
- parallel (~> 1.10)
40
- parser (>= 3.1.2.1)
41
- rainbow (>= 2.2.2, < 4.0)
42
- regexp_parser (>= 1.8, < 3.0)
43
- rexml (>= 3.2.5, < 4.0)
44
- rubocop-ast (>= 1.23.0, < 2.0)
45
- ruby-progressbar (~> 1.7)
46
- unicode-display_width (>= 1.4.0, < 3.0)
47
- rubocop-ast (1.24.0)
48
- parser (>= 3.1.1.0)
49
- rubocop-performance (1.15.1)
50
- rubocop (>= 1.7.0, < 2.0)
51
- rubocop-ast (>= 0.4.0)
52
- ruby-progressbar (1.11.0)
53
- standard (1.20.0)
54
- language_server-protocol (~> 3.17.0.2)
55
- rubocop (= 1.40.0)
56
- rubocop-performance (= 1.15.1)
57
- standardrb (1.0.1)
58
- standard
59
- unicode-display_width (2.3.0)
60
-
61
- PLATFORMS
62
- ruby
63
-
64
- DEPENDENCIES
65
- bundler (~> 2.0)
66
- rake (~> 13.0)
67
- rqrcode!
68
- rspec (~> 3.5)
69
- standardrb (~> 1.0)
70
-
71
- BUNDLED WITH
72
- 2.3.26
data/Rakefile DELETED
@@ -1,10 +0,0 @@
1
- begin
2
- require "standard/rake"
3
- require "rspec/core/rake_task"
4
-
5
- RSpec::Core::RakeTask.new(:spec)
6
-
7
- task default: [:spec, "standard:fix"]
8
- rescue LoadError
9
- # no standard/rspec available
10
- end
data/_config.yml DELETED
@@ -1 +0,0 @@
1
- theme: jekyll-theme-slate
data/bin/console DELETED
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require "bundler/setup"
4
- require "rqrcode"
5
-
6
- # You can add fixtures and/or initialization code here to make experimenting
7
- # with your gem easier. You can also use a different console, if you like.
8
-
9
- # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
11
- # Pry.start
12
-
13
- require "irb"
14
- IRB.start(__FILE__)
Binary file
Binary file
@@ -1,32 +0,0 @@
1
- <?xml version="1.0" standalone="yes"?>
2
- <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" width="174" height="174" shape-rendering="crispEdges">
3
- <rect width="6" height="6" x="0" y="0" style="fill:#000"/><rect width="6" height="6" x="6" y="0" style="fill:#000"/><rect width="6" height="6" x="12" y="0" style="fill:#000"/><rect width="6" height="6" x="18" y="0" style="fill:#000"/><rect width="6" height="6" x="24" y="0" style="fill:#000"/><rect width="6" height="6" x="30" y="0" style="fill:#000"/><rect width="6" height="6" x="36" y="0" style="fill:#000"/><rect width="6" height="6" x="54" y="0" style="fill:#000"/><rect width="6" height="6" x="60" y="0" style="fill:#000"/><rect width="6" height="6" x="66" y="0" style="fill:#000"/><rect width="6" height="6" x="78" y="0" style="fill:#000"/><rect width="6" height="6" x="108" y="0" style="fill:#000"/><rect width="6" height="6" x="114" y="0" style="fill:#000"/><rect width="6" height="6" x="132" y="0" style="fill:#000"/><rect width="6" height="6" x="138" y="0" style="fill:#000"/><rect width="6" height="6" x="144" y="0" style="fill:#000"/><rect width="6" height="6" x="150" y="0" style="fill:#000"/><rect width="6" height="6" x="156" y="0" style="fill:#000"/><rect width="6" height="6" x="162" y="0" style="fill:#000"/><rect width="6" height="6" x="168" y="0" style="fill:#000"/>
4
- <rect width="6" height="6" x="0" y="6" style="fill:#000"/><rect width="6" height="6" x="36" y="6" style="fill:#000"/><rect width="6" height="6" x="60" y="6" style="fill:#000"/><rect width="6" height="6" x="66" y="6" style="fill:#000"/><rect width="6" height="6" x="78" y="6" style="fill:#000"/><rect width="6" height="6" x="84" y="6" style="fill:#000"/><rect width="6" height="6" x="90" y="6" style="fill:#000"/><rect width="6" height="6" x="96" y="6" style="fill:#000"/><rect width="6" height="6" x="108" y="6" style="fill:#000"/><rect width="6" height="6" x="120" y="6" style="fill:#000"/><rect width="6" height="6" x="132" y="6" style="fill:#000"/><rect width="6" height="6" x="168" y="6" style="fill:#000"/>
5
- <rect width="6" height="6" x="0" y="12" style="fill:#000"/><rect width="6" height="6" x="12" y="12" style="fill:#000"/><rect width="6" height="6" x="18" y="12" style="fill:#000"/><rect width="6" height="6" x="24" y="12" style="fill:#000"/><rect width="6" height="6" x="36" y="12" style="fill:#000"/><rect width="6" height="6" x="48" y="12" style="fill:#000"/><rect width="6" height="6" x="54" y="12" style="fill:#000"/><rect width="6" height="6" x="72" y="12" style="fill:#000"/><rect width="6" height="6" x="90" y="12" style="fill:#000"/><rect width="6" height="6" x="108" y="12" style="fill:#000"/><rect width="6" height="6" x="120" y="12" style="fill:#000"/><rect width="6" height="6" x="132" y="12" style="fill:#000"/><rect width="6" height="6" x="144" y="12" style="fill:#000"/><rect width="6" height="6" x="150" y="12" style="fill:#000"/><rect width="6" height="6" x="156" y="12" style="fill:#000"/><rect width="6" height="6" x="168" y="12" style="fill:#000"/>
6
- <rect width="6" height="6" x="0" y="18" style="fill:#000"/><rect width="6" height="6" x="12" y="18" style="fill:#000"/><rect width="6" height="6" x="18" y="18" style="fill:#000"/><rect width="6" height="6" x="24" y="18" style="fill:#000"/><rect width="6" height="6" x="36" y="18" style="fill:#000"/><rect width="6" height="6" x="48" y="18" style="fill:#000"/><rect width="6" height="6" x="54" y="18" style="fill:#000"/><rect width="6" height="6" x="60" y="18" style="fill:#000"/><rect width="6" height="6" x="78" y="18" style="fill:#000"/><rect width="6" height="6" x="90" y="18" style="fill:#000"/><rect width="6" height="6" x="102" y="18" style="fill:#000"/><rect width="6" height="6" x="114" y="18" style="fill:#000"/><rect width="6" height="6" x="120" y="18" style="fill:#000"/><rect width="6" height="6" x="132" y="18" style="fill:#000"/><rect width="6" height="6" x="144" y="18" style="fill:#000"/><rect width="6" height="6" x="150" y="18" style="fill:#000"/><rect width="6" height="6" x="156" y="18" style="fill:#000"/><rect width="6" height="6" x="168" y="18" style="fill:#000"/>
7
- <rect width="6" height="6" x="0" y="24" style="fill:#000"/><rect width="6" height="6" x="12" y="24" style="fill:#000"/><rect width="6" height="6" x="18" y="24" style="fill:#000"/><rect width="6" height="6" x="24" y="24" style="fill:#000"/><rect width="6" height="6" x="36" y="24" style="fill:#000"/><rect width="6" height="6" x="60" y="24" style="fill:#000"/><rect width="6" height="6" x="66" y="24" style="fill:#000"/><rect width="6" height="6" x="72" y="24" style="fill:#000"/><rect width="6" height="6" x="78" y="24" style="fill:#000"/><rect width="6" height="6" x="84" y="24" style="fill:#000"/><rect width="6" height="6" x="90" y="24" style="fill:#000"/><rect width="6" height="6" x="96" y="24" style="fill:#000"/><rect width="6" height="6" x="102" y="24" style="fill:#000"/><rect width="6" height="6" x="114" y="24" style="fill:#000"/><rect width="6" height="6" x="132" y="24" style="fill:#000"/><rect width="6" height="6" x="144" y="24" style="fill:#000"/><rect width="6" height="6" x="150" y="24" style="fill:#000"/><rect width="6" height="6" x="156" y="24" style="fill:#000"/><rect width="6" height="6" x="168" y="24" style="fill:#000"/>
8
- <rect width="6" height="6" x="0" y="30" style="fill:#000"/><rect width="6" height="6" x="36" y="30" style="fill:#000"/><rect width="6" height="6" x="60" y="30" style="fill:#000"/><rect width="6" height="6" x="66" y="30" style="fill:#000"/><rect width="6" height="6" x="90" y="30" style="fill:#000"/><rect width="6" height="6" x="102" y="30" style="fill:#000"/><rect width="6" height="6" x="108" y="30" style="fill:#000"/><rect width="6" height="6" x="132" y="30" style="fill:#000"/><rect width="6" height="6" x="168" y="30" style="fill:#000"/>
9
- <rect width="6" height="6" x="0" y="36" style="fill:#000"/><rect width="6" height="6" x="6" y="36" style="fill:#000"/><rect width="6" height="6" x="12" y="36" style="fill:#000"/><rect width="6" height="6" x="18" y="36" style="fill:#000"/><rect width="6" height="6" x="24" y="36" style="fill:#000"/><rect width="6" height="6" x="30" y="36" style="fill:#000"/><rect width="6" height="6" x="36" y="36" style="fill:#000"/><rect width="6" height="6" x="48" y="36" style="fill:#000"/><rect width="6" height="6" x="60" y="36" style="fill:#000"/><rect width="6" height="6" x="72" y="36" style="fill:#000"/><rect width="6" height="6" x="84" y="36" style="fill:#000"/><rect width="6" height="6" x="96" y="36" style="fill:#000"/><rect width="6" height="6" x="108" y="36" style="fill:#000"/><rect width="6" height="6" x="120" y="36" style="fill:#000"/><rect width="6" height="6" x="132" y="36" style="fill:#000"/><rect width="6" height="6" x="138" y="36" style="fill:#000"/><rect width="6" height="6" x="144" y="36" style="fill:#000"/><rect width="6" height="6" x="150" y="36" style="fill:#000"/><rect width="6" height="6" x="156" y="36" style="fill:#000"/><rect width="6" height="6" x="162" y="36" style="fill:#000"/><rect width="6" height="6" x="168" y="36" style="fill:#000"/>
10
- <rect width="6" height="6" x="54" y="42" style="fill:#000"/><rect width="6" height="6" x="72" y="42" style="fill:#000"/><rect width="6" height="6" x="78" y="42" style="fill:#000"/><rect width="6" height="6" x="84" y="42" style="fill:#000"/><rect width="6" height="6" x="114" y="42" style="fill:#000"/>
11
- <rect width="6" height="6" x="18" y="48" style="fill:#000"/><rect width="6" height="6" x="24" y="48" style="fill:#000"/><rect width="6" height="6" x="36" y="48" style="fill:#000"/><rect width="6" height="6" x="42" y="48" style="fill:#000"/><rect width="6" height="6" x="54" y="48" style="fill:#000"/><rect width="6" height="6" x="72" y="48" style="fill:#000"/><rect width="6" height="6" x="90" y="48" style="fill:#000"/><rect width="6" height="6" x="96" y="48" style="fill:#000"/><rect width="6" height="6" x="108" y="48" style="fill:#000"/><rect width="6" height="6" x="114" y="48" style="fill:#000"/><rect width="6" height="6" x="120" y="48" style="fill:#000"/><rect width="6" height="6" x="150" y="48" style="fill:#000"/><rect width="6" height="6" x="156" y="48" style="fill:#000"/>
12
- <rect width="6" height="6" x="12" y="54" style="fill:#000"/><rect width="6" height="6" x="18" y="54" style="fill:#000"/><rect width="6" height="6" x="24" y="54" style="fill:#000"/><rect width="6" height="6" x="30" y="54" style="fill:#000"/><rect width="6" height="6" x="54" y="54" style="fill:#000"/><rect width="6" height="6" x="72" y="54" style="fill:#000"/><rect width="6" height="6" x="78" y="54" style="fill:#000"/><rect width="6" height="6" x="84" y="54" style="fill:#000"/><rect width="6" height="6" x="96" y="54" style="fill:#000"/><rect width="6" height="6" x="120" y="54" style="fill:#000"/><rect width="6" height="6" x="132" y="54" style="fill:#000"/><rect width="6" height="6" x="144" y="54" style="fill:#000"/><rect width="6" height="6" x="150" y="54" style="fill:#000"/><rect width="6" height="6" x="162" y="54" style="fill:#000"/>
13
- <rect width="6" height="6" x="6" y="60" style="fill:#000"/><rect width="6" height="6" x="18" y="60" style="fill:#000"/><rect width="6" height="6" x="36" y="60" style="fill:#000"/><rect width="6" height="6" x="48" y="60" style="fill:#000"/><rect width="6" height="6" x="78" y="60" style="fill:#000"/><rect width="6" height="6" x="108" y="60" style="fill:#000"/><rect width="6" height="6" x="132" y="60" style="fill:#000"/>
14
- <rect width="6" height="6" x="6" y="66" style="fill:#000"/><rect width="6" height="6" x="12" y="66" style="fill:#000"/><rect width="6" height="6" x="18" y="66" style="fill:#000"/><rect width="6" height="6" x="30" y="66" style="fill:#000"/><rect width="6" height="6" x="42" y="66" style="fill:#000"/><rect width="6" height="6" x="48" y="66" style="fill:#000"/><rect width="6" height="6" x="54" y="66" style="fill:#000"/><rect width="6" height="6" x="72" y="66" style="fill:#000"/><rect width="6" height="6" x="78" y="66" style="fill:#000"/><rect width="6" height="6" x="84" y="66" style="fill:#000"/><rect width="6" height="6" x="96" y="66" style="fill:#000"/><rect width="6" height="6" x="108" y="66" style="fill:#000"/><rect width="6" height="6" x="126" y="66" style="fill:#000"/><rect width="6" height="6" x="150" y="66" style="fill:#000"/><rect width="6" height="6" x="168" y="66" style="fill:#000"/>
15
- <rect width="6" height="6" x="24" y="72" style="fill:#000"/><rect width="6" height="6" x="36" y="72" style="fill:#000"/><rect width="6" height="6" x="42" y="72" style="fill:#000"/><rect width="6" height="6" x="48" y="72" style="fill:#000"/><rect width="6" height="6" x="54" y="72" style="fill:#000"/><rect width="6" height="6" x="60" y="72" style="fill:#000"/><rect width="6" height="6" x="78" y="72" style="fill:#000"/><rect width="6" height="6" x="90" y="72" style="fill:#000"/><rect width="6" height="6" x="102" y="72" style="fill:#000"/><rect width="6" height="6" x="114" y="72" style="fill:#000"/><rect width="6" height="6" x="126" y="72" style="fill:#000"/><rect width="6" height="6" x="132" y="72" style="fill:#000"/><rect width="6" height="6" x="138" y="72" style="fill:#000"/><rect width="6" height="6" x="150" y="72" style="fill:#000"/><rect width="6" height="6" x="162" y="72" style="fill:#000"/>
16
- <rect width="6" height="6" x="6" y="78" style="fill:#000"/><rect width="6" height="6" x="12" y="78" style="fill:#000"/><rect width="6" height="6" x="24" y="78" style="fill:#000"/><rect width="6" height="6" x="30" y="78" style="fill:#000"/><rect width="6" height="6" x="78" y="78" style="fill:#000"/><rect width="6" height="6" x="84" y="78" style="fill:#000"/><rect width="6" height="6" x="102" y="78" style="fill:#000"/><rect width="6" height="6" x="132" y="78" style="fill:#000"/><rect width="6" height="6" x="144" y="78" style="fill:#000"/><rect width="6" height="6" x="156" y="78" style="fill:#000"/><rect width="6" height="6" x="168" y="78" style="fill:#000"/>
17
- <rect width="6" height="6" x="0" y="84" style="fill:#000"/><rect width="6" height="6" x="12" y="84" style="fill:#000"/><rect width="6" height="6" x="18" y="84" style="fill:#000"/><rect width="6" height="6" x="30" y="84" style="fill:#000"/><rect width="6" height="6" x="36" y="84" style="fill:#000"/><rect width="6" height="6" x="42" y="84" style="fill:#000"/><rect width="6" height="6" x="48" y="84" style="fill:#000"/><rect width="6" height="6" x="72" y="84" style="fill:#000"/><rect width="6" height="6" x="78" y="84" style="fill:#000"/><rect width="6" height="6" x="108" y="84" style="fill:#000"/><rect width="6" height="6" x="114" y="84" style="fill:#000"/><rect width="6" height="6" x="120" y="84" style="fill:#000"/><rect width="6" height="6" x="150" y="84" style="fill:#000"/><rect width="6" height="6" x="162" y="84" style="fill:#000"/><rect width="6" height="6" x="168" y="84" style="fill:#000"/>
18
- <rect width="6" height="6" x="0" y="90" style="fill:#000"/><rect width="6" height="6" x="12" y="90" style="fill:#000"/><rect width="6" height="6" x="30" y="90" style="fill:#000"/><rect width="6" height="6" x="60" y="90" style="fill:#000"/><rect width="6" height="6" x="78" y="90" style="fill:#000"/><rect width="6" height="6" x="102" y="90" style="fill:#000"/><rect width="6" height="6" x="108" y="90" style="fill:#000"/><rect width="6" height="6" x="120" y="90" style="fill:#000"/><rect width="6" height="6" x="150" y="90" style="fill:#000"/><rect width="6" height="6" x="156" y="90" style="fill:#000"/>
19
- <rect width="6" height="6" x="18" y="96" style="fill:#000"/><rect width="6" height="6" x="24" y="96" style="fill:#000"/><rect width="6" height="6" x="30" y="96" style="fill:#000"/><rect width="6" height="6" x="36" y="96" style="fill:#000"/><rect width="6" height="6" x="48" y="96" style="fill:#000"/><rect width="6" height="6" x="60" y="96" style="fill:#000"/><rect width="6" height="6" x="72" y="96" style="fill:#000"/><rect width="6" height="6" x="78" y="96" style="fill:#000"/><rect width="6" height="6" x="84" y="96" style="fill:#000"/><rect width="6" height="6" x="108" y="96" style="fill:#000"/><rect width="6" height="6" x="114" y="96" style="fill:#000"/><rect width="6" height="6" x="120" y="96" style="fill:#000"/><rect width="6" height="6" x="132" y="96" style="fill:#000"/><rect width="6" height="6" x="138" y="96" style="fill:#000"/><rect width="6" height="6" x="150" y="96" style="fill:#000"/><rect width="6" height="6" x="162" y="96" style="fill:#000"/>
20
- <rect width="6" height="6" x="0" y="102" style="fill:#000"/><rect width="6" height="6" x="6" y="102" style="fill:#000"/><rect width="6" height="6" x="12" y="102" style="fill:#000"/><rect width="6" height="6" x="18" y="102" style="fill:#000"/><rect width="6" height="6" x="54" y="102" style="fill:#000"/><rect width="6" height="6" x="66" y="102" style="fill:#000"/><rect width="6" height="6" x="96" y="102" style="fill:#000"/><rect width="6" height="6" x="102" y="102" style="fill:#000"/><rect width="6" height="6" x="108" y="102" style="fill:#000"/><rect width="6" height="6" x="120" y="102" style="fill:#000"/><rect width="6" height="6" x="132" y="102" style="fill:#000"/><rect width="6" height="6" x="138" y="102" style="fill:#000"/><rect width="6" height="6" x="144" y="102" style="fill:#000"/>
21
- <rect width="6" height="6" x="0" y="108" style="fill:#000"/><rect width="6" height="6" x="6" y="108" style="fill:#000"/><rect width="6" height="6" x="18" y="108" style="fill:#000"/><rect width="6" height="6" x="24" y="108" style="fill:#000"/><rect width="6" height="6" x="36" y="108" style="fill:#000"/><rect width="6" height="6" x="60" y="108" style="fill:#000"/><rect width="6" height="6" x="72" y="108" style="fill:#000"/><rect width="6" height="6" x="90" y="108" style="fill:#000"/><rect width="6" height="6" x="120" y="108" style="fill:#000"/><rect width="6" height="6" x="144" y="108" style="fill:#000"/><rect width="6" height="6" x="168" y="108" style="fill:#000"/>
22
- <rect width="6" height="6" x="0" y="114" style="fill:#000"/><rect width="6" height="6" x="6" y="114" style="fill:#000"/><rect width="6" height="6" x="12" y="114" style="fill:#000"/><rect width="6" height="6" x="18" y="114" style="fill:#000"/><rect width="6" height="6" x="24" y="114" style="fill:#000"/><rect width="6" height="6" x="30" y="114" style="fill:#000"/><rect width="6" height="6" x="42" y="114" style="fill:#000"/><rect width="6" height="6" x="48" y="114" style="fill:#000"/><rect width="6" height="6" x="60" y="114" style="fill:#000"/><rect width="6" height="6" x="72" y="114" style="fill:#000"/><rect width="6" height="6" x="78" y="114" style="fill:#000"/><rect width="6" height="6" x="90" y="114" style="fill:#000"/><rect width="6" height="6" x="126" y="114" style="fill:#000"/><rect width="6" height="6" x="132" y="114" style="fill:#000"/><rect width="6" height="6" x="138" y="114" style="fill:#000"/><rect width="6" height="6" x="156" y="114" style="fill:#000"/><rect width="6" height="6" x="168" y="114" style="fill:#000"/>
23
- <rect width="6" height="6" x="0" y="120" style="fill:#000"/><rect width="6" height="6" x="6" y="120" style="fill:#000"/><rect width="6" height="6" x="12" y="120" style="fill:#000"/><rect width="6" height="6" x="30" y="120" style="fill:#000"/><rect width="6" height="6" x="36" y="120" style="fill:#000"/><rect width="6" height="6" x="60" y="120" style="fill:#000"/><rect width="6" height="6" x="66" y="120" style="fill:#000"/><rect width="6" height="6" x="72" y="120" style="fill:#000"/><rect width="6" height="6" x="108" y="120" style="fill:#000"/><rect width="6" height="6" x="120" y="120" style="fill:#000"/><rect width="6" height="6" x="126" y="120" style="fill:#000"/><rect width="6" height="6" x="132" y="120" style="fill:#000"/><rect width="6" height="6" x="138" y="120" style="fill:#000"/><rect width="6" height="6" x="144" y="120" style="fill:#000"/><rect width="6" height="6" x="150" y="120" style="fill:#000"/><rect width="6" height="6" x="156" y="120" style="fill:#000"/><rect width="6" height="6" x="162" y="120" style="fill:#000"/><rect width="6" height="6" x="168" y="120" style="fill:#000"/>
24
- <rect width="6" height="6" x="48" y="126" style="fill:#000"/><rect width="6" height="6" x="60" y="126" style="fill:#000"/><rect width="6" height="6" x="78" y="126" style="fill:#000"/><rect width="6" height="6" x="84" y="126" style="fill:#000"/><rect width="6" height="6" x="120" y="126" style="fill:#000"/><rect width="6" height="6" x="144" y="126" style="fill:#000"/><rect width="6" height="6" x="150" y="126" style="fill:#000"/><rect width="6" height="6" x="156" y="126" style="fill:#000"/>
25
- <rect width="6" height="6" x="0" y="132" style="fill:#000"/><rect width="6" height="6" x="6" y="132" style="fill:#000"/><rect width="6" height="6" x="12" y="132" style="fill:#000"/><rect width="6" height="6" x="18" y="132" style="fill:#000"/><rect width="6" height="6" x="24" y="132" style="fill:#000"/><rect width="6" height="6" x="30" y="132" style="fill:#000"/><rect width="6" height="6" x="36" y="132" style="fill:#000"/><rect width="6" height="6" x="48" y="132" style="fill:#000"/><rect width="6" height="6" x="66" y="132" style="fill:#000"/><rect width="6" height="6" x="72" y="132" style="fill:#000"/><rect width="6" height="6" x="114" y="132" style="fill:#000"/><rect width="6" height="6" x="120" y="132" style="fill:#000"/><rect width="6" height="6" x="132" y="132" style="fill:#000"/><rect width="6" height="6" x="144" y="132" style="fill:#000"/><rect width="6" height="6" x="156" y="132" style="fill:#000"/>
26
- <rect width="6" height="6" x="0" y="138" style="fill:#000"/><rect width="6" height="6" x="36" y="138" style="fill:#000"/><rect width="6" height="6" x="60" y="138" style="fill:#000"/><rect width="6" height="6" x="66" y="138" style="fill:#000"/><rect width="6" height="6" x="72" y="138" style="fill:#000"/><rect width="6" height="6" x="78" y="138" style="fill:#000"/><rect width="6" height="6" x="96" y="138" style="fill:#000"/><rect width="6" height="6" x="108" y="138" style="fill:#000"/><rect width="6" height="6" x="114" y="138" style="fill:#000"/><rect width="6" height="6" x="120" y="138" style="fill:#000"/><rect width="6" height="6" x="144" y="138" style="fill:#000"/><rect width="6" height="6" x="150" y="138" style="fill:#000"/><rect width="6" height="6" x="162" y="138" style="fill:#000"/><rect width="6" height="6" x="168" y="138" style="fill:#000"/>
27
- <rect width="6" height="6" x="0" y="144" style="fill:#000"/><rect width="6" height="6" x="12" y="144" style="fill:#000"/><rect width="6" height="6" x="18" y="144" style="fill:#000"/><rect width="6" height="6" x="24" y="144" style="fill:#000"/><rect width="6" height="6" x="36" y="144" style="fill:#000"/><rect width="6" height="6" x="48" y="144" style="fill:#000"/><rect width="6" height="6" x="54" y="144" style="fill:#000"/><rect width="6" height="6" x="72" y="144" style="fill:#000"/><rect width="6" height="6" x="102" y="144" style="fill:#000"/><rect width="6" height="6" x="108" y="144" style="fill:#000"/><rect width="6" height="6" x="114" y="144" style="fill:#000"/><rect width="6" height="6" x="120" y="144" style="fill:#000"/><rect width="6" height="6" x="126" y="144" style="fill:#000"/><rect width="6" height="6" x="132" y="144" style="fill:#000"/><rect width="6" height="6" x="138" y="144" style="fill:#000"/><rect width="6" height="6" x="144" y="144" style="fill:#000"/><rect width="6" height="6" x="168" y="144" style="fill:#000"/>
28
- <rect width="6" height="6" x="0" y="150" style="fill:#000"/><rect width="6" height="6" x="12" y="150" style="fill:#000"/><rect width="6" height="6" x="18" y="150" style="fill:#000"/><rect width="6" height="6" x="24" y="150" style="fill:#000"/><rect width="6" height="6" x="36" y="150" style="fill:#000"/><rect width="6" height="6" x="48" y="150" style="fill:#000"/><rect width="6" height="6" x="60" y="150" style="fill:#000"/><rect width="6" height="6" x="66" y="150" style="fill:#000"/><rect width="6" height="6" x="72" y="150" style="fill:#000"/><rect width="6" height="6" x="78" y="150" style="fill:#000"/><rect width="6" height="6" x="84" y="150" style="fill:#000"/><rect width="6" height="6" x="96" y="150" style="fill:#000"/><rect width="6" height="6" x="126" y="150" style="fill:#000"/><rect width="6" height="6" x="138" y="150" style="fill:#000"/><rect width="6" height="6" x="162" y="150" style="fill:#000"/>
29
- <rect width="6" height="6" x="0" y="156" style="fill:#000"/><rect width="6" height="6" x="12" y="156" style="fill:#000"/><rect width="6" height="6" x="18" y="156" style="fill:#000"/><rect width="6" height="6" x="24" y="156" style="fill:#000"/><rect width="6" height="6" x="36" y="156" style="fill:#000"/><rect width="6" height="6" x="60" y="156" style="fill:#000"/><rect width="6" height="6" x="66" y="156" style="fill:#000"/><rect width="6" height="6" x="72" y="156" style="fill:#000"/><rect width="6" height="6" x="90" y="156" style="fill:#000"/><rect width="6" height="6" x="126" y="156" style="fill:#000"/><rect width="6" height="6" x="144" y="156" style="fill:#000"/><rect width="6" height="6" x="156" y="156" style="fill:#000"/><rect width="6" height="6" x="162" y="156" style="fill:#000"/><rect width="6" height="6" x="168" y="156" style="fill:#000"/>
30
- <rect width="6" height="6" x="0" y="162" style="fill:#000"/><rect width="6" height="6" x="36" y="162" style="fill:#000"/><rect width="6" height="6" x="54" y="162" style="fill:#000"/><rect width="6" height="6" x="72" y="162" style="fill:#000"/><rect width="6" height="6" x="84" y="162" style="fill:#000"/><rect width="6" height="6" x="114" y="162" style="fill:#000"/><rect width="6" height="6" x="120" y="162" style="fill:#000"/><rect width="6" height="6" x="132" y="162" style="fill:#000"/><rect width="6" height="6" x="144" y="162" style="fill:#000"/><rect width="6" height="6" x="150" y="162" style="fill:#000"/><rect width="6" height="6" x="156" y="162" style="fill:#000"/><rect width="6" height="6" x="168" y="162" style="fill:#000"/>
31
- <rect width="6" height="6" x="0" y="168" style="fill:#000"/><rect width="6" height="6" x="6" y="168" style="fill:#000"/><rect width="6" height="6" x="12" y="168" style="fill:#000"/><rect width="6" height="6" x="18" y="168" style="fill:#000"/><rect width="6" height="6" x="24" y="168" style="fill:#000"/><rect width="6" height="6" x="30" y="168" style="fill:#000"/><rect width="6" height="6" x="36" y="168" style="fill:#000"/><rect width="6" height="6" x="54" y="168" style="fill:#000"/><rect width="6" height="6" x="84" y="168" style="fill:#000"/><rect width="6" height="6" x="96" y="168" style="fill:#000"/><rect width="6" height="6" x="108" y="168" style="fill:#000"/><rect width="6" height="6" x="120" y="168" style="fill:#000"/><rect width="6" height="6" x="138" y="168" style="fill:#000"/><rect width="6" height="6" x="144" y="168" style="fill:#000"/>
32
- </svg>
data/rqrcode.gemspec DELETED
@@ -1,39 +0,0 @@
1
- lib = File.expand_path("../lib", __FILE__)
2
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
- require "rqrcode/version"
4
-
5
- Gem::Specification.new do |spec|
6
- spec.name = "rqrcode"
7
- spec.version = RQRCode::VERSION
8
- spec.platform = Gem::Platform::RUBY
9
- spec.authors = ["Duncan Robertson"]
10
- spec.email = ["duncan@whomwah.com"]
11
-
12
- spec.summary = "A library to encode QR Codes"
13
- spec.description = <<~EOF
14
- rqrcode is a library for encoding QR Codes. The simple
15
- interface allows you to create QR Code data structures
16
- and then render them in the way you choose.
17
- EOF
18
- spec.homepage = "https://github.com/whomwah/rqrcode"
19
- spec.license = "MIT"
20
- spec.metadata = {
21
- "bug_tracker_uri" => "https://github.com/whomwah/rqrcode/issues",
22
- "changelog_uri" => "https://github.com/whomwah/rqrcode/blob/master/CHANGELOG.md"
23
- }
24
-
25
- spec.files = Dir.chdir(File.expand_path("..", __FILE__)) do
26
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
27
- end
28
- spec.bindir = "exe"
29
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
30
- spec.require_paths = ["lib"]
31
-
32
- spec.required_ruby_version = ">= 2.6"
33
- spec.add_dependency "rqrcode_core", "~> 1.0"
34
- spec.add_dependency "chunky_png", "~> 1.0"
35
- spec.add_development_dependency "bundler", "~> 2.0"
36
- spec.add_development_dependency "rake", "~> 13.0"
37
- spec.add_development_dependency "rspec", "~> 3.5"
38
- spec.add_development_dependency "standardrb", "~> 1.0"
39
- end