rqrcode_core 0.1.2 → 1.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: fa65c1043ff732d79a7c945ebec22c3e58ec30824a10ea66ae2a83666cae0b54
4
- data.tar.gz: cd413ba0b0c37980b57d017cc5910dde35cee7c09bf99d6d77ef5d4d74daf287
3
+ metadata.gz: ea3856aba6c1bc5602b3f7fa4126187fe26c47fdba56447b709871f96f432ff5
4
+ data.tar.gz: eab7166c0e00478bcdb12ab6a550a9a9b595401bf5f6c0271c6bac95b722564f
5
5
  SHA512:
6
- metadata.gz: 1e74946cef2ab02b66431dd4e992198392166ae46e837194c2e7f361fcf6a25db37edfdc354ecbc531bbe58d713f6f3a61906c2a365a3b1df79dc03ffcd7296a
7
- data.tar.gz: a87de6c5a59cd072c8ec9da9c655b63b519d435cb219ec54a533991eaeece40e4c3778df5f5a566e94f70e8831636454a40476b4e4670f79f3a782f1e3366490
6
+ metadata.gz: b9d1977c291eaed204644f09d3900b2ea18bde93e1c242628bdf1c4cd30573c046328e3cdbfe294c6ae27370f5963cdfa8454f1f2e6af7bf185e32cd0fefe592
7
+ data.tar.gz: 56d9c31b3c056a47ffccc2848f43e0e44d3b3a984f0ef4c332505fae31dadda0ca6adac5ad0566443dbf46a86a2b81b419806cf71a9da6880d51eacd583cbb34
@@ -10,22 +10,20 @@ on:
10
10
  - master
11
11
 
12
12
  jobs:
13
- build:
14
- name: Test Ruby ${{ matrix.ruby_version }} on ${{ matrix.os }}
15
- runs-on: ${{ matrix.os }}
13
+ Build:
16
14
  strategy:
15
+ fail-fast: false
17
16
  matrix:
18
- ruby_version: [2.5.x, 2.6.x]
19
- os: [ubuntu-latest]
20
-
17
+ os: [ubuntu-latest, macos-latest]
18
+ ruby: [2.5, 2.6, 2.7, 3.0]
19
+ runs-on: ${{ matrix.os }}
21
20
  steps:
22
21
  - uses: actions/checkout@v1
23
- - name: Use Ruby ${{ matrix.ruby_version }}
24
- uses: actions/setup-ruby@v1
22
+ - uses: ruby/setup-ruby@v1
25
23
  with:
26
- ruby-version: ${{ matrix.ruby_version }}
27
- - name: Gem install and test
28
- run: |
29
- gem install bundler
30
- bundle install --jobs 4 --retry 3
31
- bundle exec rake test
24
+ ruby-version: ${{ matrix.ruby }}
25
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
26
+ - name: Run Tests
27
+ run: bundle exec rake test
28
+ - name: StandardRB Check
29
+ run: bundle exec standardrb --format progress
data/.gitignore CHANGED
@@ -7,3 +7,4 @@
7
7
  /spec/reports/
8
8
  /tmp/
9
9
  /.devcontainer/
10
+ *.gem
data/CHANGELOG.md ADDED
@@ -0,0 +1,44 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [1.2.0] - 2021-08-26
11
+
12
+ - Added Multi Mode Support which allows for multi-segment encoding. Thanks to [@ssayer](https://github.com/ssayer)
13
+
14
+ ## [1.1.0] - 2021-07-01
15
+
16
+ - Add a basic benchmark file
17
+ - Add standardRB badge
18
+ - Add `.freeze` on `CONST` lookup objects
19
+ - Remove unused `@mode` instance variable
20
+ - A batch of small refactors and optimizations
21
+
22
+ ## [1.0.0] - 2021-04-23
23
+
24
+ ### Changed
25
+
26
+ - README updated
27
+ - Small documentation clarification [@smnscp](https://github.com/smnscp).
28
+ - Rakefile cleaned up. You can now just run `rake` which will run specs and fix linting using `standardrb`
29
+
30
+ ### Breaking Changes
31
+
32
+ - Very niche but a breaking change never the less. The `to_s` method *no longer* accepts the `:true` and `:false` arguments, but prefers `:dark` and `:light`.
33
+
34
+ ## [0.2.0] - 2020-12-26
35
+
36
+ ### Changed
37
+
38
+ - fix `required_ruby_version` for Ruby 3 support
39
+
40
+ [unreleased]: https://github.com/whomwah/rqrcode_core/compare/v1.2.0...HEAD
41
+ [1.2.0]: https://github.com/whomwah/rqrcode_core/compare/v1.1.0...v1.2.0
42
+ [1.1.0]: https://github.com/whomwah/rqrcode_core/compare/v1.0.0...v1.1.0
43
+ [1.0.0]: https://github.com/whomwah/rqrcode_core/compare/v0.2.0...v1.0.0
44
+ [0.2.0]: https://github.com/whomwah/rqrcode_core/compare/v0.1.2...v0.2.0
data/Gemfile.lock CHANGED
@@ -1,13 +1,41 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rqrcode_core (0.1.1)
4
+ rqrcode_core (1.2.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
- minitest (5.11.3)
10
- rake (13.0.1)
9
+ ast (2.4.2)
10
+ minitest (5.14.4)
11
+ parallel (1.20.1)
12
+ parser (3.0.2.0)
13
+ ast (~> 2.4.1)
14
+ rainbow (3.0.0)
15
+ rake (13.0.6)
16
+ regexp_parser (2.1.1)
17
+ rexml (3.2.5)
18
+ rubocop (1.18.4)
19
+ parallel (~> 1.10)
20
+ parser (>= 3.0.0.0)
21
+ rainbow (>= 2.2.2, < 4.0)
22
+ regexp_parser (>= 1.8, < 3.0)
23
+ rexml
24
+ rubocop-ast (>= 1.8.0, < 2.0)
25
+ ruby-progressbar (~> 1.7)
26
+ unicode-display_width (>= 1.4.0, < 3.0)
27
+ rubocop-ast (1.9.1)
28
+ parser (>= 3.0.1.1)
29
+ rubocop-performance (1.11.4)
30
+ rubocop (>= 1.7.0, < 2.0)
31
+ rubocop-ast (>= 0.4.0)
32
+ ruby-progressbar (1.11.0)
33
+ standard (1.1.7)
34
+ rubocop (= 1.18.4)
35
+ rubocop-performance (= 1.11.4)
36
+ standardrb (1.0.0)
37
+ standard
38
+ unicode-display_width (2.0.0)
11
39
 
12
40
  PLATFORMS
13
41
  ruby
@@ -17,6 +45,7 @@ DEPENDENCIES
17
45
  minitest (~> 5.0)
18
46
  rake (~> 13.0)
19
47
  rqrcode_core!
48
+ standardrb (~> 1.0)
20
49
 
21
50
  BUNDLED WITH
22
- 2.0.2
51
+ 2.2.22
data/README.md CHANGED
@@ -1,24 +1,25 @@
1
- ![](https://github.com/whomwah/rqrcode_core/workflows/rqrcode_core/badge.svg)
1
+ ![](https://github.com/whomwah/rqrcode_core/actions/workflows/ruby.yml/badge.svg)
2
+ [![Ruby Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://github.com/testdouble/standard)
2
3
 
3
4
  # RQRCodeCore
4
5
 
5
- `rqrcode_core` is a library for encoding QR codes in pure Ruby. It has a simple interface with all the standard qrcode options. It was originally adapted in 2008 from a Javascript library by [Kazuhiko Arase](https://github.com/kazuhikoarase).
6
+ `rqrcode_core` is a library for encoding QR Codes in pure Ruby. It has a simple interface with all the standard qrcode options. It was originally adapted in 2008 from a Javascript library by [Kazuhiko Arase](https://github.com/kazuhikoarase).
6
7
 
7
8
  Features:
8
9
 
9
- * `rqrcode_core` is a ruby only library. It requires no native libraries. Just Ruby!
10
- * It is an encoding library. You can't decode QR codes with it.
11
- * The interface is simple and assumes you just want to encode a string into a QR code.
12
- * QR code is trademarked by Denso Wave inc.
10
+ * `rqrcode_core` is a Ruby only library. It requires no native libraries. Just Ruby!
11
+ * It is an encoding library. You can't decode QR Codes with it.
12
+ * The interface is simple and assumes you just want to encode a string into a QR Code, but also allows for encoding multiple segments.
13
+ * QR Code is trademarked by Denso Wave inc.
13
14
 
14
- `rqrcode_core` is the basis of the popular `rqrcode` gem [https://github.com/whomwah/rqrcode]. This gem allows you to generate different renderings of your QR code, including `png`, `svg` and `ansi`.
15
+ `rqrcode_core` is the basis of the popular `rqrcode` gem [https://github.com/whomwah/rqrcode]. This gem allows you to generate different renderings of your QR Code, including `png`, `svg` and `ansi`.
15
16
 
16
17
  ## Installation
17
18
 
18
19
  Add this line to your application's Gemfile:
19
20
 
20
21
  ```ruby
21
- gem 'rqrcode_core'
22
+ gem "rqrcode_core"
22
23
  ```
23
24
 
24
25
  And then execute:
@@ -32,8 +33,8 @@ Or install it yourself as:
32
33
  ## Basic Usage
33
34
 
34
35
  ```ruby
35
- $ require 'rqrcode_core'
36
- $ qr = RQRCodeCore::QRCode.new('my string to generate', size: 4, level: :h)
36
+ $ require "rqrcode_core"
37
+ $ qr = RQRCodeCore::QRCode.new("https://kyan.com")
37
38
  $ puts qr.to_s
38
39
  ```
39
40
 
@@ -46,15 +47,24 @@ x xxx x xxxxx x xx x xxx x
46
47
  ... etc
47
48
  ```
48
49
 
50
+ ## Multiple Encoding Support
51
+
52
+ ```ruby
53
+ $ require "rqrcode_core"
54
+ $ qr = RQRCodeCore::QRCode.new([{data: "byteencoded", mode: :byte_8bit}, {data: "A1" * 100, mode: :alphanumeric}, {data: "1" * 500, mode: :number}])
55
+ ```
56
+
57
+ This will create a QR Code with byte encoded, alphanumeric and number segments. Any combination of encodings/segments will work provided it fits within size limits.
58
+
49
59
  ## Doing your own rendering
50
60
 
51
61
  ```ruby
52
- require 'rqrcode_core'
62
+ require "rqrcode_core"
53
63
 
54
- qr = RQRCodeCore::QRCode.new('my string to generate', size: 4, level: :h)
55
- qr.modules.each do |row|
64
+ qr = RQRCodeCore::QRCode.new("https://kyan.com")
65
+ qr.rows.each do |row|
56
66
  row.each do |col|
57
- print col ? '#' : ' '
67
+ print col ? "#" : " "
58
68
  end
59
69
 
60
70
  print "\n"
@@ -63,12 +73,14 @@ end
63
73
 
64
74
  ### Options
65
75
 
66
- The library expects a string to be parsed in, other args are optional.
76
+ The library expects a string or array (for multiple encodings) to be parsed in, other args are optional.
67
77
 
68
78
  ```
69
- string - the string you wish to encode
79
+ data - the string or array you wish to encode
80
+
81
+ size - the size (integer) of the QR Code (defaults to smallest size needed to encode the string)
70
82
 
71
- size - the size of the qrcode (default 4)
83
+ max_size - the max_size (Integer) of the QR Code (default RQRCodeCore::QRUtil.max_size)
72
84
 
73
85
  level - the error correction level, can be:
74
86
  * Level :l 7% of code can be restored
@@ -76,7 +88,7 @@ level - the error correction level, can be:
76
88
  * Level :q 25% of code can be restored
77
89
  * Level :h 30% of code can be restored (default :h)
78
90
 
79
- mode - the mode of the qrcode (defaults to alphanumeric or byte_8bit, depending on the input data):
91
+ mode - the mode of the QR Code (defaults to alphanumeric or byte_8bit, depending on the input data, only used when data is a string):
80
92
  * :number
81
93
  * :alphanumeric
82
94
  * :byte_8bit
@@ -85,13 +97,36 @@ mode - the mode of the qrcode (defaults to alphanumeric or byte_8bit, dependin
85
97
 
86
98
  #### Example
87
99
 
88
- ```
89
- qr = RQRCodeCore::QRCode.new('hello world', size: 1, level: :m, mode: :alphanumeric)
100
+ ```ruby
101
+ RQRCodeCore::QRCode.new("http://kyan.com", size: 1, level: :m, mode: :alphanumeric)
90
102
  ```
91
103
 
92
104
  ## Development
93
105
 
94
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
106
+ ### Tests
107
+
108
+ You can run the test suite using:
109
+
110
+ ```
111
+ $ ./bin/setup
112
+ $ rake
113
+ ```
114
+
115
+ or try the project from the console with:
116
+
117
+ ```
118
+ $ ./bin/console
119
+ ```
120
+
121
+ ### Linting
122
+
123
+ The project uses [standardrb](https://github.com/testdouble/standard) and can be run with:
124
+
125
+ ```
126
+ $ ./bin/setup
127
+ $ rake standard # check
128
+ $ rake standard:fix # fix
129
+ ```
95
130
 
96
131
  ## Contributing
97
132
 
data/Rakefile CHANGED
@@ -1,10 +1,19 @@
1
- require "bundler/gem_tasks"
2
- require "rake/testtask"
1
+ begin
2
+ require "rake/testtask"
3
+ require "standard/rake"
3
4
 
4
- Rake::TestTask.new(:test) do |t|
5
- t.libs << "test"
6
- t.libs << "lib"
7
- t.test_files = FileList["test/**/*_test.rb"]
8
- end
5
+ Rake::TestTask.new(:test) do |t|
6
+ t.libs << "test"
7
+ t.libs << "lib"
8
+ t.test_files = FileList["test/**/*_test.rb"]
9
+ end
10
+
11
+ task default: [:test, "standard:fix"]
9
12
 
10
- task :default => :test
13
+ desc "Run a simple benchmark (x1000)"
14
+ task :benchmark do
15
+ ruby "test/benchmark.rb"
16
+ end
17
+ rescue LoadError
18
+ # no standard/rspec available
19
+ end
@@ -2,21 +2,13 @@
2
2
 
3
3
  module RQRCodeCore
4
4
  class QR8bitByte
5
- attr_reader :mode
6
-
7
- def initialize( data )
8
- @mode = QRMODE[:mode_8bit_byte]
9
- @data = data;
10
- end
11
-
12
-
13
- def get_length
14
- @data.bytesize
5
+ def initialize(data)
6
+ @data = data
15
7
  end
16
8
 
9
+ def write(buffer)
10
+ buffer.byte_encoding_start(@data.bytesize)
17
11
 
18
- def write( buffer)
19
- buffer.byte_encoding_start(get_length)
20
12
  @data.each_byte do |b|
21
13
  buffer.put(b, 8)
22
14
  end
@@ -1,43 +1,36 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RQRCodeCore
4
- ALPHANUMERIC = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',' ','$','%','*','+','-','.','/',':']
4
+ ALPHANUMERIC = [
5
+ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I",
6
+ "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", " ", "$",
7
+ "%", "*", "+", "-", ".", "/", ":"
8
+ ].freeze
5
9
 
6
10
  class QRAlphanumeric
7
- attr_reader :mode
8
-
9
- def initialize( data )
10
- @mode = QRMODE[:mode_alpha_numk]
11
-
12
- raise QRCodeArgumentError, "Not a alpha numeric uppercase string `#{data}`" unless QRAlphanumeric.valid_data?(data)
13
-
14
- @data = data;
15
- end
16
-
11
+ def initialize(data)
12
+ unless QRAlphanumeric.valid_data?(data)
13
+ raise QRCodeArgumentError, "Not a alpha numeric uppercase string `#{data}`"
14
+ end
17
15
 
18
- def get_length
19
- @data.size
16
+ @data = data
20
17
  end
21
18
 
22
- def self.valid_data? data
23
- data.each_char do |s|
24
- return false if ALPHANUMERIC.index(s).nil?
25
- end
26
- true
19
+ def self.valid_data?(data)
20
+ (data.chars - ALPHANUMERIC).empty?
27
21
  end
28
22
 
23
+ def write(buffer)
24
+ buffer.alphanumeric_encoding_start(@data.size)
29
25
 
30
- def write( buffer)
31
- buffer.alphanumeric_encoding_start(get_length)
32
-
33
- (@data.size).times do |i|
26
+ @data.size.times do |i|
34
27
  if i % 2 == 0
35
28
  if i == (@data.size - 1)
36
29
  value = ALPHANUMERIC.index(@data[i])
37
- buffer.put( value, 6 )
30
+ buffer.put(value, 6)
38
31
  else
39
- value = (ALPHANUMERIC.index(@data[i]) * 45) + ALPHANUMERIC.index(@data[i+1])
40
- buffer.put( value, 11 )
32
+ value = (ALPHANUMERIC.index(@data[i]) * 45) + ALPHANUMERIC.index(@data[i + 1])
33
+ buffer.put(value, 11)
41
34
  end
42
35
  end
43
36
  end
@@ -13,74 +13,64 @@ module RQRCodeCore
13
13
  @length = 0
14
14
  end
15
15
 
16
-
17
- def get( index )
16
+ def get(index)
18
17
  buf_index = (index / 8).floor
19
- (( QRUtil.rszf(@buffer[buf_index], 7 - index % 8)) & 1) == 1
18
+ ((QRUtil.rszf(@buffer[buf_index], 7 - index % 8)) & 1) == 1
20
19
  end
21
20
 
22
-
23
- def put( num, length )
24
- ( 0...length ).each do |i|
21
+ def put(num, length)
22
+ (0...length).each do |i|
25
23
  put_bit(((QRUtil.rszf(num, length - i - 1)) & 1) == 1)
26
24
  end
27
25
  end
28
26
 
29
-
30
27
  def get_length_in_bits
31
28
  @length
32
29
  end
33
30
 
34
-
35
- def put_bit( bit )
36
- buf_index = ( @length / 8 ).floor
31
+ def put_bit(bit)
32
+ buf_index = (@length / 8).floor
37
33
  if @buffer.size <= buf_index
38
34
  @buffer << 0
39
35
  end
40
36
 
41
37
  if bit
42
- @buffer[buf_index] |= (QRUtil.rszf(0x80, @length % 8))
38
+ @buffer[buf_index] |= QRUtil.rszf(0x80, @length % 8)
43
39
  end
44
40
 
45
41
  @length += 1
46
42
  end
47
43
 
48
44
  def byte_encoding_start(length)
49
-
50
- put( QRMODE[:mode_8bit_byte], 4 )
45
+ put(QRMODE[:mode_8bit_byte], 4)
51
46
  put(length, QRUtil.get_length_in_bits(QRMODE[:mode_8bit_byte], @version))
52
-
53
47
  end
54
48
 
55
49
  def alphanumeric_encoding_start(length)
56
-
57
- put( QRMODE[:mode_alpha_numk], 4 )
50
+ put(QRMODE[:mode_alpha_numk], 4)
58
51
  put(length, QRUtil.get_length_in_bits(QRMODE[:mode_alpha_numk], @version))
59
-
60
52
  end
61
53
 
62
54
  def numeric_encoding_start(length)
63
-
64
- put( QRMODE[:mode_number], 4 )
55
+ put(QRMODE[:mode_number], 4)
65
56
  put(length, QRUtil.get_length_in_bits(QRMODE[:mode_number], @version))
66
-
67
57
  end
68
58
 
69
59
  def pad_until(prefered_size)
70
60
  # Align on byte
71
61
  while get_length_in_bits % 8 != 0
72
- put_bit( false )
62
+ put_bit(false)
73
63
  end
74
64
 
75
65
  # Pad with padding code words
76
66
  while get_length_in_bits < prefered_size
77
- put( QRBitBuffer::PAD0, 8 )
78
- put( QRBitBuffer::PAD1, 8 ) if get_length_in_bits < prefered_size
67
+ put(PAD0, 8)
68
+ put(PAD1, 8) if get_length_in_bits < prefered_size
79
69
  end
80
70
  end
81
71
 
82
72
  def end_of_message(max_data_bits)
83
- put( 0, 4 ) unless get_length_in_bits+4 > max_data_bits
73
+ put(0, 4) unless get_length_in_bits + 4 > max_data_bits
84
74
  end
85
75
  end
86
76
  end