From 531089a4ae35863eb4871c0c9c396aae015e6d99 Mon Sep 17 00:00:00 2001 From: Gabriel Fortuna Date: Thu, 10 Sep 2015 10:53:13 +0200 Subject: [PATCH 1/9] refactor: modify .validate interface to be consistent with .generate interface options --- lib/coupon_code.rb | 12 ++++++++---- test/coupon_code_test.rb | 26 ++++++++++++++++++-------- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/lib/coupon_code.rb b/lib/coupon_code.rb index 537fd1b..72dba15 100644 --- a/lib/coupon_code.rb +++ b/lib/coupon_code.rb @@ -19,16 +19,20 @@ def self.generate(options = { parts: PARTS }) parts.join('-') end - def self.validate(orig, num_parts = PARTS) - code = orig.upcase - code.gsub!(/[^0-9A-Z]+/, '') - parts = code.scan(/[0-9A-Z]{#{LENGTH}}/) + def self.validate(orig, options = { parts: @@parts }) + num_parts = options.delete(:parts) + code = orig.upcase.gsub(/[^0-9A-Z]+/, '') + parts = code.scan(/[0-9A-Z]{#{LENGTH}}/) + return if parts.length != num_parts + parts.each_with_index do |part, i| data = part[0...(LENGTH - 1)] check = part[-1] + return if check != checkdigit_alg_1(data, i + 1) end + parts.join('-') end diff --git a/test/coupon_code_test.rb b/test/coupon_code_test.rb index 67686c7..047a791 100644 --- a/test/coupon_code_test.rb +++ b/test/coupon_code_test.rb @@ -52,11 +52,11 @@ def generate(*args) end it 'should accept a short code with correct parts.' do - CouponCode.validate('1K7Q-CTFM', 2).wont_be_nil + CouponCode.validate('1K7Q-CTFM', parts: 2).wont_be_nil end it 'should reject a short code with wrong parts.' do - CouponCode.validate('CTFM-1K7Q', 2).must_be_nil + CouponCode.validate('CTFM-1K7Q', parts: 2).must_be_nil end it 'should fix and validate a lowercase code.' do @@ -76,14 +76,24 @@ def generate(*args) end it 'should valid code-pretest.' do - CouponCode.validate('1K7Q', 1).wont_be_nil - CouponCode.validate('1K7C', 1).must_be_nil + CouponCode.validate('1K7Q', parts: 1).wont_be_nil + CouponCode.validate('1K7C', parts: 1).must_be_nil - CouponCode.validate('1K7Q-CTFM', 2).wont_be_nil - CouponCode.validate('1K7Q-CTFW', 2).must_be_nil + CouponCode.validate('1K7Q-CTFM', parts: 2).wont_be_nil + CouponCode.validate('1K7Q-CTFW', parts: 2).must_be_nil - CouponCode.validate('1K7Q-CTFM-LMTC', 3).wont_be_nil - CouponCode.validate('1K7Q-CTFM-LMT1', 3).must_be_nil + CouponCode.validate('1K7Q-CTFM-LMTC', parts: 3).wont_be_nil + CouponCode.validate('1K7Q-CTFM-LMT1', parts: 3).must_be_nil + + CouponCode.validate('7YQH-1FU7-E1HX-0BG9', parts: 4).wont_be_nil + CouponCode.validate('7YQH-1FU7-E1HX-0BGP', parts: 4).must_be_nil + + CouponCode.validate('YENH-UPJK-PTE0-20U6-QYME', parts: 5).wont_be_nil + CouponCode.validate('YENH-UPJK-PTE0-20U6-QYMT', parts: 5).must_be_nil + + CouponCode.validate('YENH-UPJK-PTE0-20U6-QYME-RBK1', parts: 6).wont_be_nil + CouponCode.validate('YENH-UPJK-PTE0-20U6-QYME-RBK2', parts: 6).must_be_nil + end CouponCode.validate('7YQH-1FU7-E1HX-0BG9', 4).wont_be_nil CouponCode.validate('7YQH-1FU7-E1HX-0BGP', 4).must_be_nil From f68369a260320d433e7d549ec9dc1c633f3f79ad Mon Sep 17 00:00:00 2001 From: Gabriel Fortuna Date: Thu, 10 Sep 2015 10:53:57 +0200 Subject: [PATCH 2/9] feature: allow parts length default to be changed --- lib/coupon_code.rb | 12 ++++++++---- test/coupon_code_test.rb | 12 ++++++------ 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/lib/coupon_code.rb b/lib/coupon_code.rb index 72dba15..4905582 100644 --- a/lib/coupon_code.rb +++ b/lib/coupon_code.rb @@ -3,11 +3,11 @@ require 'digest/sha1' module CouponCode - SYMBOL = '0123456789ABCDEFGHJKLMNPQRTUVWXY' - PARTS = 3 - LENGTH = 4 + SYMBOL = '0123456789ABCDEFGHJKLMNPQRTUVWXY' + LENGTH = 4 + @@parts = 3 - def self.generate(options = { parts: PARTS }) + def self.generate(options = { parts: @@parts }) num_parts = options.delete(:parts) parts = [] (1..num_parts).each do |i| @@ -36,6 +36,10 @@ def self.validate(orig, options = { parts: @@parts }) parts.join('-') end + def self.default_parts(parts) + @@parts = parts + end + def self.checkdigit_alg_1(orig, check) orig.split('').each_with_index do |c, _| k = SYMBOL.index(c) diff --git a/test/coupon_code_test.rb b/test/coupon_code_test.rb index 047a791..8f4caf4 100644 --- a/test/coupon_code_test.rb +++ b/test/coupon_code_test.rb @@ -95,14 +95,14 @@ def generate(*args) CouponCode.validate('YENH-UPJK-PTE0-20U6-QYME-RBK2', parts: 6).must_be_nil end - CouponCode.validate('7YQH-1FU7-E1HX-0BG9', 4).wont_be_nil - CouponCode.validate('7YQH-1FU7-E1HX-0BGP', 4).must_be_nil + it "should allow a default part length to be set" do + CouponCode.default_parts(5) - CouponCode.validate('YENH-UPJK-PTE0-20U6-QYME', 5).wont_be_nil - CouponCode.validate('YENH-UPJK-PTE0-20U6-QYMT', 5).must_be_nil + code = CouponCode.generate + code.split("-").length.must_equal 5 + CouponCode.validate(code).must_equal code - CouponCode.validate('YENH-UPJK-PTE0-20U6-QYME-RBK1', 6).wont_be_nil - CouponCode.validate('YENH-UPJK-PTE0-20U6-QYME-RBK2', 6).must_be_nil + CouponCode.default_parts(3) # Set it back for the rest of the tests end end end From f230e1cbbc001faaa1ec8badafd8cb0809982a3a Mon Sep 17 00:00:00 2001 From: Gabriel Fortuna Date: Thu, 10 Sep 2015 10:54:38 +0200 Subject: [PATCH 3/9] doc: update README to document new behaviour and features --- README.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8503078..2514148 100644 --- a/README.md +++ b/README.md @@ -42,8 +42,19 @@ Or install it yourself as: You can change the number of parts of the generated code by passing an option hash value like: - >> CouponCode.generate(parts: 4) + >> code = CouponCode.generate(parts: 4) => "1K7Q-CTFM-LMTC-DLGP" + >> CouponeCode.validate(code, parts: 4) + => "1K7Q-CTFM-LMTC-DLGP" + +You can also set the default number of parts you are working with so that you don't have to continually send the parts value as an option: + + >> CouponCode.default_parts(5) + => 5 + >> code = CouponCode.generate + => "CNYF-K4AH-L5PF-0RU7-5L0Q" + >> CouponCode.validate(code) + => "CNYF-K4AH-L5PF-0RU7-5L0Q" ## Testing @@ -74,4 +85,4 @@ MIT. See [LICENSE][license] for more details. [node-couponcode]: https://github.com/chilts/node-coupon-code [license]: https://github.com/baxang/coupon-code/blob/master/LICENSE.txt [README-kr]: https://github.com/baxang/coupon-code/blob/master/README-ko.md -[rubygems]: https://rubygems.org/gems/coupon_code \ No newline at end of file +[rubygems]: https://rubygems.org/gems/coupon_code From 5f670828d5dccb0829fd69df6fff6d885a69d46d Mon Sep 17 00:00:00 2001 From: Gabriel Fortuna Date: Thu, 10 Sep 2015 10:54:59 +0200 Subject: [PATCH 4/9] chore: bump minor version number --- lib/coupon_code/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/coupon_code/version.rb b/lib/coupon_code/version.rb index c6e6668..8cd0958 100644 --- a/lib/coupon_code/version.rb +++ b/lib/coupon_code/version.rb @@ -1,3 +1,3 @@ module CouponCode - VERSION = '0.0.1' + VERSION = '0.1.0' end From 8adf2cf2362d001a877784a960285963613d26a4 Mon Sep 17 00:00:00 2001 From: Gabriel Fortuna Date: Thu, 10 Sep 2015 11:02:01 +0200 Subject: [PATCH 5/9] style: change quotes to double quotes to appease HoundCI --- lib/coupon_code/version.rb | 2 +- test/coupon_code_test.rb | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/coupon_code/version.rb b/lib/coupon_code/version.rb index 8cd0958..e3ce04b 100644 --- a/lib/coupon_code/version.rb +++ b/lib/coupon_code/version.rb @@ -1,3 +1,3 @@ module CouponCode - VERSION = '0.1.0' + VERSION = "0.1.0" end diff --git a/test/coupon_code_test.rb b/test/coupon_code_test.rb index 8f4caf4..220f798 100644 --- a/test/coupon_code_test.rb +++ b/test/coupon_code_test.rb @@ -76,23 +76,23 @@ def generate(*args) end it 'should valid code-pretest.' do - CouponCode.validate('1K7Q', parts: 1).wont_be_nil - CouponCode.validate('1K7C', parts: 1).must_be_nil + CouponCode.validate("1K7Q", parts: 1).wont_be_nil + CouponCode.validate("1K7C", parts: 1).must_be_nil - CouponCode.validate('1K7Q-CTFM', parts: 2).wont_be_nil + CouponCode.validate("1K7Q-CTFM", parts: 2).wont_be_nil CouponCode.validate('1K7Q-CTFW', parts: 2).must_be_nil - CouponCode.validate('1K7Q-CTFM-LMTC', parts: 3).wont_be_nil - CouponCode.validate('1K7Q-CTFM-LMT1', parts: 3).must_be_nil + CouponCode.validate("1K7Q-CTFM-LMTC", parts: 3).wont_be_nil + CouponCode.validate("1K7Q-CTFM-LMT1", parts: 3).must_be_nil - CouponCode.validate('7YQH-1FU7-E1HX-0BG9', parts: 4).wont_be_nil - CouponCode.validate('7YQH-1FU7-E1HX-0BGP', parts: 4).must_be_nil + CouponCode.validate("7YQH-1FU7-E1HX-0BG9", parts: 4).wont_be_nil + CouponCode.validate("7YQH-1FU7-E1HX-0BGP", parts: 4).must_be_nil - CouponCode.validate('YENH-UPJK-PTE0-20U6-QYME', parts: 5).wont_be_nil - CouponCode.validate('YENH-UPJK-PTE0-20U6-QYMT', parts: 5).must_be_nil + CouponCode.validate("YENH-UPJK-PTE0-20U6-QYME", parts: 5).wont_be_nil + CouponCode.validate("YENH-UPJK-PTE0-20U6-QYMT", parts: 5).must_be_nil - CouponCode.validate('YENH-UPJK-PTE0-20U6-QYME-RBK1', parts: 6).wont_be_nil - CouponCode.validate('YENH-UPJK-PTE0-20U6-QYME-RBK2', parts: 6).must_be_nil + CouponCode.validate("YENH-UPJK-PTE0-20U6-QYME-RBK1", parts: 6).wont_be_nil + CouponCode.validate("YENH-UPJK-PTE0-20U6-QYME-RBK2", parts: 6).must_be_nil end it "should allow a default part length to be set" do From 9e18c76095421fa149187b670a549a37193e75a8 Mon Sep 17 00:00:00 2001 From: Gabriel Fortuna Date: Thu, 10 Sep 2015 11:05:41 +0200 Subject: [PATCH 6/9] style: more quote changes for HoundCI --- lib/coupon_code.rb | 4 ++-- test/coupon_code_test.rb | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/coupon_code.rb b/lib/coupon_code.rb index 4905582..05e54e8 100644 --- a/lib/coupon_code.rb +++ b/lib/coupon_code.rb @@ -3,7 +3,7 @@ require 'digest/sha1' module CouponCode - SYMBOL = '0123456789ABCDEFGHJKLMNPQRTUVWXY' + SYMBOL = "0123456789ABCDEFGHJKLMNPQRTUVWXY" LENGTH = 4 @@parts = 3 @@ -21,7 +21,7 @@ def self.generate(options = { parts: @@parts }) def self.validate(orig, options = { parts: @@parts }) num_parts = options.delete(:parts) - code = orig.upcase.gsub(/[^0-9A-Z]+/, '') + code = orig.upcase.gsub(/[^0-9A-Z]+/, "") parts = code.scan(/[0-9A-Z]{#{LENGTH}}/) return if parts.length != num_parts diff --git a/test/coupon_code_test.rb b/test/coupon_code_test.rb index 220f798..0cb94d0 100644 --- a/test/coupon_code_test.rb +++ b/test/coupon_code_test.rb @@ -40,23 +40,23 @@ def generate(*args) end it 'should fail to validate invalid code.' do - CouponCode.validate('').must_equal(nil) + CouponCode.validate("").must_equal(nil) end it 'should accept a valid code.' do - CouponCode.validate('1K7Q-CTFM-LMTC').wont_be_nil + CouponCode.validate("1K7Q-CTFM-LMTC").wont_be_nil end it 'should reject a short code.' do - CouponCode.validate('1K7Q-CTFM').must_be_nil + CouponCode.validate("1K7Q-CTFM").must_be_nil end it 'should accept a short code with correct parts.' do - CouponCode.validate('1K7Q-CTFM', parts: 2).wont_be_nil + CouponCode.validate("1K7Q-CTFM", parts: 2).wont_be_nil end it 'should reject a short code with wrong parts.' do - CouponCode.validate('CTFM-1K7Q', parts: 2).must_be_nil + CouponCode.validate("CTFM-1K7Q", parts: 2).must_be_nil end it 'should fix and validate a lowercase code.' do From e1adfa58dabbe31822deee7eb05728a008268d84 Mon Sep 17 00:00:00 2001 From: Gabriel Fortuna Date: Thu, 10 Sep 2015 11:20:19 +0200 Subject: [PATCH 7/9] refactor: simplify .generate a little --- lib/coupon_code.rb | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/coupon_code.rb b/lib/coupon_code.rb index 05e54e8..257d8b3 100644 --- a/lib/coupon_code.rb +++ b/lib/coupon_code.rb @@ -8,15 +8,13 @@ module CouponCode @@parts = 3 def self.generate(options = { parts: @@parts }) - num_parts = options.delete(:parts) - parts = [] - (1..num_parts).each do |i| + (1..options[:parts]).map do |i| part = '' (1...LENGTH).each { part << random_symbol } part << checkdigit_alg_1(part, i) - parts << part - end - parts.join('-') + + part + end.join("-") end def self.validate(orig, options = { parts: @@parts }) From 1db32a9034eea1e34529146ae073c0b6bd01a0b5 Mon Sep 17 00:00:00 2001 From: Gabriel Fortuna Date: Thu, 10 Sep 2015 11:21:35 +0200 Subject: [PATCH 8/9] style: more HoundCI quote changes --- lib/coupon_code.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/coupon_code.rb b/lib/coupon_code.rb index 257d8b3..3d53d2f 100644 --- a/lib/coupon_code.rb +++ b/lib/coupon_code.rb @@ -9,7 +9,7 @@ module CouponCode def self.generate(options = { parts: @@parts }) (1..options[:parts]).map do |i| - part = '' + part = "" (1...LENGTH).each { part << random_symbol } part << checkdigit_alg_1(part, i) @@ -31,7 +31,7 @@ def self.validate(orig, options = { parts: @@parts }) return if check != checkdigit_alg_1(data, i + 1) end - parts.join('-') + parts.join("-") end def self.default_parts(parts) From c7736e554c4ddb6881e17b8996a0cdfa08c23c36 Mon Sep 17 00:00:00 2001 From: Gabriel Fortuna Date: Thu, 10 Sep 2015 11:21:56 +0200 Subject: [PATCH 9/9] refactor: make methods that are only used internally into private ones --- lib/coupon_code.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/coupon_code.rb b/lib/coupon_code.rb index 3d53d2f..409c427 100644 --- a/lib/coupon_code.rb +++ b/lib/coupon_code.rb @@ -38,6 +38,8 @@ def self.default_parts(parts) @@parts = parts end + private + def self.checkdigit_alg_1(orig, check) orig.split('').each_with_index do |c, _| k = SYMBOL.index(c)