zebra-epl 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
data/Guardfile CHANGED
@@ -1,7 +1,7 @@
1
1
  # A sample Guardfile
2
2
  # More info at https://github.com/guard/guard#readme
3
3
 
4
- guard 'rspec' do
4
+ guard 'rspec', cmd: "bundle exec rspec" do
5
5
  watch(%r{^spec/.+_spec\.rb$})
6
6
  watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7
7
  watch('spec/spec_helper.rb') { "spec" }
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Zebra::Epl
2
2
 
3
- TODO: Write a gem description
3
+ Zebra::Epl offers a Ruby DSL to design and print labels using the EPL programming language.
4
4
 
5
5
  ## Installation
6
6
 
@@ -18,7 +18,143 @@ Or install it yourself as:
18
18
 
19
19
  ## Usage
20
20
 
21
- TODO: Write usage instructions here
21
+ ### Building labels
22
+
23
+ You create new labels with an instance of the `Zebra::Epl::Label` class. It accepts the following options:
24
+
25
+ * `copies`: The number of copies to print. This option defaults to 1.
26
+ * `width`: The label's width, in dots.
27
+ * `length`: The label's length, is dots.
28
+ * `gap`: The gap between labels, in dots.
29
+ * `print_speed`: The print speed to be used. You can use values between 0 and 6. This option is required.
30
+ * `print_density`: The print density to be used. You can use values between 0 and 15. This option is required.
31
+
32
+ With a label, you can start adding elements to it:
33
+
34
+ label = Zebra::Epl::Label.new :print_density => 8, :print_speed => 3
35
+ text = Zebra::Epl::Text.new :data => "Hello, printer!", :position => [100, 100], :font => Zebra::Epl::Font::SIZE_2
36
+ label << text
37
+
38
+ You can add as many elements as you want.
39
+
40
+ ### Printing the labels
41
+
42
+ You need to have your printer visible to CUPS. Once your printer is configured and you know its name on CUPS, you can send the labels to the printer using a `Zebra::PrintJob` instance.
43
+
44
+ label = Zebra::Epl::Label.new(
45
+ :width => 200,
46
+ :length => 200,
47
+ :print_speed => 3,
48
+ :print_density => 6
49
+ )
50
+
51
+
52
+ barcode = Zebra::Epl::Barcode.new(
53
+ :data => "12345678",
54
+ :position => [50, 50],
55
+ :height => 50,
56
+ :print_human_readable_code => true,
57
+ :narrow_bar_width => 4,
58
+ :wide_bar_width => 8,
59
+ :type => Zebra::Epl::BarcodeType::CODE_128_AUTO
60
+ )
61
+
62
+ print_job = Zebra::PrintJob.new "your-printer-name-on-cups"
63
+
64
+ print_job.print label
65
+
66
+ This will persist the label contents to a tempfile (using Ruby's tempfile core library) and copy the file to the printer using either `lpr -P <your-printer-name-on-cups> -o raw <path-to-the-temp-file>` (if you're on Mac OSX) or `lp -d <your-printer-name-on-cups> -o raw <path-to-the-tempfile>` (if you're on Linux). All the tempfile creation/path resolution, as well as which command has to be used, are handled by the `PrintJob` class.
67
+
68
+ ### Printing QR codes
69
+
70
+ label = Zebra::Epl::Label.new(
71
+ :width=>350,
72
+ :length=>250,
73
+ :print_speed=>3,
74
+ :print_density=>6
75
+ )
76
+
77
+ qrcode = Zebra::Epl::Qrcode.new(
78
+ :data=>"www.github.com",
79
+ :position=>[50,10],
80
+ :scale_factor=>3,
81
+ :correction_level=>"H"
82
+ )
83
+
84
+ label << qrcode
85
+
86
+ print_job = Zebra::PrintJob.new "your-qr-printer-name-on-cups"
87
+
88
+ print_job.print label
89
+
90
+ ### Available elements
91
+
92
+ #### Text
93
+
94
+ You create text elements to print using instances of the `Zebra::Epl::Text` class. It accepts the following options:
95
+
96
+ * `position`: An array with the coordinates to place the text, in dots.
97
+ * `rotation`: The rotation for the text. More about the possible values below.
98
+ * `data`: The text to be printed.
99
+ * `v_multiplier`: The vertical multiplier to use.
100
+ * `h_multiplier`: The horizontal multipler to use.
101
+ * `print_mode`: The print mode. Can be normal ("N") or reverse ("R").
102
+ * `font`: The font size to use. You can use values between 1 and 5.
103
+
104
+ For the print modes, you can also use the constants:
105
+
106
+ * `Zebra::Epl::PrintMode::NORMAL`
107
+ * `Zebra::Epl::PrintMode::REVERSE`
108
+
109
+
110
+ #### Barcodes
111
+
112
+ You create barcode elements to print using instances of the `Zebra::Epl::Barcode` class. It accepts the following options:
113
+
114
+ * `position`: An array with the coordinates to place the text, in dots.
115
+ * `height`: The barcode's height, in dots.
116
+ * `rotation`: The rotation for the text. More about the possible values below.
117
+ * `data`: The text to be printed.
118
+ * `type`: The type os barcode to use. More on the available types below.
119
+ * `narrow_bar_width`: The barcode's narrow bar width, in dots.
120
+ * `wide_bar_width`: The barcode's wide bar width, in dots.
121
+ * `print_human_readable_code`: Can be `true` or `false`, indicates if the human readable contents should be printed below the barcode.
122
+
123
+ The available barcode types are:
124
+
125
+ * `Zebra::Epl::BarcodeType::CODE_39`
126
+ * `Zebra::Epl::BarcodeType::CODE_39_CHECK_DIGIT`
127
+ * `Zebra::Epl::BarcodeType::CODE_93`
128
+ * `Zebra::Epl::BarcodeType::CODE_128_AUTO`
129
+ * `Zebra::Epl::BarcodeType::CODE_128_A`
130
+ * `Zebra::Epl::BarcodeType::CODE_128_B`
131
+ * `Zebra::Epl::BarcodeType::CODE_128_C`
132
+ * `Zebra::Epl::BarcodeType::CODABAR`
133
+
134
+ #### QR Codes
135
+
136
+ You can create QR Codes elements to print using instances of the `Zebra::Epl::Qrcode` class. It accepts the following options:
137
+
138
+ * `position`: An array with the coordinates to place the QR code, in dots.
139
+ * `scale factor`: Crucial variable of the QR codes's size. Accepted values: 1-99.
140
+ * `error correction level`: Algorithm enables reading damaged QR codes. There are four error correction levels: L - 7% of codewords can be restored, M - 15% can be restored, Q - 25% can be restored, H - 30% can be restored.
141
+
142
+ #### Boxes
143
+
144
+ You can draw boxes in your labels:
145
+
146
+ box = Zebra::Epl::Box.new :position => [20, 20], :end_position => [100, 100], :line_thickness => 39
147
+
148
+ #### Elements rotation
149
+
150
+ All printable elements can be rotated on the label, using the `:rotation` option. The accepted rotation values are:
151
+
152
+ * `Zebra::Epl::Rotation::NO_ROTATION`: will not rotate the element.
153
+ * `Zebra::Epl::Rotation::DEGREES_90`: will rotate the element 90 degrees.
154
+ * `Zebra::Epl::Rotation::DEGREES_180`: will rotate the element 180 degrees.
155
+ * `Zebra::Epl::Rotation::DEGREES_270`: will rotate the element 270 degrees.
156
+
157
+
22
158
 
23
159
  ## Contributing
24
160
 
@@ -14,4 +14,4 @@ require "zebra/epl/text"
14
14
  require "zebra/epl/barcode"
15
15
  require "zebra/epl/barcode_type"
16
16
  require "zebra/print_job"
17
-
17
+ require "zebra/epl/qrcode"
@@ -0,0 +1,37 @@
1
+ require "zebra/epl/printable"
2
+
3
+ module Zebra
4
+ module Epl
5
+ class Qrcode
6
+ include Printable
7
+
8
+ class InvalidScaleFactorError < StandardError; end
9
+ class InvalidCorrectionLevelError < StandardError; end
10
+
11
+ attr_reader :scale_factor, :correction_level
12
+
13
+ def scale_factor=(value)
14
+ raise InvalidScaleFactorError unless (1..99).include?(value.to_i)
15
+ @scale_factor = value
16
+ end
17
+
18
+ def correction_level=(value)
19
+ raise InvalidCorrectionLevelError unless %w[L M Q H].include?(value.to_s)
20
+ @correction_level = value
21
+ end
22
+
23
+ def to_epl
24
+ check_attributes
25
+ ["b#{x}", y, "Q", "s#{scale_factor}", "e#{correction_level}", "\"#{data}\""].join(",")
26
+ end
27
+
28
+ private
29
+
30
+ def check_attributes
31
+ super
32
+ raise MissingAttributeError.new("the scale factor to be used is not given") unless @scale_factor
33
+ raise MissingAttributeError.new("the error correction level to be used is not given") unless @correction_level
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,5 +1,5 @@
1
1
  module Zebra
2
2
  module Epl
3
- VERSION = "0.0.7"
3
+ VERSION = "0.0.8"
4
4
  end
5
5
  end
@@ -0,0 +1,101 @@
1
+ require 'spec_helper'
2
+
3
+ describe Zebra::Epl::Qrcode do
4
+ it "can be initialized with the scale factor" do
5
+ qrcode = described_class.new :scale_factor => 3
6
+ expect(qrcode.scale_factor).to eq 3
7
+ end
8
+
9
+ it "can be initialized with the error correction level" do
10
+ qrcode = described_class.new :correction_level => "M"
11
+ expect(qrcode.correction_level).to eq "M"
12
+ end
13
+
14
+ describe "#scale_factor" do
15
+ it "raises an error if the scale factor is not within the range 1-99" do
16
+ expect{described_class.new :scale_factor=>100}.to raise_error(Zebra::Epl::Qrcode::InvalidScaleFactorError)
17
+ end
18
+ end
19
+
20
+ describe "#correction_level" do
21
+ it "raises an error if the error correction_level not in [LMQH]" do
22
+ expect{described_class.new :correction_level=>"A"}.to raise_error(Zebra::Epl::Qrcode::InvalidCorrectionLevelError)
23
+ end
24
+ end
25
+
26
+ describe "#to_epl" do
27
+ let(:valid_attributes) { {
28
+ :position => [50, 50],
29
+ :scale_factor => 3,
30
+ :correction_level => "M",
31
+ :data => "foobar"
32
+ }}
33
+ let(:qrcode) { described_class.new valid_attributes }
34
+ let(:tokens) { qrcode.to_epl.split(",") }
35
+
36
+ it "raises an error if the X position is not given" do
37
+ qrcode = described_class.new :position => [nil, 50], :data => "foobar"
38
+ expect {
39
+ qrcode.to_epl
40
+ }.to raise_error(Zebra::Epl::Printable::MissingAttributeError, "Can't print if the X value is not given")
41
+ end
42
+
43
+ it "raises an error if the Y position is not given" do
44
+ qrcode = described_class.new :position => [50, nil], :data => "foobar"
45
+ expect {
46
+ qrcode.to_epl
47
+ }.to raise_error(Zebra::Epl::Printable::MissingAttributeError, "Can't print if the Y value is not given")
48
+ end
49
+
50
+ it "raises an error if the data to be printed was not informed" do
51
+ qrcode.data = nil
52
+ expect {
53
+ qrcode.to_epl
54
+ }.to raise_error(Zebra::Epl::Printable::MissingAttributeError, "Can't print if the data to be printed is not given")
55
+ end
56
+
57
+ it "raises an error if the scale factor is not given" do
58
+ valid_attributes.delete :scale_factor
59
+
60
+ expect {
61
+ qrcode.to_epl
62
+ }.to raise_error(Zebra::Epl::Printable::MissingAttributeError, "Can't print if the scale factor to be used is not given")
63
+ end
64
+
65
+ it "raises an error if the correction level is not given" do
66
+ valid_attributes.delete :correction_level
67
+
68
+ expect {
69
+ qrcode.to_epl
70
+ }.to raise_error(Zebra::Epl::Printable::MissingAttributeError, "Can't print if the error correction level to be used is not given")
71
+ end
72
+
73
+ it "begins with the command 'b'" do
74
+ qrcode.to_epl.should =~ /\Ab/
75
+ end
76
+
77
+ it "contains the X position" do
78
+ tokens[0].match(/b(\d+)/)[1].should eq "50"
79
+ end
80
+
81
+ it "contains the Y position" do
82
+ tokens[1].should eq "50"
83
+ end
84
+
85
+ it "contains QR code type" do
86
+ tokens[2].should eq "Q"
87
+ end
88
+
89
+ it "contains the scale factor" do
90
+ tokens[3].should eq "s3"
91
+ end
92
+
93
+ it "contains the error correction level" do
94
+ tokens[4].should eq "eM"
95
+ end
96
+
97
+ it "contains the data to be printed in the qrcode" do
98
+ tokens[5].should eq "\"foobar\""
99
+ end
100
+ end
101
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zebra-epl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-03-14 00:00:00.000000000 Z
12
+ date: 2014-12-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: cups
@@ -133,6 +133,7 @@ files:
133
133
  - lib/zebra/epl/multipliers.rb
134
134
  - lib/zebra/epl/print_mode.rb
135
135
  - lib/zebra/epl/printable.rb
136
+ - lib/zebra/epl/qrcode.rb
136
137
  - lib/zebra/epl/rotation.rb
137
138
  - lib/zebra/epl/text.rb
138
139
  - lib/zebra/epl/version.rb
@@ -143,6 +144,7 @@ files:
143
144
  - spec/zebra/epl/character_set_spec.rb
144
145
  - spec/zebra/epl/epl_spec.rb
145
146
  - spec/zebra/epl/label_spec.rb
147
+ - spec/zebra/epl/qrcode_spec.rb
146
148
  - spec/zebra/epl/text_spec.rb
147
149
  - spec/zebra/print_job_spec.rb
148
150
  - zebra-epl.gemspec
@@ -161,7 +163,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
161
163
  segments:
162
164
  - 0
163
165
  version: '0'
164
- hash: 892169269347069094
166
+ hash: 196605653010155924
165
167
  required_rubygems_version: !ruby/object:Gem::Requirement
166
168
  none: false
167
169
  requirements:
@@ -170,7 +172,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
170
172
  segments:
171
173
  - 0
172
174
  version: '0'
173
- hash: 892169269347069094
175
+ hash: 196605653010155924
174
176
  requirements: []
175
177
  rubyforge_project:
176
178
  rubygems_version: 1.8.24
@@ -185,5 +187,6 @@ test_files:
185
187
  - spec/zebra/epl/character_set_spec.rb
186
188
  - spec/zebra/epl/epl_spec.rb
187
189
  - spec/zebra/epl/label_spec.rb
190
+ - spec/zebra/epl/qrcode_spec.rb
188
191
  - spec/zebra/epl/text_spec.rb
189
192
  - spec/zebra/print_job_spec.rb