dozuki 0.3.0 → 0.4.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.
- data/README.markdown +1 -1
- data/features/boolean_accessor.feature +43 -0
- data/features/each_accessor.feature +9 -0
- data/features/steps/collection_steps.rb +7 -0
- data/lib/dozuki/node.rb +5 -0
- data/lib/dozuki/node_collection.rb +14 -4
- data/lib/dozuki/parsers.rb +8 -0
- data/lib/dozuki/version.rb +1 -1
- data/spec/dozuki/node_collection_spec.rb +20 -1
- data/spec/dozuki/node_spec.rb +35 -0
- data/spec/dozuki/parsers_spec.rb +33 -0
- metadata +9 -13
    
        data/README.markdown
    CHANGED
    
    | @@ -2,7 +2,7 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            A Nokogiri wrapper that simplifies commonly occurring tasks.
         | 
| 4 4 |  | 
| 5 | 
            -
            [](http://travis-ci.org/ | 
| 5 | 
            +
            [](http://travis-ci.org/jamesalmond/dozuki)
         | 
| 6 6 |  | 
| 7 7 | 
             
            ## What does it do?
         | 
| 8 8 |  | 
| @@ -0,0 +1,43 @@ | |
| 1 | 
            +
            Feature: Getting booleans from the document
         | 
| 2 | 
            +
              In order to provide simpler way of getting booleans from a node
         | 
| 3 | 
            +
              As a traverser
         | 
| 4 | 
            +
              I want to access nodes using the boolean method and an xpath
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              Background:
         | 
| 7 | 
            +
                Given I have parsed the XML:
         | 
| 8 | 
            +
                  """
         | 
| 9 | 
            +
                    <root>
         | 
| 10 | 
            +
                      <name>St. George's Arms</name>
         | 
| 11 | 
            +
                      <open>1</open>
         | 
| 12 | 
            +
                      <licensed>
         | 
| 13 | 
            +
                        0
         | 
| 14 | 
            +
                      </licensed>
         | 
| 15 | 
            +
                      <clean>
         | 
| 16 | 
            +
                        true
         | 
| 17 | 
            +
                      </clean>
         | 
| 18 | 
            +
                      <worth_visiting>false</worth_visiting>
         | 
| 19 | 
            +
                    </root>
         | 
| 20 | 
            +
                  """
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              Scenario: getting the boolean of a 1 single node
         | 
| 23 | 
            +
                When I call "boolean('/root/open')" on the document
         | 
| 24 | 
            +
                Then the result should be true
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              Scenario: getting the boolean of a 0 single node with whitespace
         | 
| 27 | 
            +
                When I call "boolean('/root/licensed')" on the document
         | 
| 28 | 
            +
                Then the result should be false
         | 
| 29 | 
            +
             | 
| 30 | 
            +
              Scenario: getting the boolean of a true single node with whitespace
         | 
| 31 | 
            +
                When I call "boolean('/root/clean')" on the document
         | 
| 32 | 
            +
                Then the result should be true
         | 
| 33 | 
            +
             | 
| 34 | 
            +
              Scenario: getting the boolean of a false single node with whitespace
         | 
| 35 | 
            +
                When I call "boolean('/root/worth_visiting')" on the document
         | 
| 36 | 
            +
                Then the result should be false
         | 
| 37 | 
            +
             | 
| 38 | 
            +
              Scenario: getting a non-existent node
         | 
| 39 | 
            +
                When I call "float('//something/missing')" on the document
         | 
| 40 | 
            +
                Then it should raise a "NotFound" error
         | 
| 41 | 
            +
                And the error should have the xpath "//something/missing"
         | 
| 42 | 
            +
                And the error should have a stored node
         | 
| 43 | 
            +
             | 
| @@ -24,6 +24,10 @@ Feature: Iterating through nodes | |
| 24 24 | 
             
                        <day>2011-05-03</day>
         | 
| 25 25 | 
             
                        <day>2013-07-09</day>
         | 
| 26 26 | 
             
                      </available>
         | 
| 27 | 
            +
                      <open>
         | 
| 28 | 
            +
                        <day>true</day>
         | 
| 29 | 
            +
                        <day>0</day>
         | 
| 30 | 
            +
                      </open>
         | 
| 27 31 | 
             
                    </root>
         | 
| 28 32 | 
             
                  """
         | 
| 29 33 |  | 
| @@ -51,3 +55,8 @@ Feature: Iterating through nodes | |
| 51 55 | 
             
                When I call "each('/root/available/day').as_date" on the document and collect the results
         | 
| 52 56 | 
             
                Then the results should contain 03/05/2011
         | 
| 53 57 | 
             
                And the results should contain 09/07/2013
         | 
| 58 | 
            +
             | 
| 59 | 
            +
              Scenario: using each to traverse a document and getting the boolean elements
         | 
| 60 | 
            +
                When I call "each('/root/open/day').as_boolean" on the document and collect the results
         | 
| 61 | 
            +
                Then the results should contain true
         | 
| 62 | 
            +
                And the results should contain false
         | 
| @@ -13,4 +13,11 @@ end | |
| 13 13 | 
             
            Then /^the results should contain (\d+)\/(\d+)\/(\d+)$/ do |day, month, year|
         | 
| 14 14 | 
             
              @results.should include(Date.civil(year.to_i, month.to_i, day.to_i))
         | 
| 15 15 | 
             
            end
         | 
| 16 | 
            +
            Then /^the results should contain true$/ do
         | 
| 17 | 
            +
              @results.should include true
         | 
| 18 | 
            +
            end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            Then /^the results should contain false$/ do
         | 
| 21 | 
            +
              @results.should include false
         | 
| 22 | 
            +
            end
         | 
| 16 23 |  | 
    
        data/lib/dozuki/node.rb
    CHANGED
    
    | @@ -31,10 +31,15 @@ module Dozuki | |
| 31 31 | 
             
                def float(xpath)
         | 
| 32 32 | 
             
                  Parsers::Float.parse(get_first_node(xpath))
         | 
| 33 33 | 
             
                end
         | 
| 34 | 
            +
             | 
| 34 35 | 
             
                def date(xpath)
         | 
| 35 36 | 
             
                  Parsers::Date.parse(get_first_node(xpath))
         | 
| 36 37 | 
             
                end
         | 
| 37 38 |  | 
| 39 | 
            +
                def boolean(xpath)
         | 
| 40 | 
            +
                  Parsers::Boolean.parse(get_first_node(xpath))
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
             | 
| 38 43 | 
             
                def get(xpath)
         | 
| 39 44 | 
             
                  node = Node.new(get_first_node(xpath))
         | 
| 40 45 | 
             
                  yield node if block_given?
         | 
| @@ -11,18 +11,28 @@ module Dozuki | |
| 11 11 | 
             
                end
         | 
| 12 12 |  | 
| 13 13 | 
             
                def as_string(&blk)
         | 
| 14 | 
            -
                   | 
| 14 | 
            +
                  each_as(Parsers::String, &blk)
         | 
| 15 15 | 
             
                end
         | 
| 16 16 |  | 
| 17 17 | 
             
                def as_int(&blk)
         | 
| 18 | 
            -
                   | 
| 18 | 
            +
                  each_as(Parsers::Integer, &blk)
         | 
| 19 19 | 
             
                end
         | 
| 20 20 |  | 
| 21 21 | 
             
                def as_float(&blk)
         | 
| 22 | 
            -
                   | 
| 22 | 
            +
                  each_as(Parsers::Float, &blk)
         | 
| 23 23 | 
             
                end
         | 
| 24 | 
            +
             | 
| 24 25 | 
             
                def as_date(&blk)
         | 
| 25 | 
            -
                   | 
| 26 | 
            +
                  each_as(Parsers::Date, &blk)
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                def as_boolean(&blk)
         | 
| 30 | 
            +
                  each_as(Parsers::Boolean, &blk)
         | 
| 26 31 | 
             
                end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                private
         | 
| 34 | 
            +
                  def each_as(parser, &blk)
         | 
| 35 | 
            +
                    collection.each{|item| blk.call(parser.parse(item))}
         | 
| 36 | 
            +
                  end
         | 
| 27 37 | 
             
              end
         | 
| 28 38 | 
             
            end
         | 
    
        data/lib/dozuki/parsers.rb
    CHANGED
    
    
    
        data/lib/dozuki/version.rb
    CHANGED
    
    
| @@ -85,7 +85,7 @@ module Dozuki | |
| 85 85 | 
             
                    @block_called_with.should == a_float
         | 
| 86 86 | 
             
                  end
         | 
| 87 87 | 
             
                end
         | 
| 88 | 
            -
             | 
| 88 | 
            +
             | 
| 89 89 | 
             
                describe "as_date" do
         | 
| 90 90 |  | 
| 91 91 | 
             
                  let(:a_date){Date.civil(2012, 2,5)}
         | 
| @@ -105,6 +105,25 @@ module Dozuki | |
| 105 105 | 
             
                    @block_called_with.should == a_date
         | 
| 106 106 | 
             
                  end
         | 
| 107 107 | 
             
                end
         | 
| 108 | 
            +
                describe "as_boolean" do
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                  let(:a_boolean){true}
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                  before(:each) do
         | 
| 113 | 
            +
                    Dozuki::Parsers::Boolean.stub(:parse).and_return(a_boolean)
         | 
| 114 | 
            +
                  end
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                  subject{node_collection.as_boolean{|arg| @block_called_with = arg}}
         | 
| 117 | 
            +
             | 
| 118 | 
            +
                  it "should parse the node to a boolean"  do
         | 
| 119 | 
            +
                    Dozuki::Parsers::Boolean.should_receive(:parse).with(collection_item).and_return(a_boolean)
         | 
| 120 | 
            +
                    subject
         | 
| 121 | 
            +
                  end
         | 
| 122 | 
            +
                  it "should call the block with the boolean" do
         | 
| 123 | 
            +
                    subject
         | 
| 124 | 
            +
                    @block_called_with.should == a_boolean
         | 
| 125 | 
            +
                  end
         | 
| 126 | 
            +
                end
         | 
| 108 127 |  | 
| 109 128 | 
             
              end
         | 
| 110 129 | 
             
            end
         | 
    
        data/spec/dozuki/node_spec.rb
    CHANGED
    
    | @@ -226,6 +226,41 @@ module Dozuki | |
| 226 226 | 
             
                  end
         | 
| 227 227 | 
             
                end
         | 
| 228 228 |  | 
| 229 | 
            +
                describe "boolean" do
         | 
| 230 | 
            +
                  let(:nokogiri_node)   { mock("nokogiri_node") }
         | 
| 231 | 
            +
                  let(:xpath)           { "/some/xpath" }
         | 
| 232 | 
            +
                  let(:node)            { Node.new(nokogiri_node) }
         | 
| 233 | 
            +
                  let(:boolean_node)    { mock "some node" }
         | 
| 234 | 
            +
                  let(:parsed)   { mock "parsed result" }
         | 
| 235 | 
            +
             | 
| 236 | 
            +
                  before(:each) do
         | 
| 237 | 
            +
                    nokogiri_node.stub(:xpath).and_return([boolean_node])
         | 
| 238 | 
            +
                    Dozuki::Parsers::Boolean.stub(:parse).and_return(parsed)
         | 
| 239 | 
            +
                  end
         | 
| 240 | 
            +
             | 
| 241 | 
            +
                  subject{ node.boolean(xpath) }
         | 
| 242 | 
            +
             | 
| 243 | 
            +
                  it "should get the collection from the nokogiri node" do
         | 
| 244 | 
            +
                    nokogiri_node.should_receive(:xpath).with(xpath).and_return([boolean_node])
         | 
| 245 | 
            +
                    subject
         | 
| 246 | 
            +
                  end
         | 
| 247 | 
            +
                  it "should parse the node to a date" do
         | 
| 248 | 
            +
                    Dozuki::Parsers::Boolean.should_receive(:parse).with(boolean_node).and_return(parsed)
         | 
| 249 | 
            +
                    subject
         | 
| 250 | 
            +
                  end
         | 
| 251 | 
            +
                  it "should return the parsed result" do
         | 
| 252 | 
            +
                    subject.should == parsed
         | 
| 253 | 
            +
                  end
         | 
| 254 | 
            +
                  context "where the xpath returns no node" do
         | 
| 255 | 
            +
                    before(:each) do
         | 
| 256 | 
            +
                      nokogiri_node.should_receive(:xpath).and_return([])
         | 
| 257 | 
            +
                    end
         | 
| 258 | 
            +
                    it "should raise a NotFound error" do
         | 
| 259 | 
            +
                      expect{subject}.to raise_error(Dozuki::NotFound)
         | 
| 260 | 
            +
                    end
         | 
| 261 | 
            +
                  end
         | 
| 262 | 
            +
                end
         | 
| 263 | 
            +
             | 
| 229 264 | 
             
                describe "get" do
         | 
| 230 265 | 
             
                  let(:nokogiri_node)   { mock("nokogiri_node") }
         | 
| 231 266 | 
             
                  let(:xpath)           { "/some/xpath" }
         | 
    
        data/spec/dozuki/parsers_spec.rb
    CHANGED
    
    | @@ -101,5 +101,38 @@ module Dozuki | |
| 101 101 | 
             
                    end
         | 
| 102 102 | 
             
                  end
         | 
| 103 103 | 
             
                end
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                describe Boolean do
         | 
| 106 | 
            +
                  let(:node) {mock :node, :text => string}
         | 
| 107 | 
            +
                  subject{ Boolean.parse(node)}
         | 
| 108 | 
            +
                  context "where string is 0" do
         | 
| 109 | 
            +
                    let(:string){"0"}
         | 
| 110 | 
            +
                    it{should be_false}
         | 
| 111 | 
            +
                    context "and there is whitespace" do
         | 
| 112 | 
            +
                      let(:string){"\n0"}
         | 
| 113 | 
            +
                      it{should be_false}
         | 
| 114 | 
            +
                    end
         | 
| 115 | 
            +
                  end
         | 
| 116 | 
            +
                  context "where string is 1" do
         | 
| 117 | 
            +
                    let(:string){"1"}
         | 
| 118 | 
            +
                    it{should be_true}
         | 
| 119 | 
            +
                    context "and there is whitespace" do
         | 
| 120 | 
            +
                      let(:string){"\n1"}
         | 
| 121 | 
            +
                      it{should be_true}
         | 
| 122 | 
            +
                    end
         | 
| 123 | 
            +
                  end
         | 
| 124 | 
            +
                  context "where string is true" do
         | 
| 125 | 
            +
                    let(:string){ "true" }
         | 
| 126 | 
            +
                    it {should be_true}
         | 
| 127 | 
            +
                    context "and there is whitespace" do
         | 
| 128 | 
            +
                      let(:string){"\ntrue"}
         | 
| 129 | 
            +
                      it{should be_true}
         | 
| 130 | 
            +
                    end
         | 
| 131 | 
            +
                  end
         | 
| 132 | 
            +
                  context "where string is false" do
         | 
| 133 | 
            +
                    let(:string){ "false"}
         | 
| 134 | 
            +
                    it{ should be_false }
         | 
| 135 | 
            +
                  end
         | 
| 136 | 
            +
                end
         | 
| 104 137 | 
             
              end
         | 
| 105 138 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -2,7 +2,7 @@ | |
| 2 2 | 
             
            name: dozuki
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 4 | 
             
              prerelease: 
         | 
| 5 | 
            -
              version: 0. | 
| 5 | 
            +
              version: 0.4.0
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors: 
         | 
| 8 8 | 
             
            - James Almond
         | 
| @@ -10,11 +10,12 @@ autorequire: | |
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 12 |  | 
| 13 | 
            -
            date: 2011-05- | 
| 13 | 
            +
            date: 2011-05-10 00:00:00 +01:00
         | 
| 14 14 | 
             
            default_executable: 
         | 
| 15 15 | 
             
            dependencies: 
         | 
| 16 16 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| 17 17 | 
             
              name: nokogiri
         | 
| 18 | 
            +
              prerelease: false
         | 
| 18 19 | 
             
              requirement: &id001 !ruby/object:Gem::Requirement 
         | 
| 19 20 | 
             
                none: false
         | 
| 20 21 | 
             
                requirements: 
         | 
| @@ -22,10 +23,10 @@ dependencies: | |
| 22 23 | 
             
                  - !ruby/object:Gem::Version 
         | 
| 23 24 | 
             
                    version: "0"
         | 
| 24 25 | 
             
              type: :runtime
         | 
| 25 | 
            -
              prerelease: false
         | 
| 26 26 | 
             
              version_requirements: *id001
         | 
| 27 27 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| 28 28 | 
             
              name: rspec
         | 
| 29 | 
            +
              prerelease: false
         | 
| 29 30 | 
             
              requirement: &id002 !ruby/object:Gem::Requirement 
         | 
| 30 31 | 
             
                none: false
         | 
| 31 32 | 
             
                requirements: 
         | 
| @@ -33,10 +34,10 @@ dependencies: | |
| 33 34 | 
             
                  - !ruby/object:Gem::Version 
         | 
| 34 35 | 
             
                    version: "0"
         | 
| 35 36 | 
             
              type: :development
         | 
| 36 | 
            -
              prerelease: false
         | 
| 37 37 | 
             
              version_requirements: *id002
         | 
| 38 38 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| 39 39 | 
             
              name: cucumber
         | 
| 40 | 
            +
              prerelease: false
         | 
| 40 41 | 
             
              requirement: &id003 !ruby/object:Gem::Requirement 
         | 
| 41 42 | 
             
                none: false
         | 
| 42 43 | 
             
                requirements: 
         | 
| @@ -44,10 +45,10 @@ dependencies: | |
| 44 45 | 
             
                  - !ruby/object:Gem::Version 
         | 
| 45 46 | 
             
                    version: "0"
         | 
| 46 47 | 
             
              type: :development
         | 
| 47 | 
            -
              prerelease: false
         | 
| 48 48 | 
             
              version_requirements: *id003
         | 
| 49 49 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| 50 50 | 
             
              name: autotest
         | 
| 51 | 
            +
              prerelease: false
         | 
| 51 52 | 
             
              requirement: &id004 !ruby/object:Gem::Requirement 
         | 
| 52 53 | 
             
                none: false
         | 
| 53 54 | 
             
                requirements: 
         | 
| @@ -55,10 +56,10 @@ dependencies: | |
| 55 56 | 
             
                  - !ruby/object:Gem::Version 
         | 
| 56 57 | 
             
                    version: "0"
         | 
| 57 58 | 
             
              type: :development
         | 
| 58 | 
            -
              prerelease: false
         | 
| 59 59 | 
             
              version_requirements: *id004
         | 
| 60 60 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| 61 61 | 
             
              name: rake
         | 
| 62 | 
            +
              prerelease: false
         | 
| 62 63 | 
             
              requirement: &id005 !ruby/object:Gem::Requirement 
         | 
| 63 64 | 
             
                none: false
         | 
| 64 65 | 
             
                requirements: 
         | 
| @@ -66,7 +67,6 @@ dependencies: | |
| 66 67 | 
             
                  - !ruby/object:Gem::Version 
         | 
| 67 68 | 
             
                    version: "0"
         | 
| 68 69 | 
             
              type: :development
         | 
| 69 | 
            -
              prerelease: false
         | 
| 70 70 | 
             
              version_requirements: *id005
         | 
| 71 71 | 
             
            description: A simple way of extracting various elements from an Nokogiri document using XPaths
         | 
| 72 72 | 
             
            email: 
         | 
| @@ -87,6 +87,7 @@ files: | |
| 87 87 | 
             
            - README.markdown
         | 
| 88 88 | 
             
            - Rakefile
         | 
| 89 89 | 
             
            - dozuki.gemspec
         | 
| 90 | 
            +
            - features/boolean_accessor.feature
         | 
| 90 91 | 
             
            - features/date_accessor.feature
         | 
| 91 92 | 
             
            - features/each_accessor.feature
         | 
| 92 93 | 
             
            - features/exists_accessor.feature
         | 
| @@ -128,18 +129,12 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 128 129 | 
             
              requirements: 
         | 
| 129 130 | 
             
              - - ">="
         | 
| 130 131 | 
             
                - !ruby/object:Gem::Version 
         | 
| 131 | 
            -
                  hash: -990796854414031921
         | 
| 132 | 
            -
                  segments: 
         | 
| 133 | 
            -
                  - 0
         | 
| 134 132 | 
             
                  version: "0"
         | 
| 135 133 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement 
         | 
| 136 134 | 
             
              none: false
         | 
| 137 135 | 
             
              requirements: 
         | 
| 138 136 | 
             
              - - ">="
         | 
| 139 137 | 
             
                - !ruby/object:Gem::Version 
         | 
| 140 | 
            -
                  hash: -990796854414031921
         | 
| 141 | 
            -
                  segments: 
         | 
| 142 | 
            -
                  - 0
         | 
| 143 138 | 
             
                  version: "0"
         | 
| 144 139 | 
             
            requirements: []
         | 
| 145 140 |  | 
| @@ -150,6 +145,7 @@ specification_version: 3 | |
| 150 145 | 
             
            summary: A syntactic sugar wrapper for Nokogiri
         | 
| 151 146 | 
             
            test_files: 
         | 
| 152 147 | 
             
            - .autotest
         | 
| 148 | 
            +
            - features/boolean_accessor.feature
         | 
| 153 149 | 
             
            - features/date_accessor.feature
         | 
| 154 150 | 
             
            - features/each_accessor.feature
         | 
| 155 151 | 
             
            - features/exists_accessor.feature
         |