qrencoder 1.0.0 → 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.
@@ -0,0 +1,54 @@
1
+ require 'png'
2
+
3
+ module QREncoder
4
+ # Stores and represents data, points, and/or pixels for a QRCode
5
+ class QRCode
6
+ ##
7
+ # Shortcut to save the QRcode as a PNG at +path+ using default options.
8
+ #
9
+ # For more control, or to specify non-default options, see QRCode#png
10
+ def save_png(path)
11
+ png.save(path)
12
+ end
13
+
14
+ ##
15
+ # Returns an instance of PNG, which can be saved to a file with PNG#save or
16
+ # converted to a blob for inline file transfer with PNG#to_blob. For more
17
+ # information, see http://seattlerb.rubyforge.org/png/
18
+ #
19
+ # Options:
20
+ #
21
+ # [:margin] A pixel value for the margin around each side of the code. This should be 4 or greater. (default: +4+)
22
+ # [:transparent] Background transparency. Can be true or false. (default: +false+)
23
+ #
24
+ def png(options={})
25
+ PNG.new(canvas(options))
26
+ end
27
+
28
+ ##
29
+ # Returns an instance of PNG::Canvas
30
+ #
31
+ # Takes an optional hash of options. See QRCode#png for details.
32
+ def canvas(options={})
33
+ @margin = options[:margin] || 4
34
+ background = options[:transparent] ? PNG::Color::Background : PNG::Color::White
35
+ png_width = width + (2 * @margin)
36
+
37
+ canvas = PNG::Canvas.new(png_width, png_width, background)
38
+
39
+ points.each do |p|
40
+ x, y = png_coordinates_for_point(p)
41
+ canvas[x,y] = PNG::Color::Black
42
+ end
43
+
44
+ canvas
45
+ end
46
+
47
+ private
48
+ def png_coordinates_for_point(point)
49
+ x = point[0] + @margin
50
+ y = width - 1 - point[1] + @margin
51
+ [x,y]
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,3 @@
1
+ module QREncoder
2
+ VERSION = '1.2.0'
3
+ end
@@ -0,0 +1,204 @@
1
+ require 'spec_helper'
2
+ require 'fixtures'
3
+
4
+ describe QREncoder::QRCode do
5
+
6
+ describe "#data" do
7
+ context "with default options and 'String'" do
8
+ subject { QREncoder.encode("String").data }
9
+ it { should be_kind_of(Array) }
10
+ it "generates the correct data array" do
11
+ subject.should == QREncoder::Fixtures::String1
12
+ end
13
+ end
14
+ context "with version 4 and 'String'" do
15
+ subject { QREncoder.encode("String", :version => 4).data }
16
+ it { should be_kind_of(Array) }
17
+ it "generates the correct data array" do
18
+ subject.should == QREncoder::Fixtures::String4
19
+ end
20
+ end
21
+ end
22
+
23
+ describe "#dup" do
24
+ subject { QREncoder.encode("something").dup }
25
+ its(:width) { should == 21 }
26
+ end
27
+
28
+ describe "#width" do
29
+ subject { QREncoder.encode("something").width }
30
+ it { should == 21 }
31
+ end
32
+
33
+ describe "#version" do
34
+
35
+ context "when not specified" do
36
+ subject { QREncoder.encode(string).version }
37
+ context "and string fits within version 1" do
38
+ let(:string) { "hello" }
39
+ it { should == 1 }
40
+ end
41
+ context "and string is too large for version 1" do
42
+ let(:string) { "hello" }
43
+ it { should == 1 }
44
+ end
45
+ end
46
+
47
+ context "when specified" do
48
+ subject { QREncoder.encode(string, :version => 2).version }
49
+ context "and string fits within specified version" do
50
+ let(:string) { "hello" }
51
+ it { should == 2 }
52
+ end
53
+ context "and string is too large for specified version" do
54
+ let(:string) { "Lorem ipsum dolor et al and then some more content" }
55
+ it { should == 3 }
56
+ end
57
+ end
58
+
59
+ end
60
+
61
+ describe "#width" do
62
+ subject { QREncoder.encode("test", :version => version).width }
63
+ context "with version 1" do
64
+ let(:version) { 1 }
65
+ it { should == 21 }
66
+ end
67
+ context "with version 2" do
68
+ let(:version) { 2 }
69
+ it { should == 25 }
70
+ end
71
+ context "with version 3" do
72
+ let(:version) { 3 }
73
+ it { should == 29 }
74
+ end
75
+ context "with version 4" do
76
+ let(:version) { 4 }
77
+ it { should == 33 }
78
+ end
79
+ context "with version 5" do
80
+ let(:version) { 5 }
81
+ it { should == 37 }
82
+ end
83
+ context "with version 6" do
84
+ let(:version) { 6 }
85
+ it { should == 41 }
86
+ end
87
+ context "with version 11" do
88
+ let(:version) { 11 }
89
+ it { should == 61 }
90
+ end
91
+ context "with version 15" do
92
+ let(:version) { 15 }
93
+ it { should == 77 }
94
+ end
95
+ context "with version 40 (the maximum)" do
96
+ let(:version) { 40 }
97
+ it { should == 177 }
98
+ end
99
+ end
100
+
101
+ describe "#height" do
102
+ subject { QREncoder.encode("test") }
103
+ it "should be the same as the width" do
104
+ subject.height.should == subject.width
105
+ end
106
+ end
107
+
108
+ describe "#pixels" do
109
+ let(:qrcode) { QREncoder.encode("hi") }
110
+ let(:pixels) do
111
+ arr = []
112
+ qrcode.data.each_slice(qrcode.width) do |a|
113
+ arr << a.map { |p| p & 0x1 }
114
+ end
115
+ arr
116
+ end
117
+
118
+ it "provides pixel data" do
119
+ qrcode.pixels.should == pixels
120
+ end
121
+ end
122
+
123
+ describe "#points" do
124
+ let(:qrcode) { QREncoder.encode("hi") }
125
+ let(:points) do
126
+ arr = []
127
+ y = 0
128
+ qrcode.data.each_slice(qrcode.width) do |r|
129
+ x = 0;
130
+ r.each do |p|
131
+ if (p & 0x1) == 1
132
+ arr << [x, y]
133
+ end
134
+ x += 1
135
+ end
136
+ y += 1
137
+ end
138
+ arr
139
+ end
140
+
141
+ it "provides point data" do
142
+ qrcode.points.should == points
143
+ end
144
+ end
145
+
146
+ describe "#canvas" do
147
+ let(:qrcode) { QREncoder.encode("hi") }
148
+
149
+ it "returns an instance of PNG::Canvas" do
150
+ qrcode.canvas.should be_kind_of(PNG::Canvas)
151
+ end
152
+
153
+ context "with no options specified" do
154
+ subject { qrcode.canvas }
155
+ its(:width) { should == qrcode.width + (4 * 2) }
156
+ specify "background should be white" do
157
+ subject.data.first.first.should == PNG::Color::White
158
+ end
159
+ end
160
+
161
+ context "with margin option of 8" do
162
+ subject { qrcode.canvas(:margin => 8) }
163
+ its(:width) { should == qrcode.width + (8 * 2) }
164
+ end
165
+
166
+ context "with transparent set to true" do
167
+ subject { qrcode.canvas(:transparent => true) }
168
+ specify "background should be transparent" do
169
+ subject.data.first.first.should == PNG::Color::Background
170
+ end
171
+ end
172
+ end
173
+
174
+ describe "#png" do
175
+ let(:qrcode) { QREncoder.encode("hi") }
176
+
177
+ it "returns an instance of PNG" do
178
+ qrcode.png.should be_kind_of(PNG)
179
+ end
180
+
181
+ it "sends options to #canvas" do
182
+ canvas = PNG::Canvas.new(1,1)
183
+ options = { :margin => 5, :transparent => true }
184
+ qrcode.should_receive(:canvas).with(options).and_return(canvas)
185
+ qrcode.png(options)
186
+ end
187
+ end
188
+
189
+ describe "#save_png" do
190
+ let(:qrcode) { QREncoder.encode("hi") }
191
+ let(:path) do
192
+ File.expand_path("../../tmp/test.png", __FILE__)
193
+ end
194
+
195
+ before { File.unlink(path) if File.file?(path) }
196
+
197
+ it "saves a png image to path specified" do
198
+ qrcode.save_png(path)
199
+ File.open(path) { true }
200
+ File.size(path).should_not be_zero
201
+ end
202
+ end
203
+
204
+ end
@@ -0,0 +1,69 @@
1
+ require 'spec_helper'
2
+
3
+ describe QREncoder do
4
+
5
+ describe ".encode" do
6
+ context "when passed a string" do
7
+ subject { QREncoder.encode("string") }
8
+
9
+ it { should be_a_kind_of(QREncoder::QRCode) }
10
+ end
11
+
12
+ context "when passed a string and version option" do
13
+ subject { QREncoder.encode("string", :version => 2) }
14
+
15
+ it { should be_a_kind_of(QREncoder::QRCode) }
16
+ it "encodes using the specified version" do
17
+ QREncoder::QRCode.should_receive(:new).with("string",
18
+ 2,
19
+ QREncoder::QR_ECLEVEL_L,
20
+ QREncoder::QR_MODE_8,
21
+ 1)
22
+ subject
23
+ end
24
+ end
25
+
26
+ context "when passed a string and correction option" do
27
+ subject { QREncoder.encode("string", :correction => :high) }
28
+
29
+ it { should be_a_kind_of(QREncoder::QRCode) }
30
+ it "encodes using the specified correction mode" do
31
+ QREncoder::QRCode.should_receive(:new).with("string",
32
+ 1,
33
+ QREncoder::QR_ECLEVEL_H,
34
+ QREncoder::QR_MODE_8,
35
+ 1)
36
+ subject
37
+ end
38
+ end
39
+
40
+ context "when passed a string and mode option" do
41
+ subject { QREncoder.encode("string", :mode => :alphanumeric) }
42
+
43
+ it { should be_a_kind_of(QREncoder::QRCode) }
44
+ it "encodes using the specified mode" do
45
+ QREncoder::QRCode.should_receive(:new).with("string",
46
+ 1,
47
+ QREncoder::QR_ECLEVEL_L,
48
+ QREncoder::QR_MODE_AN,
49
+ 1)
50
+ subject
51
+ end
52
+ end
53
+
54
+ context "when passed a string and case_sensitive option" do
55
+ subject { QREncoder.encode("string", :case_sensitive => false) }
56
+
57
+ it { should be_a_kind_of(QREncoder::QRCode) }
58
+ it "encodes using the specified case sensitivity" do
59
+ QREncoder::QRCode.should_receive(:new).with("string",
60
+ 1,
61
+ QREncoder::QR_ECLEVEL_L,
62
+ QREncoder::QR_MODE_8,
63
+ 0)
64
+ subject
65
+ end
66
+ end
67
+ end
68
+
69
+ end
@@ -0,0 +1,8 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'rspec'
4
+
5
+ root = File.expand_path('../..', __FILE__)
6
+ Dir["#{root}/spec/support/**/*.rb"].each {|f| require f}
7
+
8
+ Bundler.require
metadata CHANGED
@@ -1,78 +1,159 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.1
3
- specification_version: 1
4
2
  name: qrencoder
5
3
  version: !ruby/object:Gem::Version
6
- version: 1.0.0
7
- date: 2007-01-24 00:00:00 -05:00
8
- summary: A gem for creating 2-dimensional barcodes following the QR Code specification.
9
- require_paths:
10
- - lib
11
- email: harrisj@schizopolis.net
12
- homepage: http://nycrb.rubyforge.org/qrencoder
13
- rubyforge_project: nycrb
14
- description: The author was too lazy to write a description
15
- autorequire:
16
- default_executable:
17
- bindir: bin
18
- has_rdoc: true
19
- required_ruby_version: !ruby/object:Gem::Version::Requirement
20
- requirements:
21
- - - ">"
22
- - !ruby/object:Gem::Version
23
- version: 0.0.0
24
- version:
4
+ prerelease: false
5
+ segments:
6
+ - 1
7
+ - 2
8
+ - 0
9
+ version: 1.2.0
25
10
  platform: ruby
26
- signing_key:
27
- cert_chain:
28
- post_install_message:
29
11
  authors:
30
12
  - Jacob Harris
31
- files:
32
- - History.txt
33
- - Manifest.txt
34
- - README.txt
35
- - Rakefile
36
- - bin/qrencoder
37
- - lib/qrencoder.rb
38
- - test/test_qrencoder.rb
39
- test_files:
40
- - test/test_qrencoder.rb
41
- rdoc_options: []
42
-
43
- extra_rdoc_files: []
44
-
45
- executables:
46
- - qrencoder
47
- extensions: []
48
-
49
- requirements: []
13
+ - Joshua Davey
14
+ - Wesley Moore
15
+ autorequire:
16
+ bindir: bin
17
+ cert_chain: []
50
18
 
19
+ date: 2010-11-23 00:00:00 -06:00
20
+ default_executable:
51
21
  dependencies:
52
22
  - !ruby/object:Gem::Dependency
53
- name: RubyInline
54
- version_requirement:
55
- version_requirements: !ruby/object:Gem::Version::Requirement
23
+ name: rspec
24
+ prerelease: false
25
+ requirement: &id001 !ruby/object:Gem::Requirement
26
+ none: false
56
27
  requirements:
57
- - - ">="
28
+ - - ~>
58
29
  - !ruby/object:Gem::Version
59
- version: 3.6.2
60
- version:
30
+ segments:
31
+ - 2
32
+ - 4
33
+ - 0
34
+ version: 2.4.0
35
+ type: :development
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: rake-compiler
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ segments:
46
+ - 0
47
+ - 7
48
+ - 5
49
+ version: 0.7.5
50
+ type: :development
51
+ version_requirements: *id002
52
+ - !ruby/object:Gem::Dependency
53
+ name: sdoc
54
+ prerelease: false
55
+ requirement: &id003 !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ~>
59
+ - !ruby/object:Gem::Version
60
+ segments:
61
+ - 0
62
+ - 2
63
+ - 20
64
+ version: 0.2.20
65
+ type: :development
66
+ version_requirements: *id003
61
67
  - !ruby/object:Gem::Dependency
62
68
  name: png
63
- version_requirement:
64
- version_requirements: !ruby/object:Gem::Version::Requirement
69
+ prerelease: false
70
+ requirement: &id004 !ruby/object:Gem::Requirement
71
+ none: false
65
72
  requirements:
66
- - - ">="
73
+ - - ~>
67
74
  - !ruby/object:Gem::Version
68
- version: 1.0.0
69
- version:
75
+ segments:
76
+ - 1
77
+ - 2
78
+ - 0
79
+ version: 1.2.0
80
+ type: :runtime
81
+ version_requirements: *id004
70
82
  - !ruby/object:Gem::Dependency
71
- name: hoe
72
- version_requirement:
73
- version_requirements: !ruby/object:Gem::Version::Requirement
83
+ name: RubyInline
84
+ prerelease: false
85
+ requirement: &id005 !ruby/object:Gem::Requirement
86
+ none: false
74
87
  requirements:
75
88
  - - ">="
76
89
  - !ruby/object:Gem::Version
77
- version: 1.1.7
78
- version:
90
+ segments:
91
+ - 3
92
+ - 6
93
+ - 2
94
+ version: 3.6.2
95
+ type: :runtime
96
+ version_requirements: *id005
97
+ description: |-
98
+ This Gem is a wrapper around an useful open-source library for creating QR
99
+ Codes, a two-dimensional bar code format popular in Japan created by the Denso-Wave Corporation in 1994.
100
+ email:
101
+ - harrisj@schizopolis.net
102
+ - josh@joshuadavey.com
103
+ executables: []
104
+
105
+ extensions: []
106
+
107
+ extra_rdoc_files:
108
+ - README.rdoc
109
+ - ext/qrencoder_ext/qrencoder_ext.c
110
+ files:
111
+ - lib/qrencoder/qrcode.rb
112
+ - lib/qrencoder/qrencoder_ext.bundle
113
+ - lib/qrencoder/version.rb
114
+ - lib/qrencoder.rb
115
+ - ext/qrencoder_ext/extconf.rb
116
+ - ext/qrencoder_ext/qrencoder_ext.c
117
+ - History.txt
118
+ - README.rdoc
119
+ - spec/qrcode_spec.rb
120
+ - spec/qrencoder_spec.rb
121
+ - spec/spec_helper.rb
122
+ has_rdoc: true
123
+ homepage: http://nycrb.rubyforge.org/qrencoder
124
+ licenses: []
125
+
126
+ post_install_message:
127
+ rdoc_options: []
128
+
129
+ require_paths:
130
+ - lib
131
+ required_ruby_version: !ruby/object:Gem::Requirement
132
+ none: false
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ segments:
137
+ - 0
138
+ version: "0"
139
+ required_rubygems_version: !ruby/object:Gem::Requirement
140
+ none: false
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ segments:
145
+ - 1
146
+ - 3
147
+ - 6
148
+ version: 1.3.6
149
+ requirements: []
150
+
151
+ rubyforge_project:
152
+ rubygems_version: 1.3.7
153
+ signing_key:
154
+ specification_version: 3
155
+ summary: Wrapper around the C qrencode library for creating QR Codes
156
+ test_files:
157
+ - spec/qrcode_spec.rb
158
+ - spec/qrencoder_spec.rb
159
+ - spec/spec_helper.rb