From cfb3c07a6e14bc24f5095c3c1a6af8b2d152a337 Mon Sep 17 00:00:00 2001 From: Jacob Elder Date: Fri, 18 Oct 2013 13:24:15 -0400 Subject: [PATCH 1/4] Add Lisbn.extract(string) helper --- lib/lisbn/lisbn.rb | 9 +++++++++ spec/lisbn_spec.rb | 15 +++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/lib/lisbn/lisbn.rb b/lib/lisbn/lisbn.rb index ca2fe29..f56d860 100644 --- a/lib/lisbn/lisbn.rb +++ b/lib/lisbn/lisbn.rb @@ -1,4 +1,13 @@ class Lisbn < String + + # Find an ISBN in a string of text + def self.extract(string) + string.scan(/([\dX-]{10,18})/i).flatten.map do |match| + isbn = new(match) + isbn.valid? ? isbn : nil + end.compact + end + # Returns a normalized ISBN form def isbn upcase.gsub(/[^0-9X]/, '') diff --git a/spec/lisbn_spec.rb b/spec/lisbn_spec.rb index 288e2c9..1d43e01 100644 --- a/spec/lisbn_spec.rb +++ b/spec/lisbn_spec.rb @@ -132,4 +132,19 @@ subject.split("7").should == ["9", "80000000002"] end end + + describe ".extract" do + it "should find two ISBN-13s in this sentence and return an array" do + isbns = Lisbn.extract("Hi, I'm looking for 9780000000002 or 978-601-7002-01-5.") + isbns.should be_kind_of(Array) + isbns.size.should == 2 + isbns[0].should == "9780000000002" + isbns[1].isbn.should == "9786017002015" + end + + it "should return an empty array" do + Lisbn.extract("nothing to see here").should == [] + end + end + end From 03570949faaa547bd3bb43857322ff50c20ad379 Mon Sep 17 00:00:00 2001 From: Jacob Elder Date: Fri, 18 Oct 2013 13:27:15 -0400 Subject: [PATCH 2/4] Bump nori to 2.3 (no changes needed) --- lisbn.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisbn.gemspec b/lisbn.gemspec index a27dd2d..804a66d 100644 --- a/lisbn.gemspec +++ b/lisbn.gemspec @@ -14,7 +14,7 @@ Gem::Specification.new do |gem| gem.require_paths = ["lib"] gem.version = "0.1.3" - gem.add_dependency "nori", "~> 2.0" + gem.add_dependency "nori", "~> 2.3" gem.add_dependency "nokogiri" gem.add_development_dependency "rspec" end From 5bd2217968a1c7cf391c8b03c698f32afe7535b8 Mon Sep 17 00:00:00 2001 From: Jacob Elder Date: Mon, 21 Oct 2013 11:57:55 -0400 Subject: [PATCH 3/4] Revert Nori change --- lisbn.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisbn.gemspec b/lisbn.gemspec index 804a66d..a27dd2d 100644 --- a/lisbn.gemspec +++ b/lisbn.gemspec @@ -14,7 +14,7 @@ Gem::Specification.new do |gem| gem.require_paths = ["lib"] gem.version = "0.1.3" - gem.add_dependency "nori", "~> 2.3" + gem.add_dependency "nori", "~> 2.0" gem.add_dependency "nokogiri" gem.add_development_dependency "rspec" end From 3b55e3e633702f8260c67b7dca6b8b064e357078 Mon Sep 17 00:00:00 2001 From: Jacob Elder Date: Mon, 21 Oct 2013 11:58:17 -0400 Subject: [PATCH 4/4] Refactor as instance method, special case of String#scan --- lib/lisbn/lisbn.rb | 16 ++++++++++++---- spec/lisbn_spec.rb | 19 ++++++++++++++----- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/lib/lisbn/lisbn.rb b/lib/lisbn/lisbn.rb index f56d860..bb2cee8 100644 --- a/lib/lisbn/lisbn.rb +++ b/lib/lisbn/lisbn.rb @@ -1,10 +1,18 @@ class Lisbn < String # Find an ISBN in a string of text - def self.extract(string) - string.scan(/([\dX-]{10,18})/i).flatten.map do |match| - isbn = new(match) - isbn.valid? ? isbn : nil + def scan_isbns + scan(/([\dX-]{10,})/i).flatten.map do |match| + isbn = self.class.new(match) + if isbn.valid? + if block_given? + yield isbn + else + isbn + end + else + nil + end end.compact end diff --git a/spec/lisbn_spec.rb b/spec/lisbn_spec.rb index 1d43e01..1d9fd6c 100644 --- a/spec/lisbn_spec.rb +++ b/spec/lisbn_spec.rb @@ -133,17 +133,26 @@ end end - describe ".extract" do + describe "#scan_isbns" do it "should find two ISBN-13s in this sentence and return an array" do - isbns = Lisbn.extract("Hi, I'm looking for 9780000000002 or 978-601-7002-01-5.") - isbns.should be_kind_of(Array) + isbns = Lisbn.new("Hi, I'm looking for 9780000000002 or 978-601-7002-01-5.").scan_isbns + isbns.should be_kind_of Array isbns.size.should == 2 isbns[0].should == "9780000000002" isbns[1].isbn.should == "9786017002015" end - it "should return an empty array" do - Lisbn.extract("nothing to see here").should == [] + it "should take a block" do + isbns = 0 + Lisbn.new("Hi, I'm looking for 9780000000002 or 978-601-7002-01-5.").scan_isbns do |isbn| + isbn.should be_kind_of Lisbn + isbns += 1 + end + isbns.should == 2 + end + + it "should return an empty array when no ISBNs are present" do + Lisbn.new("nothing to see here").scan_isbns.should == [] end end