publish_my_data 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
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,11 @@
1
+ module PublishMyData
2
+ class Property
3
+ include Tripod::Resource
4
+ include PublishMyData::ResourceModule
5
+ include PublishMyData::DefinedByOntology
6
+
7
+ field :label, RDF::RDFS.label
8
+ field :defined_by, RDF::RDFS.isDefinedBy
9
+
10
+ end
11
+ end
@@ -2,5 +2,6 @@ module PublishMyData
2
2
  class RdfType
3
3
  include Tripod::Resource
4
4
  field :label, RDF::RDFS.label
5
+ field :comment, RDF::RDFS.comment
5
6
  end
6
7
  end
@@ -2,18 +2,92 @@ module PublishMyData
2
2
  class Resource
3
3
 
4
4
  include Tripod::Resource
5
+ include PublishMyData::ResourceModule #some common methods for resources.
5
6
 
6
7
  field :label, RDF::RDFS.label
8
+ field :rdf_type, RDF.type, :multivalued => true
7
9
 
8
- # Is this resource in the host domain?
9
- def local?
10
- uri.starts_with?("http://" + PublishMyData.local_domain)
10
+ def self.uri_from_host_and_doc_path(host, doc_path, format="")
11
+ 'http://' + host + '/id/' + doc_path.split('?')[0].sub(/\.#{format}$/,'')
11
12
  end
12
13
 
13
- class << self
14
+ def theme
15
+ dataset.theme_obj if dataset
16
+ end
17
+
18
+ def dataset
19
+ slug = Dataset.slug_from_data_graph_uri(self.graph_uri)
20
+ Dataset.find_by_slug(slug) rescue nil
21
+ end
22
+
23
+ # this calls render_params on the right type of RenderParams object.
24
+ # (strategy pattern-ish).
25
+ def render_params(request)
26
+ render_params_class.new(self).render_params(pagination_params: PaginationParams.from_request(request))
27
+ end
28
+
29
+ # Don't worry that these as_xxx methods look like they'll do an extra lookup.
30
+ # In production, it'll be cached from a moment ago anyway!
31
+
32
+ def as_ontology
33
+ Ontology.find(self.uri)
34
+ end
35
+
36
+ def as_concept_scheme
37
+ ConceptScheme.find(self.uri)
38
+ end
39
+
40
+ def as_concept
41
+ Concept.find(self.uri)
42
+ end
43
+
44
+ def as_property
45
+ Property.find(self.uri)
46
+ end
47
+
48
+ def as_ontology_class
49
+ OntologyClass.find(self.uri)
50
+ end
51
+
52
+ def is_ontology?
53
+ read_type_predicate.include?(RDF::OWL.Ontology)
54
+ end
55
+
56
+ def is_class?
57
+ read_type_predicate.include?(RDF::OWL.Class) || read_type_predicate.include?(RDF::RDFS.Class)
58
+ end
59
+
60
+ def is_property?
61
+ read_type_predicate.include?(RDF.Property)
62
+ end
63
+
64
+ def is_concept_scheme?
65
+ read_type_predicate.include?(RDF::SKOS.ConceptScheme)
66
+ end
67
+
68
+ def is_concept?
69
+ read_type_predicate.include?(RDF::SKOS.Concept)
70
+ end
71
+
72
+ private
73
+
74
+ def read_type_predicate
75
+ read_predicate(RDF.type)
76
+ end
14
77
 
15
- def uri_from_host_and_doc_path(host, doc_path, format="")
16
- 'http://' + host + '/id/' + doc_path.split('?')[0].sub(/\.#{format}$/,'')
78
+ def render_params_class
79
+ if self.is_ontology?
80
+ OntologyRenderParams
81
+ elsif self.is_class?
82
+ OntologyClassRenderParams
83
+ elsif self.is_property?
84
+ PropertyRenderParams
85
+ elsif self.is_concept_scheme?
86
+ ConceptSchemeRenderParams
87
+ elsif self.is_concept?
88
+ ConceptRenderParams
89
+ else
90
+ ResourceRenderParams
17
91
  end
18
92
  end
19
93
  end
@@ -0,0 +1,34 @@
1
+ module PublishMyData
2
+ # A theme for datasets
3
+ class Theme
4
+
5
+ include Tripod::Resource
6
+ include PublishMyData::ResourceModule #some common methods for resources.
7
+
8
+ class << self
9
+ def theme_graph
10
+ RDF::URI.new("http://#{PublishMyData.local_domain}/def/concept-scheme/themes")
11
+ end
12
+
13
+ def by_slug(slug)
14
+ Theme.where("?uri <#{RDF::SKOS.notation}> '#{slug}'").first
15
+ end
16
+ end
17
+
18
+ rdf_type RDF::SITE.Theme
19
+ graph_uri Theme.theme_graph
20
+
21
+ field :label, RDF::RDFS.label
22
+ field :slug, RDF::SKOS.notation
23
+ field :description, RDF::RDFS.description
24
+
25
+ def datasets_criteria
26
+ Dataset.where("?uri <#{RDF::DCAT.theme}> <#{self.uri.to_s}>")
27
+ end
28
+
29
+ def to_param
30
+ self.slug
31
+ end
32
+
33
+ end
34
+ end
@@ -4,7 +4,6 @@
4
4
  <title>PublishMyData</title>
5
5
  <%= stylesheet_link_tag "publish_my_data/application", :media => "all" %>
6
6
  <%= javascript_include_tag "publish_my_data/application" %>
7
- <%= csrf_meta_tags %>
8
7
  </head>
9
8
  <body>
10
9
 
@@ -1,3 +1,13 @@
1
- error layout
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>PublishMyData - Error</title>
5
+ <%= stylesheet_link_tag "publish_my_data/application", :media => "all" %>
6
+ <%= javascript_include_tag "publish_my_data/application" %>
7
+ </head>
8
+ <body>
2
9
 
3
- <%= yield %>
10
+ <%= yield %>
11
+
12
+ </body>
13
+ </html>
@@ -0,0 +1,3 @@
1
+ <% concept_scheme.concepts.each do |c| %>
2
+ <%= render 'publish_my_data/resources/predicates_table', :resource => c, :show_title => true %>
3
+ <% end %>
@@ -0,0 +1,9 @@
1
+ <h1>Concept Scheme: <%= concept_scheme.label || concept_scheme.uri %></h1>
2
+
3
+ <h2>Overview</h2>
4
+ <%= render 'publish_my_data/resources/predicates_table', resource: concept_scheme %>
5
+
6
+ <h2>Concepts</h2>
7
+ <%= render 'publish_my_data/concept_schemes/concepts', concept_scheme: concept_scheme %>
8
+
9
+ <%= render 'publish_my_data/resources/resource_formats', :resource => concept_scheme, :resource_descriptor => 'concept scheme' %>
@@ -0,0 +1,3 @@
1
+ <%= render 'uri_and_label', resource: concept %>
2
+ <%= render 'predicates_table', resource: concept %>
3
+ <%= render 'resource_formats', resource: concept %>
@@ -14,7 +14,7 @@
14
14
  <br/>
15
15
 
16
16
  Get this list as:
17
- <%= link_to 'N-triples', :format => 'nt', :page => @page, :per_page => @per_page %>
18
- <%= link_to 'Turtle', :format => 'ttl', :page => @page, :per_page => @per_page %>
19
- <%= link_to 'RDF/XML', :format => 'rdf',:page => @page, :per_page => @per_page %>
20
- <%= link_to 'JSON', :format => 'json', :page => @page, :per_page => @per_page %>
17
+ <%= link_to 'N-triples', :format => 'nt', :page => @pagination_params.page, :per_page => @pagination_params.per_page %>
18
+ <%= link_to 'Turtle', :format => 'ttl', :page => @pagination_params.page, :per_page => @pagination_params.per_page %>
19
+ <%= link_to 'RDF/XML', :format => 'rdf',:page => @pagination_params.page, :per_page => @pagination_params.per_page %>
20
+ <%= link_to 'JSON', :format => 'json', :page => @pagination_params.page, :per_page => @pagination_params.per_page %>
@@ -1,4 +1,4 @@
1
- <h1><%= @dataset.title %></h1>
1
+ <h1>Dataset: <%= @dataset.title %></h1>
2
2
 
3
3
  <%= @dataset.description %>
4
4
 
@@ -0,0 +1 @@
1
+ <h1>Bad request</h1>
@@ -1 +1 @@
1
- Not found.
1
+ <h1>Not found</h1>
@@ -0,0 +1 @@
1
+ <h1>Timeout</h1>
@@ -0,0 +1,6 @@
1
+ <h1>Uncaught Error</h1>
2
+
3
+ <% if Rails.env.development? %>
4
+ <p><strong><%= @e.class.name %>: <%= @e.message %></strong></p>
5
+ <p><%= @e.backtrace.join("<br/>").html_safe %></p>
6
+ <% end %>
@@ -0,0 +1,3 @@
1
+ <% ontology.ontology_classes.each do |c| %>
2
+ <%= render 'publish_my_data/resources/predicates_table', :resource => c, :show_title => true %>
3
+ <% end %>
@@ -0,0 +1,3 @@
1
+ <% ontology.ontology_properties.each do |p| %>
2
+ <%= render 'publish_my_data/resources/predicates_table', :resource => p, :show_title => true %>
3
+ <% end %>
@@ -0,0 +1,17 @@
1
+ <h1>Ontology <%= ontology.label || ontology.uri %></h1>
2
+
3
+ <h2>Overview</h2>
4
+ <%= render 'publish_my_data/resources/predicates_table', resource: ontology %>
5
+
6
+ <h2>Classes</h2>
7
+ <%= render 'publish_my_data/ontologies/classes', :ontology => ontology %>
8
+
9
+ <br/>
10
+
11
+ <h2>Properties</h2>
12
+ <%= render 'publish_my_data/ontologies/properties', :ontology => ontology %>
13
+
14
+ <br/><br/>
15
+
16
+ Get this ontology as:
17
+ <%= render 'publish_my_data/resources/resource_formats', :resource => ontology, :resource_descriptor => "ontology" %>
@@ -0,0 +1,3 @@
1
+ <%= render 'uri_and_label', resource: property %>
2
+ <%= render 'predicates_table', resource: property %>
3
+ <%= render 'resource_formats', resource: property %>
@@ -1,19 +1,27 @@
1
1
  <table>
2
2
  <thead>
3
+ <% if defined?(show_title) && show_title %>
4
+ <tr>
5
+ <td colspan="2">
6
+ <%= resource.label %><br/>
7
+ <%= resource.uri %>
8
+ </td>
9
+ </tr>
10
+ <% end %>
3
11
  <tr>
4
12
  <th>Predicate</th>
5
13
  <th>Object</th>
6
14
  </tr>
7
15
  </thead>
8
16
  <tbody>
9
- <% @resource.predicates.each do |pred| %>
17
+ <% resource.predicates.each do |pred| %>
10
18
  <tr>
11
19
  <td>
12
- <%= resource_uri_or_label(pred) %>
20
+ <%= resource_uri_or_label(resource, pred) %>
13
21
  </td>
14
22
  <td>
15
- <% @resource.read_predicate(pred).each do |obj| %>
16
- <%= resource_uri_or_label(obj) %>
23
+ <% resource.read_predicate(pred).each do |obj| %>
24
+ <%= resource_uri_or_label(resource, obj) %>
17
25
  <% end %>
18
26
  </td>
19
27
  </tr>
@@ -1,11 +1,11 @@
1
- <% if @resource.local? %>
1
+ <% if resource.local? %>
2
2
  <%= link_to "JSON", :format => 'json' %>
3
3
  <%= link_to "RDF/XML", :format => 'rdf' %>
4
4
  <%= link_to "Turtle", :format => 'ttl' %>
5
5
  <%= link_to "N-triples", :format => 'nt' %>
6
6
  <% else %>
7
- <%= link_to "JSON", show_resource_path(:uri => @resource.uri, :format => 'json') %>
8
- <%= link_to "RDF/XML", show_resource_path(:uri => @resource.uri, :format => 'rdf') %>
9
- <%= link_to "Turtle", show_resource_path(:uri => @resource.uri, :format => 'ttl') %>
10
- <%= link_to "N-triples", show_resource_path(:uri => @resource.uri, :format => 'nt') %>
7
+ <%= link_to "JSON", show_resource_path(:uri => resource.uri, :format => 'json') %>
8
+ <%= link_to "RDF/XML", show_resource_path(:uri => resource.uri, :format => 'rdf') %>
9
+ <%= link_to "Turtle", show_resource_path(:uri => resource.uri, :format => 'ttl') %>
10
+ <%= link_to "N-triples", show_resource_path(:uri => resource.uri, :format => 'nt') %>
11
11
  <% end %>
@@ -1,3 +1,3 @@
1
- URI: <%= @resource.uri %>
1
+ URI: <%= resource.uri %>
2
2
  <br/>
3
- Label: <%= @resource.label.present? ? @resource.label : "No Label Set" %>
3
+ Label: <%= resource.label.present? ? resource.label : "No Label Set" %>
@@ -33,7 +33,7 @@
33
33
  <br/>
34
34
 
35
35
  Get this list as:
36
- <%= link_to 'N-triples', :format => 'nt', :page => @page, :per_page => @per_page %>
37
- <%= link_to 'Turtle', :format => 'ttl', :page => @page, :per_page => @per_page %>
38
- <%= link_to 'RDF/XML', :format => 'rdf',:page => @page, :per_page => @per_page %>
39
- <%= link_to 'JSON', :format => 'json', :page => @page, :per_page => @per_page %>
36
+ <%= link_to 'N-triples', :format => 'nt', :page => @pagination_params.page, :per_page => @pagination_params.per_page %>
37
+ <%= link_to 'Turtle', :format => 'ttl', :page => @pagination_params.page, :per_page => @pagination_params.per_page %>
38
+ <%= link_to 'RDF/XML', :format => 'rdf',:page => @pagination_params.page, :per_page => @pagination_params.per_page %>
39
+ <%= link_to 'JSON', :format => 'json', :page => @pagination_params.page, :per_page => @pagination_params.per_page %>
@@ -1,3 +1,3 @@
1
- <%= render 'uri_and_label' %>
2
- <%= render 'predicates_table' %>
3
- <%= render 'resource_formats' %>
1
+ <%= render 'uri_and_label', resource: resource %>
2
+ <%= render 'predicates_table', resource: resource %>
3
+ <%= render 'resource_formats', resource: resource %>
@@ -1,6 +1,6 @@
1
1
  <nav class="pagination clearfix">
2
2
  <% #only show prev link if there's a previous page %>
3
- <%= link_to("Previous #{@per_page} results".html_safe, params.merge({:page => (@page-1)})) if @page > 1 %>
3
+ <%= link_to("Previous #{@pagination_params.per_page} results".html_safe, params.merge({:page => (@pagination_params.page-1)})) if @pagination_params.page > 1 %>
4
4
  <% #only show the next page if the results for this page is bigger than the page size %>
5
- <%= link_to("Next #{@per_page} results".html_safe, params.merge({:page => (@page+1)}), :style => 'float:right' ) if @more_pages%>
5
+ <%= link_to("Next #{@pagination_params.per_page} results".html_safe, params.merge({:page => (@pagination_params.page+1)}), :style => 'float:right' ) if @more_pages%>
6
6
  </nav>
@@ -0,0 +1,12 @@
1
+ <h1>Themes</h1>
2
+
3
+ <% @themes.each do |t| %>
4
+ <%= link_to (t.label || t.uri), theme_path(t) %> (<%= pluralize( t.datasets_criteria.count, "datasets" )%>)
5
+ <% end %>
6
+
7
+ <br/><br/>
8
+ Get this list as:
9
+ <%= link_to 'N-triples', :format => 'nt' %>
10
+ <%= link_to 'Turtle', :format => 'ttl' %>
11
+ <%= link_to 'RDF/XML', :format => 'rdf' %>
12
+ <%= link_to 'JSON', :format => 'json' %>
@@ -0,0 +1,15 @@
1
+ <h1>Theme: <%= @theme.label %></h1>
2
+
3
+ <p><%= @theme.description %></p>
4
+
5
+ Datasets in this theme: <br/>
6
+ <% @datasets.each do |d| %>
7
+ <%= link_to d.title, d %> <br/>
8
+ <% end %>
9
+ <br/>
10
+ <%= paginate @datasets %>
11
+ Get this list of datasets as:
12
+ <%= link_to 'N-triples', :format => 'nt', :page => @pagination_params.page, :per_page => @pagination_params.per_page %>
13
+ <%= link_to 'Turtle', :format => 'ttl', :page => @pagination_params.page, :per_page => @pagination_params.per_page %>
14
+ <%= link_to 'RDF/XML', :format => 'rdf',:page => @pagination_params.page, :per_page => @pagination_params.per_page %>
15
+ <%= link_to 'JSON', :format => 'json', :page => @pagination_params.page, :per_page => @pagination_params.per_page %>
File without changes
@@ -0,0 +1,6 @@
1
+ module RDF
2
+ SITE = RDF::Vocabulary.new("http://#{PublishMyData.local_domain}/def/")
3
+ PMD_DS = RDF::Vocabulary.new("http://#{PublishMyData.local_domain}/def/dataset#")
4
+ DCAT = RDF::Vocabulary.new("http://www.w3.org/ns/dcat#")
5
+ VOID = RDF::Vocabulary.new("http://rdfs.org/ns/void#")
6
+ end
@@ -0,0 +1,7 @@
1
+ # This loads all the factories, so they can be used by the rails console in target apps.
2
+ if Rails.env.development?
3
+ path = File.expand_path("../../../spec/factories/*.rb", __FILE__)
4
+ Dir[path].each do |factory|
5
+ require factory
6
+ end
7
+ end
data/config/routes.rb CHANGED
@@ -10,11 +10,10 @@ PublishMyData::Engine.routes.draw do
10
10
  match "/resources(.:format)" => "resources#index", :as => 'list_resources' # +filters on thh query string
11
11
 
12
12
  # datasets
13
- resources :datasets, :only => [:show, :index] do
14
- collection do
15
- get 'themes'
16
- end
17
- end
13
+ resources :datasets, :only => [:show, :index]
14
+
15
+ # themes
16
+ resources :themes, :only => [:index, :show]
18
17
 
19
18
  # URI dereferencing
20
19
  match "/id/*path" => "resources#id"
@@ -0,0 +1,10 @@
1
+ module PublishMyData
2
+ module DefinedByOntology
3
+
4
+ def defined_by_ontology
5
+ ontology_uri = read_predicate(RDF::RDFS.isDefinedBy).first
6
+ Ontology.find(ontology_uri) rescue nil if ontology_uri
7
+ end
8
+
9
+ end
10
+ end