tripod 0.7.5 → 0.7.7

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/lib/tripod.rb CHANGED
@@ -34,7 +34,7 @@ require 'rdf/rdfxml'
34
34
  require 'rdf/n3'
35
35
  require 'rdf/json'
36
36
  require 'json/ld'
37
-
37
+ require 'uri'
38
38
  require 'rest_client'
39
39
 
40
40
  module Tripod
@@ -90,6 +90,7 @@ require "tripod/resource_collection"
90
90
  require "tripod/predicates"
91
91
  require "tripod/attributes"
92
92
  require "tripod/callbacks"
93
+ require "tripod/validations/is_url"
93
94
  require "tripod/errors"
94
95
  require "tripod/repository"
95
96
  require "tripod/fields"
@@ -103,4 +104,7 @@ require "tripod/version"
103
104
 
104
105
  # these need to be at the end
105
106
  require "tripod/components"
106
- require "tripod/resource"
107
+ require "tripod/resource"
108
+
109
+ require 'active_support/i18n'
110
+ I18n.load_path << File.dirname(__FILE__) + '/tripod/locale/en.yml'
@@ -81,10 +81,10 @@ module Tripod::Attributes
81
81
  end
82
82
 
83
83
  def write_value_for_field(value, field)
84
- return unless value
84
+ return if value.blank?
85
85
 
86
86
  if field.is_uri?
87
- RDF::URI.new(value.to_s)
87
+ uri = RDF::URI.new(value.to_s)
88
88
  elsif field.datatype
89
89
  RDF::Literal.new(value, :datatype => field.datatype)
90
90
  else
@@ -16,6 +16,7 @@ module Tripod::Components
16
16
  include Tripod::Predicates
17
17
  include Tripod::Attributes
18
18
  include Tripod::Callbacks
19
+ include Tripod::Validations
19
20
  include Tripod::Persistence
20
21
  include Tripod::Fields
21
22
  include Tripod::Finders
@@ -44,7 +44,7 @@ module Tripod
44
44
  sq = Tripod::SparqlQuery.new(build_select_query(opts))
45
45
  count_sparql = sq.as_count_query_str
46
46
  result = Tripod::SparqlClient::Query.select(count_sparql)
47
- result[0]["c"]["value"].to_i
47
+ result[0]["tripod_count_var"]["value"].to_i
48
48
  end
49
49
 
50
50
  # PRIVATE:
data/lib/tripod/fields.rb CHANGED
@@ -58,6 +58,11 @@ module Tripod::Fields
58
58
 
59
59
  # set up the accessors for the fields
60
60
  create_accessors(name, name, options)
61
+
62
+ # create a URL validation if appropriate
63
+ # (format nabbed from https://gist.github.com/joshuap/948880)
64
+ validates(name, is_url: true) if field.is_uri?
65
+
61
66
  field
62
67
  end
63
68
 
@@ -0,0 +1,10 @@
1
+ en:
2
+ activemodel:
3
+ errors:
4
+ # The default format to use in full error messages.
5
+ format: "%{attribute} %{message}"
6
+
7
+ # The values :model, :attribute and :value are always available for interpolation
8
+ # The value :count is available when applicable. Can be used for pluralization.
9
+ messages:
10
+ is_url: "is not a valid URL"
@@ -49,7 +49,7 @@ module Tripod
49
49
  def as_count_query_str
50
50
  check_subqueryable!
51
51
 
52
- count_query = "SELECT (COUNT(*) as ?c) { #{self.body} }"
52
+ count_query = "SELECT (COUNT(*) as ?tripod_count_var) { #{self.body} }"
53
53
  count_query = "#{self.prefixes} #{count_query}" if self.prefixes
54
54
 
55
55
  # just returns the string representing the count query for this query.
@@ -0,0 +1,23 @@
1
+ module Tripod::Validations
2
+ class IsUrlValidator < ActiveModel::EachValidator
3
+ def validate_each(resource, attribute, value)
4
+ return unless value # nil values get passed over.
5
+ is_valid = value.is_a?(Array) ? value.all?{|v| is_url?(v)} : is_url?(value)
6
+ resource.errors.add(attribute, :is_url, options) unless is_valid
7
+ end
8
+
9
+ private
10
+
11
+ def is_url?(value)
12
+ uri = nil
13
+ begin
14
+ uri = URI.parse(value.to_s)
15
+ rescue
16
+ return false
17
+ end
18
+ return false unless ['http', 'https'].include?(uri.scheme)
19
+ return false unless uri.host && uri.host.split('.').length > 1
20
+ true
21
+ end
22
+ end
23
+ end
@@ -1,3 +1,3 @@
1
1
  module Tripod
2
- VERSION = "0.7.5"
2
+ VERSION = "0.7.7"
3
3
  end
@@ -74,7 +74,7 @@ describe Tripod::Attributes do
74
74
 
75
75
  context "where there is no field with the given name" do
76
76
  it "should raise a 'field not present' error" do
77
- lambda { person.read_attribute(:hoof_size) }.should raise_error(Tripod::Errors::FieldNotPresent)
77
+ expect { person.read_attribute(:hoof_size) }.to raise_error(Tripod::Errors::FieldNotPresent)
78
78
  end
79
79
  end
80
80
  end
@@ -92,6 +92,11 @@ describe Tripod::Attributes do
92
92
  person.read_predicate('http://example.com/age').first.datatype.should == RDF::XSD.integer
93
93
  end
94
94
 
95
+ it "should not write the predicate given a blank value" do
96
+ person[:name] = ''
97
+ person.read_predicate('http://example.com/name').should be_empty
98
+ end
99
+
95
100
  context "where the attribute is a uri" do
96
101
  it "should convert a string to an RDF::URI" do
97
102
  person[:father] = 'http://example.com/darth'
@@ -190,7 +190,7 @@ describe Tripod::Criteria do
190
190
  end
191
191
 
192
192
  it "should execute the right Sparql" do
193
- sparql = "SELECT (COUNT(*) as ?c) { SELECT DISTINCT ?uri (<http://example.com/graph> as ?graph) WHERE { GRAPH <http://example.com/graph> { ?uri a <http://example.com/person> . ?uri ?p ?o } } LIMIT 10 OFFSET 20 }"
193
+ sparql = "SELECT (COUNT(*) as ?tripod_count_var) { SELECT DISTINCT ?uri (<http://example.com/graph> as ?graph) WHERE { GRAPH <http://example.com/graph> { ?uri a <http://example.com/person> . ?uri ?p ?o } } LIMIT 10 OFFSET 20 }"
194
194
  Tripod::SparqlClient::Query.should_receive(:select).with(sparql).and_call_original
195
195
  Person.all.limit(10).offset(20).count
196
196
  end
@@ -24,13 +24,19 @@ describe Tripod::Fields do
24
24
  end
25
25
 
26
26
  context "when the value is not set" do
27
- before do
28
- barry.name = nil
29
- end
27
+ before { barry.name = nil }
30
28
 
31
29
  it "should have a check? method which returns false" do
32
30
  barry.name?.should == false
33
31
  end
34
32
  end
33
+
34
+ context "given a field of type URI where an invalid URI is given" do
35
+ before { barry.father = 'Steven Notauri' }
36
+
37
+ it "should not be valid" do
38
+ barry.should_not be_valid
39
+ end
40
+ end
35
41
  end
36
42
  end
@@ -88,14 +88,14 @@ describe Tripod::SparqlQuery do
88
88
  context 'without prefixes' do
89
89
  it "should return a new SparqlQuery with the original query wrapped in a count" do
90
90
  q = Tripod::SparqlQuery.new('SELECT ?s WHERE { ?s ?p ?o }')
91
- q.as_count_query_str.should == 'SELECT (COUNT(*) as ?c) { SELECT ?s WHERE { ?s ?p ?o } }'
91
+ q.as_count_query_str.should == 'SELECT (COUNT(*) as ?tripod_count_var) { SELECT ?s WHERE { ?s ?p ?o } }'
92
92
  end
93
93
  end
94
94
 
95
95
  context 'with prefixes' do
96
96
  it "should move the prefixes to the start" do
97
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(*) as ?c) { SELECT ?s WHERE { ?s ?p ?o } }'
98
+ q.as_count_query_str.should == 'PREFIX e: <http://example.com> SELECT (COUNT(*) as ?tripod_count_var) { SELECT ?s WHERE { ?s ?p ?o } }'
99
99
  end
100
100
  end
101
101
  end
@@ -0,0 +1,25 @@
1
+ require "spec_helper"
2
+
3
+ describe Tripod::Validations::IsUrlValidator do
4
+ let(:person) { Person.new('http://example.com/barry') }
5
+
6
+ it 'should be valid given a valid URL' do
7
+ person.father = 'http://example.com/bob'
8
+ person.should be_valid
9
+ end
10
+
11
+ it 'should invalidate given a non-http(s) URL' do
12
+ person.father = 'ftp://example.com/bob.nt'
13
+ person.should_not be_valid
14
+ end
15
+
16
+ it 'should invalidate given something unlike a URL' do
17
+ person.father = 'http:Bob'
18
+ person.should_not be_valid
19
+ end
20
+
21
+ it 'should invalidate given a domain without a TLD' do
22
+ person.father = 'http://bob'
23
+ person.should_not be_valid
24
+ end
25
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tripod
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.5
4
+ version: 0.7.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,11 +11,11 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2013-04-04 00:00:00.000000000 Z
14
+ date: 2013-04-14 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rest-client
18
- requirement: &70124439331920 !ruby/object:Gem::Requirement
18
+ requirement: &70258719639060 !ruby/object:Gem::Requirement
19
19
  none: false
20
20
  requirements:
21
21
  - - ! '>='
@@ -23,10 +23,10 @@ dependencies:
23
23
  version: '0'
24
24
  type: :runtime
25
25
  prerelease: false
26
- version_requirements: *70124439331920
26
+ version_requirements: *70258719639060
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activemodel
29
- requirement: &70124439346220 !ruby/object:Gem::Requirement
29
+ requirement: &70258719636980 !ruby/object:Gem::Requirement
30
30
  none: false
31
31
  requirements:
32
32
  - - ~>
@@ -34,10 +34,10 @@ dependencies:
34
34
  version: '3.2'
35
35
  type: :runtime
36
36
  prerelease: false
37
- version_requirements: *70124439346220
37
+ version_requirements: *70258719636980
38
38
  - !ruby/object:Gem::Dependency
39
39
  name: equivalent-xml
40
- requirement: &70124439344500 !ruby/object:Gem::Requirement
40
+ requirement: &70258719656680 !ruby/object:Gem::Requirement
41
41
  none: false
42
42
  requirements:
43
43
  - - ! '>='
@@ -45,10 +45,10 @@ dependencies:
45
45
  version: '0'
46
46
  type: :runtime
47
47
  prerelease: false
48
- version_requirements: *70124439344500
48
+ version_requirements: *70258719656680
49
49
  - !ruby/object:Gem::Dependency
50
50
  name: rdf
51
- requirement: &70124439343180 !ruby/object:Gem::Requirement
51
+ requirement: &70258719655760 !ruby/object:Gem::Requirement
52
52
  none: false
53
53
  requirements:
54
54
  - - ~>
@@ -56,10 +56,10 @@ dependencies:
56
56
  version: '1.0'
57
57
  type: :runtime
58
58
  prerelease: false
59
- version_requirements: *70124439343180
59
+ version_requirements: *70258719655760
60
60
  - !ruby/object:Gem::Dependency
61
61
  name: rdf-rdfxml
62
- requirement: &70124439341020 !ruby/object:Gem::Requirement
62
+ requirement: &70258719654460 !ruby/object:Gem::Requirement
63
63
  none: false
64
64
  requirements:
65
65
  - - ! '>='
@@ -67,10 +67,10 @@ dependencies:
67
67
  version: '0'
68
68
  type: :runtime
69
69
  prerelease: false
70
- version_requirements: *70124439341020
70
+ version_requirements: *70258719654460
71
71
  - !ruby/object:Gem::Dependency
72
72
  name: rdf-n3
73
- requirement: &70124439339640 !ruby/object:Gem::Requirement
73
+ requirement: &70258719651620 !ruby/object:Gem::Requirement
74
74
  none: false
75
75
  requirements:
76
76
  - - ! '>='
@@ -78,10 +78,10 @@ dependencies:
78
78
  version: '0'
79
79
  type: :runtime
80
80
  prerelease: false
81
- version_requirements: *70124439339640
81
+ version_requirements: *70258719651620
82
82
  - !ruby/object:Gem::Dependency
83
83
  name: rdf-json
84
- requirement: &70124439354600 !ruby/object:Gem::Requirement
84
+ requirement: &70258719649660 !ruby/object:Gem::Requirement
85
85
  none: false
86
86
  requirements:
87
87
  - - ! '>='
@@ -89,10 +89,10 @@ dependencies:
89
89
  version: '0'
90
90
  type: :runtime
91
91
  prerelease: false
92
- version_requirements: *70124439354600
92
+ version_requirements: *70258719649660
93
93
  - !ruby/object:Gem::Dependency
94
94
  name: json-ld
95
- requirement: &70124439352980 !ruby/object:Gem::Requirement
95
+ requirement: &70258719666600 !ruby/object:Gem::Requirement
96
96
  none: false
97
97
  requirements:
98
98
  - - ! '>='
@@ -100,10 +100,10 @@ dependencies:
100
100
  version: '0'
101
101
  type: :runtime
102
102
  prerelease: false
103
- version_requirements: *70124439352980
103
+ version_requirements: *70258719666600
104
104
  - !ruby/object:Gem::Dependency
105
105
  name: guid
106
- requirement: &70124439352500 !ruby/object:Gem::Requirement
106
+ requirement: &70258719664320 !ruby/object:Gem::Requirement
107
107
  none: false
108
108
  requirements:
109
109
  - - ! '>='
@@ -111,10 +111,10 @@ dependencies:
111
111
  version: '0'
112
112
  type: :runtime
113
113
  prerelease: false
114
- version_requirements: *70124439352500
114
+ version_requirements: *70258719664320
115
115
  - !ruby/object:Gem::Dependency
116
116
  name: dalli
117
- requirement: &70124439351820 !ruby/object:Gem::Requirement
117
+ requirement: &70258719663440 !ruby/object:Gem::Requirement
118
118
  none: false
119
119
  requirements:
120
120
  - - ~>
@@ -122,7 +122,7 @@ dependencies:
122
122
  version: '2.6'
123
123
  type: :runtime
124
124
  prerelease: false
125
- version_requirements: *70124439351820
125
+ version_requirements: *70258719663440
126
126
  description: RDF ruby ORM
127
127
  email:
128
128
  - ric@swirrl.com
@@ -162,6 +162,7 @@ files:
162
162
  - lib/tripod/fields.rb
163
163
  - lib/tripod/fields/standard.rb
164
164
  - lib/tripod/finders.rb
165
+ - lib/tripod/locale/en.yml
165
166
  - lib/tripod/persistence.rb
166
167
  - lib/tripod/predicates.rb
167
168
  - lib/tripod/repository.rb
@@ -172,6 +173,7 @@ files:
172
173
  - lib/tripod/sparql_query.rb
173
174
  - lib/tripod/state.rb
174
175
  - lib/tripod/streaming.rb
176
+ - lib/tripod/validations/is_url.rb
175
177
  - lib/tripod/version.rb
176
178
  - spec/app/models/person.rb
177
179
  - spec/app/models/resource.rb
@@ -191,6 +193,7 @@ files:
191
193
  - spec/tripod/sparql_query_spec.rb
192
194
  - spec/tripod/state_spec.rb
193
195
  - spec/tripod/streaming_spec.rb
196
+ - spec/tripod/validations/is_url_spec.rb
194
197
  - tripod.gemspec
195
198
  homepage: http://github.com/Swirrl/tripod
196
199
  licenses: []
@@ -235,4 +238,5 @@ test_files:
235
238
  - spec/tripod/sparql_query_spec.rb
236
239
  - spec/tripod/state_spec.rb
237
240
  - spec/tripod/streaming_spec.rb
241
+ - spec/tripod/validations/is_url_spec.rb
238
242
  has_rdoc: