tripod 0.2.3 → 0.3.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/.autotest +1 -0
- data/.rspec +1 -0
- data/Gemfile +2 -1
- data/README.md +27 -16
- data/lib/tripod/criteria/execution.rb +100 -0
- data/lib/tripod/criteria.rb +56 -0
- data/lib/tripod/errors/bad_data_request.rb +15 -0
- data/lib/tripod/errors/bad_sparql_request.rb +15 -0
- data/lib/tripod/errors/rdf_parse_failed.rb +7 -0
- data/lib/tripod/errors/rdf_type_not_set.rb +9 -0
- data/lib/tripod/errors.rb +6 -1
- data/lib/tripod/finders.rb +21 -76
- data/lib/tripod/persistence.rb +4 -4
- data/lib/tripod/resource.rb +3 -1
- data/lib/tripod/sparql_client.rb +45 -13
- data/lib/tripod/sparql_query.rb +86 -0
- data/lib/tripod/version.rb +1 -1
- data/lib/tripod.rb +5 -0
- data/spec/spec_helper.rb +3 -0
- data/spec/tripod/criteria_execution_spec.rb +118 -0
- data/spec/tripod/criteria_spec.rb +65 -0
- data/spec/tripod/finders_spec.rb +66 -46
- data/spec/tripod/resource_spec.rb +4 -2
- data/spec/tripod/sparql_client_spec.rb +46 -0
- data/spec/tripod/sparql_query_spec.rb +133 -0
- metadata +37 -20
    
        data/spec/spec_helper.rb
    CHANGED
    
    | @@ -6,11 +6,13 @@ $LOAD_PATH.unshift(MODELS) | |
| 6 6 |  | 
| 7 7 | 
             
            require 'tripod'
         | 
| 8 8 | 
             
            require 'rspec'
         | 
| 9 | 
            +
            require 'webmock/rspec'
         | 
| 9 10 |  | 
| 10 11 | 
             
            RSpec.configure do |config|
         | 
| 11 12 | 
             
              config.mock_with :rspec
         | 
| 12 13 |  | 
| 13 14 | 
             
              config.before(:each) do
         | 
| 15 | 
            +
                WebMock.disable!
         | 
| 14 16 | 
             
                # delete from all graphs.
         | 
| 15 17 | 
             
                Tripod::SparqlClient::Update.update('
         | 
| 16 18 | 
             
                  # delete from default graph:
         | 
| @@ -26,6 +28,7 @@ end | |
| 26 28 | 
             
            Tripod.configure do |config|
         | 
| 27 29 | 
             
              config.update_endpoint = 'http://127.0.0.1:3030/tripod-test/update'
         | 
| 28 30 | 
             
              config.query_endpoint = 'http://127.0.0.1:3030/tripod-test/sparql'
         | 
| 31 | 
            +
              config.data_endpoint = 'http://127.0.0.1:3030/tripod-test/data'
         | 
| 29 32 | 
             
            end
         | 
| 30 33 |  | 
| 31 34 | 
             
            # Autoload every model for the test suite that sits in spec/app/models.
         | 
| @@ -0,0 +1,118 @@ | |
| 1 | 
            +
            require "spec_helper"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Tripod::Criteria do
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              let(:person_criteria) do
         | 
| 6 | 
            +
                c = Tripod::Criteria.new(Person)
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              let(:resource_criteria) do
         | 
| 10 | 
            +
                c = Tripod::Criteria.new(Resource)
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              let(:john) do
         | 
| 14 | 
            +
                p = Person.new('http://john', 'http://people')
         | 
| 15 | 
            +
                p.name = "John"
         | 
| 16 | 
            +
                p
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              let(:barry) do
         | 
| 20 | 
            +
                p = Person.new('http://barry', 'http://people')
         | 
| 21 | 
            +
                p.name = "Barry"
         | 
| 22 | 
            +
                p
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              describe "#build_select_query" do
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                context "for a class with an rdf_type" do
         | 
| 28 | 
            +
                  it "should return a SELECT query based with an rdf type restriction" do
         | 
| 29 | 
            +
                    person_criteria.send(:build_select_query).should == "SELECT ?uri ?graph WHERE { GRAPH ?graph { ?uri a <http://person> } }"
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  context "and extra restrictions" do
         | 
| 33 | 
            +
                    before { person_criteria.where("[pattern]") }
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                    it "should return a SELECT query with the extra restriction and rdf type restriction" do
         | 
| 36 | 
            +
                      person_criteria.send(:build_select_query).should == "SELECT ?uri ?graph WHERE { GRAPH ?graph { ?uri a <http://person> . [pattern] } }"
         | 
| 37 | 
            +
                    end
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                context "for a class without an rdf_type" do
         | 
| 42 | 
            +
                  it "should return a SELECT query without an rdf_type restriction" do
         | 
| 43 | 
            +
                    resource_criteria.send(:build_select_query).should == "SELECT ?uri ?graph WHERE { GRAPH ?graph { ?uri ?p ?o } }"
         | 
| 44 | 
            +
                  end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                  context "and extra restrictions" do
         | 
| 47 | 
            +
                    before { resource_criteria.where("[pattern]") }
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                    it "should return a SELECT query with the extra restrictions" do
         | 
| 50 | 
            +
                      resource_criteria.send(:build_select_query).should == "SELECT ?uri ?graph WHERE { GRAPH ?graph { ?uri ?p ?o . [pattern] } }"
         | 
| 51 | 
            +
                    end
         | 
| 52 | 
            +
                  end
         | 
| 53 | 
            +
                end
         | 
| 54 | 
            +
              end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
              describe "#resources" do
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                before do
         | 
| 59 | 
            +
                  john.save!
         | 
| 60 | 
            +
                  barry.save!
         | 
| 61 | 
            +
                end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                context "with no extra restrictions" do
         | 
| 64 | 
            +
                  it "should return a set of hydrated objects for the type" do
         | 
| 65 | 
            +
                    person_criteria.resources.should == [john, barry]
         | 
| 66 | 
            +
                  end
         | 
| 67 | 
            +
                end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                context "with extra restrictions" do
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                  before { person_criteria.where("?uri <http://name> 'John'") }
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                  it "should return a set of hydrated objects for the type and restrictions" do
         | 
| 74 | 
            +
                     person_criteria.resources.should == [john]
         | 
| 75 | 
            +
                  end
         | 
| 76 | 
            +
                end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
              end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
              describe "#first" do
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                before do
         | 
| 83 | 
            +
                  john.save!
         | 
| 84 | 
            +
                  barry.save!
         | 
| 85 | 
            +
                end
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                it "should return the first resource for the criteria" do
         | 
| 88 | 
            +
                  person_criteria.first.should == john
         | 
| 89 | 
            +
                end
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                it "should call Query.select with the 'first sparql'" do
         | 
| 92 | 
            +
                  sparql = Tripod::SparqlQuery.new(person_criteria.send(:build_select_query)).as_first_query_str
         | 
| 93 | 
            +
                  Tripod::SparqlClient::Query.should_receive(:select).with(sparql).and_call_original
         | 
| 94 | 
            +
                  person_criteria.first
         | 
| 95 | 
            +
                end
         | 
| 96 | 
            +
              end
         | 
| 97 | 
            +
             | 
| 98 | 
            +
              describe "#count" do
         | 
| 99 | 
            +
             | 
| 100 | 
            +
                before do
         | 
| 101 | 
            +
                  john.save!
         | 
| 102 | 
            +
                  barry.save!
         | 
| 103 | 
            +
                end
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                it "should return a set of hydrated objects for the criteria" do
         | 
| 106 | 
            +
                  person_criteria.count.should == 2
         | 
| 107 | 
            +
                  person_criteria.where("?uri <http://name> 'John'").count.should ==1
         | 
| 108 | 
            +
                end
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                it "should call Query.select with the 'count sparql'" do
         | 
| 111 | 
            +
                  sparql = Tripod::SparqlQuery.new(person_criteria.send(:build_select_query)).as_count_query_str
         | 
| 112 | 
            +
                  Tripod::SparqlClient::Query.should_receive(:select).with(sparql).and_call_original
         | 
| 113 | 
            +
                  person_criteria.count
         | 
| 114 | 
            +
                end
         | 
| 115 | 
            +
             | 
| 116 | 
            +
              end
         | 
| 117 | 
            +
             | 
| 118 | 
            +
            end
         | 
| @@ -0,0 +1,65 @@ | |
| 1 | 
            +
            require "spec_helper"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Tripod::Criteria do
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              let(:person_criteria) { Tripod::Criteria.new(Person) }
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              let(:resource_criteria) { Tripod::Criteria.new(Resource) }
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              describe "#initialize" do
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                it "should set the resource class accessor" do
         | 
| 12 | 
            +
                  person_criteria.resource_class.should == Person
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                it "should initialize the extra clauses to a blank array" do
         | 
| 16 | 
            +
                  person_criteria.extra_clauses.should == []
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                context "with rdf_type set on the class" do
         | 
| 20 | 
            +
                  it "should initialize the where clauses to include a type restriction" do
         | 
| 21 | 
            +
                    person_criteria.where_clauses.should == ["?uri a <http://person>"]
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                context "with no rdf_type set on the class" do
         | 
| 26 | 
            +
                  it "should initialize the where clauses to ?uri ?p ?o" do
         | 
| 27 | 
            +
                    resource_criteria.where_clauses.should == ["?uri ?p ?o"]
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              describe "#where" do
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                it "should add the sparql snippet to the where clauses" do
         | 
| 35 | 
            +
                  resource_criteria.where("blah")
         | 
| 36 | 
            +
                  resource_criteria.where_clauses.should == ["?uri ?p ?o", "blah"]
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                it "should return an instance of Criteria" do
         | 
| 40 | 
            +
                  resource_criteria.where("blah").class == Tripod::Criteria
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                it "should return an instance of Criteria with the where clauses added" do
         | 
| 44 | 
            +
                  resource_criteria.where("blah").where_clauses.should == ["?uri ?p ?o", "blah"]
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
              end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
              describe "#extras" do
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                it "should add the sparql snippet to the extra clauses" do
         | 
| 52 | 
            +
                  resource_criteria.extras("bleh")
         | 
| 53 | 
            +
                  resource_criteria.extra_clauses.should == ["bleh"]
         | 
| 54 | 
            +
                end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                it "should return an instance of Criteria" do
         | 
| 57 | 
            +
                  resource_criteria.extras("bleh").class == Tripod::Criteria
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                it "should return an instance of Criteria with the extra clauses added" do
         | 
| 61 | 
            +
                  resource_criteria.extras("bleh").extra_clauses.should == ["bleh"]
         | 
| 62 | 
            +
                end
         | 
| 63 | 
            +
              end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
            end
         | 
    
        data/spec/tripod/finders_spec.rb
    CHANGED
    
    | @@ -3,43 +3,25 @@ require "spec_helper" | |
| 3 3 | 
             
            describe Tripod::Finders do
         | 
| 4 4 |  | 
| 5 5 | 
             
              let(:ric) do
         | 
| 6 | 
            -
                 | 
| 7 | 
            -
                 | 
| 8 | 
            -
             | 
| 9 | 
            -
                stmt = RDF::Statement.new
         | 
| 10 | 
            -
                stmt.subject = RDF::URI.new(@ric_uri)
         | 
| 11 | 
            -
                stmt.predicate = RDF::URI.new('http://name')
         | 
| 12 | 
            -
                stmt.object = "ric"
         | 
| 13 | 
            -
                stmts << stmt
         | 
| 14 | 
            -
             | 
| 15 | 
            -
                stmt = RDF::Statement.new
         | 
| 16 | 
            -
                stmt.subject = RDF::URI.new(@ric_uri)
         | 
| 17 | 
            -
                stmt.predicate = RDF::URI.new('http://knows')
         | 
| 18 | 
            -
                stmt.object = RDF::URI.new('http://bill')
         | 
| 19 | 
            -
                stmts << stmt
         | 
| 20 | 
            -
             | 
| 21 | 
            -
                r = Person.new(@ric_uri)
         | 
| 22 | 
            -
                r.hydrate!(:graph => stmts)
         | 
| 23 | 
            -
                r.save
         | 
| 6 | 
            +
                r = Person.new('http://example.com/people/id/ric')
         | 
| 7 | 
            +
                r.name = "ric"
         | 
| 8 | 
            +
                r.knows = RDF::URI.new("http://bill")
         | 
| 24 9 | 
             
                r
         | 
| 25 10 | 
             
              end
         | 
| 26 11 |  | 
| 27 12 | 
             
              let(:bill) do
         | 
| 28 | 
            -
                 | 
| 29 | 
            -
                 | 
| 30 | 
            -
                stmt = RDF::Statement.new
         | 
| 31 | 
            -
                stmt.subject = RDF::URI.new(@bill_uri)
         | 
| 32 | 
            -
                stmt.predicate = RDF::URI.new('http://name')
         | 
| 33 | 
            -
                stmt.object = "bill"
         | 
| 34 | 
            -
                stmts << stmt
         | 
| 35 | 
            -
                b = Person.new(@bill_uri)
         | 
| 36 | 
            -
                b.hydrate!(:graph => stmts)
         | 
| 37 | 
            -
                b.save
         | 
| 13 | 
            +
                b = Person.new('http://example.com/people/id/bill')
         | 
| 14 | 
            +
                b.name = "bill"
         | 
| 38 15 | 
             
                b
         | 
| 39 16 | 
             
              end
         | 
| 40 17 |  | 
| 41 18 | 
             
              describe '.find' do
         | 
| 42 19 |  | 
| 20 | 
            +
                before do
         | 
| 21 | 
            +
                  ric.save!
         | 
| 22 | 
            +
                  bill.save!
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 43 25 | 
             
                context 'when record exists' do
         | 
| 44 26 | 
             
                  let(:person) { Person.find(ric.uri) }
         | 
| 45 27 |  | 
| @@ -65,39 +47,77 @@ describe Tripod::Finders do | |
| 65 47 | 
             
                  end
         | 
| 66 48 | 
             
                end
         | 
| 67 49 |  | 
| 68 | 
            -
                context 'with  | 
| 50 | 
            +
                context 'with graph_uri supplied' do
         | 
| 51 | 
            +
                  it 'should use that graph to call new' do
         | 
| 52 | 
            +
                    ric # trigger the lazy load
         | 
| 53 | 
            +
                    Person.should_receive(:new).with(ric.uri, 'http://graphx').and_call_original
         | 
| 54 | 
            +
                    Person.find(ric.uri, "http://graphx")
         | 
| 55 | 
            +
                  end
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                context 'with no graph_uri supplied' do
         | 
| 59 | 
            +
                   it 'should look up the graph to call new' do
         | 
| 60 | 
            +
                    ric # trigger the lazy load
         | 
| 61 | 
            +
                    Person.should_receive(:new).with(ric.uri, Person._GRAPH_URI).and_call_original
         | 
| 62 | 
            +
                    Person.find(ric.uri, Person._GRAPH_URI)
         | 
| 63 | 
            +
                  end
         | 
| 64 | 
            +
                end
         | 
| 65 | 
            +
              end
         | 
| 69 66 |  | 
| 67 | 
            +
              describe ".all" do
         | 
| 68 | 
            +
                it "should make and return a new criteria for the current class" do
         | 
| 69 | 
            +
                  Person.all.should == Tripod::Criteria.new(Person)
         | 
| 70 70 | 
             
                end
         | 
| 71 71 | 
             
              end
         | 
| 72 72 |  | 
| 73 | 
            -
              describe  | 
| 73 | 
            +
              describe ".where" do
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                let(:criteria) { Person.where("[pattern]") }
         | 
| 74 76 |  | 
| 77 | 
            +
                it "should make and return a criteria for the current class" do
         | 
| 78 | 
            +
                  criteria.class.should == Tripod::Criteria
         | 
| 79 | 
            +
                end
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                it "should apply the where clause" do
         | 
| 82 | 
            +
                  criteria.where_clauses.should include("[pattern]")
         | 
| 83 | 
            +
                end
         | 
| 84 | 
            +
             | 
| 85 | 
            +
              end
         | 
| 86 | 
            +
             | 
| 87 | 
            +
              describe "count" do
         | 
| 75 88 | 
             
                before do
         | 
| 76 | 
            -
                   | 
| 77 | 
            -
                  bill
         | 
| 78 | 
            -
                  ric
         | 
| 89 | 
            +
                  ric.save!
         | 
| 90 | 
            +
                  bill.save!
         | 
| 79 91 | 
             
                end
         | 
| 80 92 |  | 
| 81 | 
            -
                it  | 
| 82 | 
            -
                   | 
| 83 | 
            -
                   | 
| 84 | 
            -
                   | 
| 85 | 
            -
                   | 
| 93 | 
            +
                it "should just call count on the all criteria" do
         | 
| 94 | 
            +
                  all_crit = Tripod::Criteria.new(Person)
         | 
| 95 | 
            +
                  Person.should_receive(:all).and_return(all_crit)
         | 
| 96 | 
            +
                  all_crit.should_receive(:count).and_call_original
         | 
| 97 | 
            +
                  Person.count
         | 
| 98 | 
            +
                end
         | 
| 86 99 |  | 
| 87 | 
            -
             | 
| 88 | 
            -
                   | 
| 100 | 
            +
                it 'should return the count of all resources of this type' do
         | 
| 101 | 
            +
                  Person.count.should == 2
         | 
| 89 102 | 
             
                end
         | 
| 103 | 
            +
              end
         | 
| 90 104 |  | 
| 91 | 
            -
             | 
| 92 | 
            -
             | 
| 93 | 
            -
                   | 
| 105 | 
            +
              describe "first" do
         | 
| 106 | 
            +
                before do
         | 
| 107 | 
            +
                  ric.save!
         | 
| 108 | 
            +
                  bill.save!
         | 
| 94 109 | 
             
                end
         | 
| 95 110 |  | 
| 96 | 
            -
                it " | 
| 97 | 
            -
                   | 
| 98 | 
            -
                   | 
| 111 | 
            +
                it "should just call count on the all criteria" do
         | 
| 112 | 
            +
                  all_crit = Tripod::Criteria.new(Person)
         | 
| 113 | 
            +
                  Person.should_receive(:all).and_return(all_crit)
         | 
| 114 | 
            +
                  all_crit.should_receive(:first).and_call_original
         | 
| 115 | 
            +
                  Person.first
         | 
| 99 116 | 
             
                end
         | 
| 100 117 |  | 
| 118 | 
            +
                it 'should return the first resources of this type' do
         | 
| 119 | 
            +
                  Person.first.should == ric
         | 
| 120 | 
            +
                end
         | 
| 101 121 | 
             
              end
         | 
| 102 122 |  | 
| 103 123 | 
             
            end
         | 
| @@ -21,8 +21,10 @@ describe Tripod::Resource do | |
| 21 21 | 
             
                    person.graph_uri.should == RDF::URI.new('http://graph')
         | 
| 22 22 | 
             
                  end
         | 
| 23 23 |  | 
| 24 | 
            -
                   | 
| 25 | 
            -
                     | 
| 24 | 
            +
                  context "with rdf_type specified at class level" do
         | 
| 25 | 
            +
                    it "sets the rdf type from the class" do
         | 
| 26 | 
            +
                      person.rdf_type.to_s.should == 'http://person'
         | 
| 27 | 
            +
                    end
         | 
| 26 28 | 
             
                  end
         | 
| 27 29 |  | 
| 28 30 | 
             
                  it "initialises a repo" do
         | 
| @@ -0,0 +1,46 @@ | |
| 1 | 
            +
            require "spec_helper"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Tripod::SparqlClient do
         | 
| 4 | 
            +
              describe Data do
         | 
| 5 | 
            +
                let(:data) { 'some-data-goes-here' }
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                describe "Data#append" do
         | 
| 8 | 
            +
                  it "should add the graph uri to the configured data endpoint" do
         | 
| 9 | 
            +
                    RestClient::Request.should_receive(:execute).with(hash_including(url: 'http://127.0.0.1:3030/tripod-test/data?graph=http://foo'))
         | 
| 10 | 
            +
                    Tripod::SparqlClient::Data.append('http://foo', data)
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  it "should send the data as the payload" do
         | 
| 14 | 
            +
                    RestClient::Request.should_receive(:execute).with(hash_including(payload: data))
         | 
| 15 | 
            +
                    Tripod::SparqlClient::Data.append('http://foo', data)
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  it "should HTTP POST the data" do
         | 
| 19 | 
            +
                    RestClient::Request.should_receive(:execute).with(hash_including(method: :post))
         | 
| 20 | 
            +
                    Tripod::SparqlClient::Data.append('http://foo', data)
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  context "which fails with a 400 error" do
         | 
| 24 | 
            +
                    before do
         | 
| 25 | 
            +
                      WebMock.enable!
         | 
| 26 | 
            +
                      stub_http_request(:post, 'http://127.0.0.1:3030/tripod-test/data?graph=http://foo').to_return(body: 'Error 400: Trousers missing', status: 400)
         | 
| 27 | 
            +
                    end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                    it "should raise a 'parse failed' exception" do
         | 
| 30 | 
            +
                      lambda { Tripod::SparqlClient::Data.append('http://foo', data) }.should raise_error(Tripod::Errors::BadDataRequest)
         | 
| 31 | 
            +
                    end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                    after do
         | 
| 34 | 
            +
                      WebMock.disable!
         | 
| 35 | 
            +
                    end
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                describe "Data#replace" do
         | 
| 40 | 
            +
                  it "should HTTP PUT the data" do
         | 
| 41 | 
            +
                    RestClient::Request.should_receive(:execute).with(hash_including(method: :put))
         | 
| 42 | 
            +
                    Tripod::SparqlClient::Data.replace('http://foo', data)
         | 
| 43 | 
            +
                  end
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
              end
         | 
| 46 | 
            +
            end
         | 
| @@ -0,0 +1,133 @@ | |
| 1 | 
            +
            require "spec_helper"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Tripod::SparqlQuery do
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              describe '#initialize' do
         | 
| 6 | 
            +
                context 'given a query without prefixes' do
         | 
| 7 | 
            +
                  it 'should assign the given query to the body attribute' do
         | 
| 8 | 
            +
                    q = Tripod::SparqlQuery.new('SELECT xyz')
         | 
| 9 | 
            +
                    q.body.should == 'SELECT xyz'
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                context 'given a query with prefixes' do
         | 
| 14 | 
            +
                  it 'should separate the query into prefixes and body' do
         | 
| 15 | 
            +
                    q = Tripod::SparqlQuery.new('PREFIX e: <http://example.com> SELECT xyz')
         | 
| 16 | 
            +
                    q.prefixes.should == 'PREFIX e: <http://example.com>'
         | 
| 17 | 
            +
                    q.body.should == 'SELECT xyz'
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              describe "#has_prefixes?" do
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                context "for a query with prefixes" do
         | 
| 25 | 
            +
                  it "should return true" do
         | 
| 26 | 
            +
                    q = Tripod::SparqlQuery.new('PREFIX e: <http://example.com> SELECT xyz')
         | 
| 27 | 
            +
                    q.has_prefixes?.should be_true
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                context "for a query without prefixes" do
         | 
| 32 | 
            +
                  it "should return false" do
         | 
| 33 | 
            +
                    q = Tripod::SparqlQuery.new('SELECT xyz')
         | 
| 34 | 
            +
                    q.has_prefixes?.should be_false
         | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
              end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
              describe "#query_type" do
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                it 'should return :select given a SELECT query' do
         | 
| 43 | 
            +
                  q = Tripod::SparqlQuery.new('SELECT xyz')
         | 
| 44 | 
            +
                  q.query_type.should == :select
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                it 'should return :construct given a CONSTRUCT query' do
         | 
| 48 | 
            +
                  q = Tripod::SparqlQuery.new('CONSTRUCT <xyz>')
         | 
| 49 | 
            +
                  q.query_type.should == :construct
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                it 'should return :construct given a DESCRIBE query' do
         | 
| 53 | 
            +
                  q = Tripod::SparqlQuery.new('DESCRIBE <xyz>')
         | 
| 54 | 
            +
                  q.query_type.should == :describe
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                it 'should return :ask given an ASK query' do
         | 
| 58 | 
            +
                  q = Tripod::SparqlQuery.new('ASK <xyz>')
         | 
| 59 | 
            +
                  q.query_type.should == :ask
         | 
| 60 | 
            +
                end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                it "should return :unknown given an unknown type" do
         | 
| 63 | 
            +
                  q = Tripod::SparqlQuery.new('FOO <xyz>')
         | 
| 64 | 
            +
                  q.query_type.should == :unknown
         | 
| 65 | 
            +
                end
         | 
| 66 | 
            +
              end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
              describe '#extract_prefixes' do
         | 
| 69 | 
            +
                it 'should return the prefixes and query body separately' do
         | 
| 70 | 
            +
                  q = Tripod::SparqlQuery.new('PREFIX e: <http://example.com> SELECT xyz')
         | 
| 71 | 
            +
                  p, b = q.extract_prefixes
         | 
| 72 | 
            +
                  p.should == 'PREFIX e: <http://example.com>'
         | 
| 73 | 
            +
                  b.should == 'SELECT xyz'
         | 
| 74 | 
            +
                end
         | 
| 75 | 
            +
              end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
              describe '#as_count_query_str' do
         | 
| 78 | 
            +
                context "for non-selects" do
         | 
| 79 | 
            +
                  it "should throw an exception" do
         | 
| 80 | 
            +
                    lambda {
         | 
| 81 | 
            +
                      q = Tripod::SparqlQuery.new('ASK { ?s ?p ?o }')
         | 
| 82 | 
            +
                      q.as_count_query_str
         | 
| 83 | 
            +
                    }.should raise_error(Tripod::SparqlQueryError)
         | 
| 84 | 
            +
                  end
         | 
| 85 | 
            +
                end
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                context "for selects" do
         | 
| 88 | 
            +
                  context 'without prefixes' do
         | 
| 89 | 
            +
                    it "should return a new SparqlQuery with the original query wrapped in a count" do
         | 
| 90 | 
            +
                      q = Tripod::SparqlQuery.new('SELECT ?s WHERE { ?s ?p ?o }')
         | 
| 91 | 
            +
                      q.as_count_query_str.should == 'SELECT COUNT(*) { SELECT ?s WHERE { ?s ?p ?o } }'
         | 
| 92 | 
            +
                    end
         | 
| 93 | 
            +
                  end
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                  context 'with prefixes' do
         | 
| 96 | 
            +
                    it "should move the prefixes to the start" do
         | 
| 97 | 
            +
                      q = Tripod::SparqlQuery.new('PREFIX e: <http://example.com> SELECT ?s WHERE { ?s ?p ?o }')
         | 
| 98 | 
            +
                      q.as_count_query_str.should == 'PREFIX e: <http://example.com> SELECT COUNT(*) { SELECT ?s WHERE { ?s ?p ?o } }'
         | 
| 99 | 
            +
                    end
         | 
| 100 | 
            +
                  end
         | 
| 101 | 
            +
                end
         | 
| 102 | 
            +
              end
         | 
| 103 | 
            +
             | 
| 104 | 
            +
              describe "#as_first_query_str" do
         | 
| 105 | 
            +
                context "for non-selects" do
         | 
| 106 | 
            +
                  it "should throw an exception" do
         | 
| 107 | 
            +
                    lambda {
         | 
| 108 | 
            +
                      q = Tripod::SparqlQuery.new('ASK { ?s ?p ?o }')
         | 
| 109 | 
            +
                      q.as_first_query_str
         | 
| 110 | 
            +
                    }.should raise_error(Tripod::SparqlQueryError)
         | 
| 111 | 
            +
                  end
         | 
| 112 | 
            +
                end
         | 
| 113 | 
            +
             | 
| 114 | 
            +
                context "for selects" do
         | 
| 115 | 
            +
                  context 'without prefixes' do
         | 
| 116 | 
            +
                    it "should return a new SparqlQuery with the original query wrapped in a count" do
         | 
| 117 | 
            +
                      q = Tripod::SparqlQuery.new('SELECT ?s WHERE { ?s ?p ?o }')
         | 
| 118 | 
            +
                      q.as_first_query_str.should == 'SELECT * { SELECT ?s WHERE { ?s ?p ?o } } LIMIT 1'
         | 
| 119 | 
            +
                    end
         | 
| 120 | 
            +
                  end
         | 
| 121 | 
            +
             | 
| 122 | 
            +
                  context 'with prefixes' do
         | 
| 123 | 
            +
                    it "should move the prefixes to the start" do
         | 
| 124 | 
            +
                      q = Tripod::SparqlQuery.new('PREFIX e: <http://example.com> SELECT ?s WHERE { ?s ?p ?o }')
         | 
| 125 | 
            +
                      q.as_first_query_str.should == 'PREFIX e: <http://example.com> SELECT * { SELECT ?s WHERE { ?s ?p ?o } } LIMIT 1'
         | 
| 126 | 
            +
                    end
         | 
| 127 | 
            +
                  end
         | 
| 128 | 
            +
             | 
| 129 | 
            +
                end
         | 
| 130 | 
            +
             | 
| 131 | 
            +
              end
         | 
| 132 | 
            +
             | 
| 133 | 
            +
            end
         |