Skip to content
This repository has been archived by the owner on Nov 11, 2023. It is now read-only.

Just a bit simpler code + specs #1

Merged
merged 1 commit into from Apr 17, 2012
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
18 changes: 7 additions & 11 deletions lib/epubinfo/parser.rb
Expand Up @@ -13,29 +13,25 @@ def metadata_document
end end


def drm_protected? def drm_protected?
load_epub if @zipfile.nil? @drm_protected ||= !!zip_file.find_entry('META-INF/rights.xml')
@drm_protected ||= !!@zipfile.find_entry('META-INF/rights.xml')
end end


private private


def load_epub def zip_file
@zipfile = Zip::ZipFile.open(@path) @zip_file ||= Zip::ZipFile.open(@path)
end end


def load_root_file def root_document
load_epub if @zipfile.nil? @root_document ||= Nokogiri::XML(zip_file.read('META-INF/container.xml'))
@root_document = Nokogiri::XML(@zipfile.read('META-INF/container.xml'))
end end


def metadata_path def metadata_path
load_root_file if @root_document.nil? root_document.css('container rootfiles rootfile:first-child').attribute('full-path').content
@root_document.css('container rootfiles rootfile:first-child').attribute('full-path').content
end end


def load_metadata_file def load_metadata_file
load_epub if @zipfile.nil? Nokogiri::XML(zip_file.read(metadata_path))
Nokogiri::XML(@zipfile.read(metadata_path))
end end
end end
end end
112 changes: 15 additions & 97 deletions spec/lib/epubinfo/parser_spec.rb
Expand Up @@ -2,110 +2,28 @@


describe EPUBInfo::Parser do describe EPUBInfo::Parser do
let(:epub_path) { File.expand_path('spec/support/binary/metamorphosis_epub2.epub') } let(:epub_path) { File.expand_path('spec/support/binary/metamorphosis_epub2.epub') }
let(:parser) { EPUBInfo::Parser.parse(epub_path) } subject { EPUBInfo::Parser.parse(epub_path) }


describe '#parse' do it 'should expose the path' do
it 'should assign path to @path' do subject.path.should == epub_path
parser # preload to avoid infinite loop
EPUBInfo::Parser.stub(:new) { parser }
EPUBInfo::Parser.parse(epub_path)
parser.path.should == epub_path
end
end end


describe '#load_epub' do it 'should expose the correct metadata document' do
it 'assigns zipfile to @zipfile' do subject.metadata_document.should be_kind_of Nokogiri::XML::Document
parser.send(:load_epub) id_node = subject.metadata_document.xpath('//dc:identifier').first
parser.instance_variable_get(:@zipfile).should be_kind_of Zip::ZipFile id_node.content.should == 'http://www.gutenberg.org/ebooks/5200'
end
end end


describe '#load_root_file' do it 'should return true for drm protected files' do
it 'should assign nokogiri document to @root_document' do drm_path = 'spec/support/binary/metamorphosis_epub2_drm.epub'
parser.send(:load_epub) parser = EPUBInfo::Parser.parse(drm_path)
parser.send(:load_root_file) parser.drm_protected?.should be_true
parser.instance_variable_get(:@root_document).should be_kind_of Nokogiri::XML::Document
end

it 'should call load_epub if @zipfile is nil' do
zipfile = Zip::ZipFile.new(epub_path)
zipfile.stub(:read) { '' }
parser.should_receive(:load_epub) { parser.instance_variable_set(:@zipfile, zipfile); nil }
parser.send(:load_root_file)
end
end

describe '#metadata_path' do
it 'should return path to metadata file' do
parser.send(:metadata_path).should == '5200/content.opf'
end

it 'should call load_root_file if @root_document is nil' do
xml_document = Nokogiri::XML::Document.new
xml_document.stub_chain(:css, :attribute, :content)
parser.should_receive(:load_root_file) { parser.instance_variable_set(:@root_document, xml_document); nil }
parser.send(:metadata_path)
end
end

describe '#metadata_document' do
it 'should call load_metadata_file and assign to @metadata_document' do
parser.should_receive(:load_metadata_file) { 'loaded' }
parser.metadata_document
parser.instance_variable_get(:@metadata_document).should == 'loaded'
end

it 'should not call load_metadata_file if @metadata_document is not nil' do
parser.instance_variable_set(:@metadata_document, 'loaded')
parser.should_not_receive(:load_metadata_file)
parser.metadata_document
end
end end


describe '#drm_protected?' do it 'should return false for non-drm protected files' do
it 'should call load_epub if nil' do non_drm_path = 'spec/support/binary/metamorphosis_epub2.epub'
zipfile_mock = mock(:find_entry => true) parser = EPUBInfo::Parser.parse(non_drm_path)
parser.should_receive(:load_epub) { parser.instance_variable_set(:@zipfile, zipfile_mock); nil } parser.drm_protected?.should be_false
parser.drm_protected?
parser.instance_variable_get(:@zipfile).should == zipfile_mock
end

context 'drm' do
let(:epub_path) { File.expand_path('spec/support/binary/metamorphosis_epub2_drm.epub') }

it 'should return true if rights.xml exists' do
parser = EPUBInfo::Parser.parse(epub_path)
parser.drm_protected?.should be_true
end
end

context 'no drm' do
let(:epub_path) { File.expand_path('spec/support/binary/metamorphosis_epub2.epub') }

it 'should return false if rights.xml does not exist' do
parser = EPUBInfo::Parser.parse(epub_path)
parser.drm_protected?.should be_false
end
end
end

describe '#load_metadata_file' do
it 'should return xml document' do
parser.send(:load_root_file)
parser.send(:load_metadata_file).should be_kind_of Nokogiri::XML::Document
end

it 'should call load_epub if @zipfile is nil' do
zipfile = Zip::ZipFile.new(epub_path)
zipfile.stub(:read) { '' }
parser.should_receive(:load_epub) { parser.instance_variable_set(:@zipfile, zipfile); nil }

xml_document = Nokogiri::XML::Document.new
xml_document.stub_chain(:css, :attribute, :content)
parser.should_receive(:load_root_file) { parser.instance_variable_set(:@root_document, xml_document); nil }

parser.send(:load_metadata_file)
end
end end
end end