publish_my_data 0.0.3 → 0.0.4

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.
Files changed (72) hide show
  1. data/README.md +2 -3
  2. data/app/controllers/publish_my_data/application_controller.rb +21 -32
  3. data/app/controllers/publish_my_data/datasets_controller.rb +7 -19
  4. data/app/controllers/publish_my_data/resources_controller.rb +18 -24
  5. data/app/controllers/publish_my_data/sparql_controller.rb +6 -3
  6. data/app/controllers/publish_my_data/themes_controller.rb +28 -0
  7. data/app/helpers/publish_my_data/resources_helper.rb +2 -2
  8. data/app/models/publish_my_data/concept.rb +14 -0
  9. data/app/models/publish_my_data/concept_scheme.rb +16 -0
  10. data/app/models/publish_my_data/dataset.rb +48 -13
  11. data/app/models/publish_my_data/ontology.rb +35 -0
  12. data/app/models/publish_my_data/ontology_class.rb +11 -0
  13. data/app/models/publish_my_data/property.rb +11 -0
  14. data/app/models/publish_my_data/rdf_type.rb +1 -0
  15. data/app/models/publish_my_data/resource.rb +80 -6
  16. data/app/models/publish_my_data/theme.rb +34 -0
  17. data/app/views/layouts/publish_my_data/application.html.erb +0 -1
  18. data/app/views/layouts/publish_my_data/error.html.erb +12 -2
  19. data/app/views/publish_my_data/concept_schemes/_concepts.html.erb +3 -0
  20. data/app/views/publish_my_data/concept_schemes/show.html.erb +9 -0
  21. data/app/views/publish_my_data/concepts/show.html.erb +3 -0
  22. data/app/views/publish_my_data/datasets/index.html.erb +4 -4
  23. data/app/views/publish_my_data/datasets/show.html.erb +1 -1
  24. data/app/views/publish_my_data/errors/bad_request.html.erb +1 -0
  25. data/app/views/publish_my_data/errors/not_found.html.erb +1 -1
  26. data/app/views/publish_my_data/errors/timeout.html.erb +1 -0
  27. data/app/views/publish_my_data/errors/uncaught.html.erb +6 -0
  28. data/app/views/publish_my_data/ontologies/_classes.html.erb +3 -0
  29. data/app/views/publish_my_data/ontologies/_properties.html.erb +3 -0
  30. data/app/views/publish_my_data/ontologies/show.html.erb +17 -0
  31. data/app/views/publish_my_data/properties/show.html.erb +3 -0
  32. data/app/views/publish_my_data/resources/_predicates_table.html.erb +12 -4
  33. data/app/views/publish_my_data/resources/_resource_formats.html.erb +5 -5
  34. data/app/views/publish_my_data/resources/_uri_and_label.html.erb +2 -2
  35. data/app/views/publish_my_data/resources/index.html.erb +4 -4
  36. data/app/views/publish_my_data/resources/show.html.erb +3 -3
  37. data/app/views/publish_my_data/sparql/_pagination.html.erb +2 -2
  38. data/app/views/publish_my_data/themes/index.html.erb +12 -0
  39. data/app/views/publish_my_data/themes/show.html.erb +15 -0
  40. data/config/initializers/{tripod.rb → 00_tripod.rb} +0 -0
  41. data/config/initializers/10_vocabularies.rb +6 -0
  42. data/config/initializers/zz_factories.rb +7 -0
  43. data/config/routes.rb +4 -5
  44. data/lib/publish_my_data/defined_by_ontology.rb +10 -0
  45. data/lib/publish_my_data/paginator.rb +63 -0
  46. data/lib/publish_my_data/render_params/concept_render_params.rb +14 -0
  47. data/lib/publish_my_data/render_params/concept_scheme_render_params.rb +14 -0
  48. data/lib/publish_my_data/render_params/ontology_class_render_params.rb +14 -0
  49. data/lib/publish_my_data/render_params/ontology_render_params.rb +14 -0
  50. data/lib/publish_my_data/render_params/property_render_params.rb +14 -0
  51. data/lib/publish_my_data/render_params/resource_render_params.rb +13 -0
  52. data/lib/publish_my_data/render_params/theme_render_params.rb +23 -0
  53. data/lib/publish_my_data/render_params.rb +7 -0
  54. data/lib/publish_my_data/resource_module.rb +8 -0
  55. data/lib/publish_my_data/version.rb +1 -1
  56. data/lib/publish_my_data.rb +6 -1
  57. data/spec/controllers/publish_my_data/datasets_controller_spec.rb +0 -10
  58. data/spec/controllers/publish_my_data/resources_controller_spec.rb +78 -38
  59. data/spec/controllers/publish_my_data/sparql_controller_spec.rb +4 -4
  60. data/spec/controllers/publish_my_data/themes_controller_spec.rb +110 -0
  61. data/spec/dummy/log/test.log +80255 -0
  62. data/spec/factories/00_theme_factories.rb +11 -0
  63. data/spec/factories/concept_scheme_factories.rb +48 -0
  64. data/spec/factories/dataset_factories.rb +10 -1
  65. data/spec/factories/ontology_factories.rb +55 -0
  66. data/spec/factories/property_factories.rb +2 -2
  67. data/spec/factories/resource_factories.rb +5 -5
  68. metadata +61 -16
  69. data/app/assets/javascripts/publish_my_data/resources.js +0 -2
  70. data/app/assets/stylesheets/publish_my_data/resources.css +0 -4
  71. data/app/views/publish_my_data/datasets/themes.html.erb +0 -3
  72. data/config/initializers/vocabularies.rb +0 -1
@@ -0,0 +1,63 @@
1
+ module PublishMyData
2
+
3
+ class PaginationParams
4
+
5
+ DEFAULT_PAGE_SIZE = 20
6
+ MAX_PAGE_SIZE = 10000
7
+
8
+ attr_accessor :page
9
+ attr_accessor :per_page
10
+ attr_accessor :offset
11
+ attr_accessor :format
12
+
13
+ # example opts:
14
+ # {:per_page => 10, :page => 2, :format => :html}
15
+ def initialize(opts={})
16
+ self.per_page = (opts[:per_page] || PaginationParams::DEFAULT_PAGE_SIZE).to_i
17
+ self.per_page = PaginationParams::MAX_PAGE_SIZE if self.per_page > PaginationParams::MAX_PAGE_SIZE
18
+ self.page = (opts[:page] || 1).to_i
19
+ self.offset = self.per_page.to_i * (self.page.to_i-1)
20
+ self.format = opts[:format]
21
+ end
22
+
23
+ def self.from_request(request)
24
+ PaginationParams.new(per_page: request.params[:per_page], page: request.params[:page], format: request.format.to_sym)
25
+ end
26
+
27
+ def ==(other)
28
+ other.page == self.page &&
29
+ other.per_page == self.per_page &&
30
+ other.format == self.format
31
+ end
32
+
33
+ end
34
+
35
+ class Paginator
36
+
37
+ attr_accessor :pagination_params
38
+ attr_accessor :criteria
39
+
40
+ def initialize(criteria, pagination_params)
41
+ self.criteria = criteria
42
+ self.pagination_params = pagination_params
43
+ end
44
+
45
+ # returns a Kaminari paginatable array, or a plain old array
46
+ def paginate
47
+ count = criteria.count #this has to happen first, before we modify the criteria with limit/offset
48
+ resources = criteria.limit(self.pagination_params.per_page).offset(self.pagination_params.offset).resources
49
+
50
+ if self.pagination_params.format == :html
51
+ Kaminari.paginate_array(resources.to_a, total_count: count).page(self.pagination_params.page).per(self.pagination_params.per_page)
52
+ else
53
+ resources # non html versions just need the raw array
54
+ end
55
+ end
56
+
57
+ def ==(other)
58
+ self.pagination_params == other.pagination_params &&
59
+ self.criteria == other.criteria
60
+ end
61
+
62
+ end
63
+ end
@@ -0,0 +1,14 @@
1
+ module PublishMyData
2
+ class ConceptRenderParams
3
+
4
+ def initialize(resource)
5
+ @resource = resource
6
+ @concept = resource.as_concept
7
+ end
8
+
9
+ def render_params(opts={})
10
+ {template: 'publish_my_data/concepts/show', locals: {concept: @concept}}
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module PublishMyData
2
+ class ConceptSchemeRenderParams
3
+
4
+ def initialize(resource)
5
+ @resource = resource
6
+ @concept_scheme = resource.as_concept_scheme
7
+ end
8
+
9
+ def render_params(opts={})
10
+ {template: 'publish_my_data/concept_schemes/show', locals: {concept_scheme: @concept_scheme}}
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module PublishMyData
2
+ class OntologyClassRenderParams
3
+
4
+ def initialize(resource)
5
+ @resource = resource
6
+ @ontology_class = resource.as_ontology_class
7
+ end
8
+
9
+ def render_params(opts={})
10
+ {template: 'publish_my_data/classes/show', locals: {ontology_class: @ontology_class}}
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module PublishMyData
2
+ class OntologyRenderParams
3
+
4
+ def initialize(resource)
5
+ @resource = resource
6
+ @ontology = resource.as_ontology
7
+ end
8
+
9
+ def render_params(opts={})
10
+ {template: 'publish_my_data/ontologies/show', locals: {ontology: @ontology}}
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module PublishMyData
2
+ class PropertyRenderParams
3
+
4
+ def initialize(resource)
5
+ @resource = resource
6
+ @property = resource.as_property
7
+ end
8
+
9
+ def render_params(opts={})
10
+ {template: 'publish_my_data/properties/show', locals: {property: @property}}
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ module PublishMyData
2
+ class ResourceRenderParams
3
+
4
+ def initialize(resource)
5
+ @resource = resource
6
+ end
7
+
8
+ def render_params(opts={})
9
+ {template: 'publish_my_data/resources/show', locals: {resource: @resource}}
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,23 @@
1
+ module PublishMyData
2
+ class ThemeRenderParams
3
+
4
+ def initialize(resource)
5
+ @resource = resource
6
+ @theme = resource.as_theme
7
+ end
8
+
9
+ # e.g. opts[:pagination_params] => PaginationParams.new
10
+ def render_params(opts)
11
+ datasets = Paginator.new(@theme.datasets_criteria, opts[:pagination_params]).paginate
12
+ {
13
+ template: 'publish_my_data/themes/show',
14
+ locals: {
15
+ theme: @theme,
16
+ datasets: datasets,
17
+ pagination_params: opts[:pagination_params]
18
+ }
19
+ }
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,7 @@
1
+ require "publish_my_data/render_params/resource_render_params"
2
+ require "publish_my_data/render_params/ontology_render_params"
3
+ require "publish_my_data/render_params/theme_render_params"
4
+ require "publish_my_data/render_params/property_render_params"
5
+ require "publish_my_data/render_params/ontology_class_render_params"
6
+ require "publish_my_data/render_params/concept_scheme_render_params"
7
+ require "publish_my_data/render_params/concept_render_params"
@@ -0,0 +1,8 @@
1
+ module PublishMyData
2
+ module ResourceModule
3
+ # Is this resource in the host domain?
4
+ def local?
5
+ uri.starts_with?("http://" + PublishMyData.local_domain)
6
+ end
7
+ end
8
+ end
@@ -1,3 +1,3 @@
1
1
  module PublishMyData
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -2,9 +2,13 @@ require "publish_my_data/engine"
2
2
  require "publish_my_data/renderers"
3
3
  require "publish_my_data/sparql_query"
4
4
  require "publish_my_data/sparql_query_result"
5
+ require "publish_my_data/resource_module"
6
+ require "publish_my_data/defined_by_ontology"
7
+ require "publish_my_data/paginator"
8
+ require "publish_my_data/render_params"
5
9
 
6
- module PublishMyData
7
10
 
11
+ module PublishMyData
8
12
 
9
13
  # The local domain of the website. Used to decide if resources andexdsf
10
14
  # datasets are local or not
@@ -37,6 +41,7 @@ module PublishMyData
37
41
  end
38
42
 
39
43
  require 'kaminari'
44
+ require 'rdiscount'
40
45
 
41
46
  Kaminari.configure do |config|
42
47
  config.default_per_page = 20
@@ -87,7 +87,6 @@ module PublishMyData
87
87
  graph = Dataset.metadata_graph_uri(slug)
88
88
  d = PublishMyData::Dataset.new(uri, graph)
89
89
  d.title = "Dataset #{i.to_s}"
90
- d.theme = (i.even? ? 'theme' : 'othertheme')
91
90
  d.save!
92
91
  end
93
92
  end
@@ -175,15 +174,6 @@ module PublishMyData
175
174
  end
176
175
  end
177
176
 
178
- context "with a theme parameter" do
179
- let(:theme) {'theme'}
180
-
181
- it "should filter the results to only datasets in the theme" do
182
- get :index, theme: theme, use_route: :publish_my_data
183
- assigns['datasets'].length.should == 15 # only the even ones are in this theme
184
- end
185
- end
186
-
187
177
  end
188
178
 
189
179
  end
@@ -15,6 +15,7 @@ module PublishMyData
15
15
  response.status.should eq(303)
16
16
  response.should redirect_to "/doc/this/is/my/path"
17
17
  end
18
+
18
19
  end
19
20
 
20
21
  context "with an alternative mime type passed in the header" do
@@ -29,32 +30,31 @@ module PublishMyData
29
30
  response.content_type.should == Mime::RDF
30
31
  end
31
32
  end
32
-
33
33
  end
34
34
 
35
35
  describe "#doc" do
36
36
 
37
- before do
38
- @resource = FactoryGirl.create(:yuri_unicorn_resource)
39
- end
37
+ let!(:resource) { FactoryGirl.create(:yuri_unicorn_resource) }
40
38
 
41
39
  it "should respond successfully" do
42
40
  get :doc, :path => "unicorns/yuri", use_route: :publish_my_data
43
41
  response.should be_success
44
42
  end
45
43
 
46
- it "should render the show template" do
47
- get :doc, :path => "unicorns/yuri", use_route: :publish_my_data
48
- response.should render_template("publish_my_data/resources/show")
49
- end
50
-
51
44
  context "for html" do
52
45
  it "should eager load the labels" do
53
- Resource.should_receive(:find).and_return(@resource)
54
- @resource.should_receive(:eager_load_predicate_triples!)
55
- @resource.should_receive(:eager_load_object_triples!)
46
+ Resource.should_receive(:find).and_return(resource)
47
+ resource.should_receive(:eager_load_predicate_triples!)
48
+ resource.should_receive(:eager_load_object_triples!)
56
49
  get :doc, :path => "unicorns/yuri", use_route: :publish_my_data
57
50
  end
51
+
52
+ context "with an arbitrary resource" do
53
+ it "should render the show template" do
54
+ get :doc, :path => "unicorns/yuri", use_route: :publish_my_data
55
+ response.should render_template("publish_my_data/resources/show")
56
+ end
57
+ end
58
58
  end
59
59
 
60
60
  context "with an alternative mime type passed in the header" do
@@ -69,13 +69,13 @@ module PublishMyData
69
69
  end
70
70
 
71
71
  it "should respond with the right content" do
72
- response.body.should == @resource.to_rdf
72
+ response.body.should == resource.to_rdf
73
73
  end
74
74
 
75
75
  it "should not eager load the labels" do
76
- Resource.should_receive(:find).and_return(@resource)
77
- @resource.should_not_receive(:eager_load_predicate_triples!)
78
- @resource.should_not_receive(:eager_load_object_triples!)
76
+ Resource.should_receive(:find).and_return(resource)
77
+ resource.should_not_receive(:eager_load_predicate_triples!)
78
+ resource.should_not_receive(:eager_load_object_triples!)
79
79
  get :doc, :path => "unicorns/yuri", use_route: :publish_my_data
80
80
  end
81
81
 
@@ -98,7 +98,7 @@ module PublishMyData
98
98
 
99
99
  it "should respond with the right content" do
100
100
  get :doc, :path => "unicorns/yuri", format: 'ttl', use_route: :publish_my_data
101
- response.body.should == @resource.to_ttl
101
+ response.body.should == resource.to_ttl
102
102
  end
103
103
 
104
104
  end
@@ -114,13 +114,26 @@ module PublishMyData
114
114
  end
115
115
 
116
116
  end
117
-
118
117
  end
119
118
 
120
119
  describe "#definition" do
121
120
 
121
+ let!(:resource) { FactoryGirl.create(:mean_result) }
122
+ let!(:theme) { FactoryGirl.create(:my_theme) }
123
+ let!(:onotology) { FactoryGirl.create(:ontology) }
124
+ let!(:concept_scheme) { FactoryGirl.create(:concept_scheme) }
125
+
122
126
  before do
123
- @resource = FactoryGirl.create(:mean_result)
127
+ # make some datasets
128
+ (1..30).each do |i|
129
+ slug = i
130
+ uri = PublishMyData::Dataset.uri_from_slug(slug)
131
+ graph = PublishMyData::Dataset.metadata_graph_uri(slug)
132
+ d = PublishMyData::Dataset.new(uri, graph)
133
+ d.theme = theme.uri if i.even?
134
+ d.title = "Dataset #{i.to_s}"
135
+ d.save!
136
+ end
124
137
  end
125
138
 
126
139
  context "for resource in our database" do
@@ -130,19 +143,39 @@ module PublishMyData
130
143
  response.should be_success
131
144
  end
132
145
 
133
- it "should render the doc template" do
134
- get :definition, :path => "statistics/meanResult", use_route: :publish_my_data
135
- response.should render_template("publish_my_data/resources/show")
146
+ context "for an html request" do
147
+
148
+ context "for an abitrary resource" do
149
+ it "should render the show template" do
150
+ get :definition, :path => "statistics/meanResult", use_route: :publish_my_data
151
+ response.should render_template("publish_my_data/resources/show")
152
+ end
153
+ end
154
+
155
+ context "when resource is an ontology" do
156
+ it "should render the ontologies#show template" do
157
+ get :definition, :path => "my-topic/ontology", use_route: :publish_my_data
158
+ response.should render_template("publish_my_data/ontologies/show")
159
+ end
160
+ end
161
+
162
+ context "when resource is a concept scheme" do
163
+ it "should render the concept_schemes#show template" do
164
+ get :definition, :path => "my-topic/concept-scheme/my-concept-scheme", use_route: :publish_my_data
165
+ response.should render_template("publish_my_data/concept_schemes/show")
166
+ end
167
+ end
168
+
136
169
  end
137
170
 
171
+
138
172
  context "with an alternative mime type" do
139
173
  it "should with the right mime type and content" do
140
174
  get :definition, :path => "statistics/meanResult", :format => 'nt', use_route: :publish_my_data
141
175
  response.content_type.should == Mime::NT
142
- response.body.should == @resource.to_nt
176
+ response.body.should == resource.to_nt
143
177
  end
144
178
  end
145
-
146
179
  end
147
180
 
148
181
  context "when resource doesn't exist" do
@@ -151,7 +184,6 @@ module PublishMyData
151
184
  response.should be_not_found
152
185
  end
153
186
  end
154
-
155
187
  end
156
188
 
157
189
  describe "#show" do
@@ -188,30 +220,40 @@ module PublishMyData
188
220
 
189
221
  context "with a resource in our database" do
190
222
 
191
- before do
192
- uri = 'http://uri'
193
- graph = 'http://graph'
194
- r = Resource.new(uri, graph)
195
- r.write_predicate('http://foo', 'blah')
196
- r.save!
197
-
198
- get :show, :uri => r.uri, use_route: :publish_my_data
199
- end
223
+ let!(:resource) { FactoryGirl.create(:foreign_resource) }
224
+ let!(:external_concept_scheme) { FactoryGirl.create(:external_concept_scheme) }
225
+ let!(:external_ontology) { FactoryGirl.create(:external_ontology) }
200
226
 
201
227
  it "should respond succesfully" do
228
+ get :show, :uri => resource.uri, use_route: :publish_my_data
202
229
  response.should be_success
203
230
  end
204
231
 
205
232
  it "should render the show template" do
233
+ get :show, :uri => resource.uri, use_route: :publish_my_data
206
234
  response.should render_template("publish_my_data/resources/show")
207
235
  end
208
236
 
237
+ context "when resource is an ontology" do
238
+ it "should render the ontologies#show template" do
239
+ get :show, :uri => external_ontology.uri, use_route: :publish_my_data
240
+ response.should render_template("publish_my_data/ontologies/show")
241
+ end
242
+ end
243
+
244
+ context "when resource is a concept scheme" do
245
+ it "should render the concept_schemes#show template" do
246
+ get :show, :uri => external_concept_scheme.uri, use_route: :publish_my_data
247
+ response.should render_template("publish_my_data/concept_schemes/show")
248
+ end
249
+ end
250
+
209
251
  end
210
252
  end
211
253
 
212
254
  describe "#index" do
213
255
 
214
- shared_examples_for "resource kaminari pagination" do
256
+ shared_examples_for "resource kaminari pagination" do
215
257
  it "should call kaminari to paginate the results" do
216
258
  res_array = Resource.all.limit(per_page).offset(offset).resources.to_a
217
259
  count = Resource.count
@@ -287,7 +329,7 @@ module PublishMyData
287
329
  end
288
330
 
289
331
  it "should return paginated results for Resource.all" do
290
- subject.should_receive(:paginate_resources).with(Resource.all).and_call_original
332
+ Paginator.should_receive(:new).with(Resource.all, PaginationParams.from_request(@request)).and_call_original
291
333
  get :index, use_route: :publish_my_data
292
334
  assigns['resources'].length.should == 10 # 8 resources, plus ds and type!
293
335
  end
@@ -393,7 +435,5 @@ module PublishMyData
393
435
  end
394
436
  end
395
437
 
396
-
397
-
398
438
  end
399
439
  end