tripod 0.7.5 → 0.7.7

Sign up to get free protection for your applications and to get access to all the features.
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: