easy_data 0.0.2 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/README +7 -0
  2. data/Rakefile +4 -0
  3. data/easy_data.gemspec +4 -1
  4. data/lib/controllers/easy_datas_controller.rb +122 -21
  5. data/lib/data_models/data_models.rb +25 -19
  6. data/lib/data_models/model_rdf.rb +156 -0
  7. data/lib/data_models/namespaces/cc.rb +36 -0
  8. data/lib/data_models/namespaces/cert.rb +33 -0
  9. data/lib/data_models/namespaces/dc.rb +87 -0
  10. data/lib/data_models/namespaces/dc11.rb +47 -0
  11. data/lib/data_models/namespaces/doap.rb +68 -0
  12. data/lib/data_models/namespaces/exif.rb +192 -0
  13. data/lib/data_models/namespaces/foaf.rb +93 -0
  14. data/lib/data_models/namespaces/geo.rb +35 -0
  15. data/lib/data_models/namespaces/http.rb +50 -0
  16. data/lib/data_models/namespaces/owl.rb +83 -0
  17. data/lib/data_models/namespaces/rdfs.rb +41 -0
  18. data/lib/data_models/namespaces/rsa.rb +35 -0
  19. data/lib/data_models/namespaces/rss.rb +38 -0
  20. data/lib/data_models/namespaces/sioc.rb +110 -0
  21. data/lib/data_models/namespaces/skos.rb +61 -0
  22. data/lib/data_models/namespaces/wot.rb +45 -0
  23. data/lib/data_models/namespaces/xhtml.rb +32 -0
  24. data/lib/data_models/namespaces/xsd.rb +77 -0
  25. data/lib/data_models/namespaces.rb +28 -0
  26. data/lib/data_models/parser_rdf.rb +22 -0
  27. data/lib/easy_data/tasks.rb +86 -0
  28. data/lib/easy_data/templates/easy_datas/_list_properties.html.erb +24 -0
  29. data/lib/easy_data/templates/easy_datas/_list_properties_edit.html.erb +34 -0
  30. data/lib/easy_data/templates/easy_datas/_model_attributes.html.erb +27 -0
  31. data/lib/easy_data/templates/easy_datas/_model_attributes_edit.html.erb +13 -0
  32. data/lib/easy_data/templates/easy_datas/custom_rdf.html.erb +23 -0
  33. data/lib/easy_data/templates/easy_datas/show.html.erb +1 -0
  34. data/lib/easy_data/templates/easy_datas/show.xml.builder +16 -0
  35. data/lib/easy_data/templates/layouts/easy_data_layout.html.erb +15 -0
  36. data/lib/easy_data/templates/rdf/request.xml.builder +1 -0
  37. data/lib/easy_data/templates/rdf/show.builder +1 -0
  38. data/lib/easy_data/templates/stylesheets/.easy_data_style.css.swp +0 -0
  39. data/lib/easy_data/templates/stylesheets/easy_data_style.css +10 -0
  40. data/lib/easy_data/version.rb +1 -1
  41. data/lib/easy_data.rb +51 -2
  42. data/lib/routes.rb +38 -6
  43. data/lib/tasks/.rakes.rb.swp +0 -0
  44. data/lib/tasks/testing_installation.rb +2 -2
  45. metadata +72 -6
data/README CHANGED
@@ -12,6 +12,13 @@ In config/routes.rb at the end of routes declarations include:
12
12
 
13
13
  EasyDataRouting.routes(map)
14
14
 
15
+ After, in [RAILS_HOME]/Rakefile copy this line:
16
+
17
+ require "easy_data/tasks"
18
+
19
+ At the end, execute the next task:
20
+
21
+ rake easy_data:install RAILS_ENV=development
15
22
 
16
23
  Commandas and Query
17
24
  ======================
data/Rakefile CHANGED
@@ -2,3 +2,7 @@ require 'bundler/gem_tasks'
2
2
 
3
3
  require 'yard' #Documentation gem
4
4
  require 'hpricot'
5
+
6
+
7
+
8
+
data/easy_data.gemspec CHANGED
@@ -1,5 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  $:.push File.expand_path("../lib", __FILE__)
3
+
4
+
3
5
  require "easy_data/version"
4
6
 
5
7
  Gem::Specification.new do |s|
@@ -21,7 +23,8 @@ Gem::Specification.new do |s|
21
23
  #gem dependencies:
22
24
  #All is not necesary, only is for study his methods
23
25
 
24
- #s.add_dependency(%q<addressable>, ["= 2.2.4"])
26
+ s.add_dependency(%q<hpricot>, [">= 0.8.4"])
27
+ s.add_dependency(%q<haml>, [">= 3.0.0"])
25
28
  #s.add_dependency(%q<rdf>, [">= 0"])
26
29
  #s.add_dependency(%q<haml>, [">= 3.0.0"])
27
30
  #s.add_dependency(%q<nokogiri>, [">= 1.3.3"])
@@ -1,40 +1,141 @@
1
1
  require "action_controller"
2
-
2
+ require "action_view"
3
+ require "builder"
3
4
 
4
5
  class EasyDatasController < ActionController::Base
6
+
7
+ layout 'easy_data_layout'
5
8
 
6
9
  def show
7
- begin
10
+
11
+ # begin
8
12
  model = eval params[:model].to_s
9
-
10
- if params[:id]
11
- @request = model.find params[:id]
12
- else
13
- @request={}
14
- relations = {}
15
- @request["model"] = params[:model].to_s
16
- @request["attributes"] = model.columns.map{|att| att.name}.join(", ")
17
-
18
- model.reflections.each do |relation,values|
19
- relations[relation] = {"model" => values.class_name,"type" => values.macro.to_s}
20
- end
21
- @request["relations"] = relations
13
+ conditions = parser_params(params[:params]||nil)
14
+ rdf = ModelRdf.new
22
15
 
16
+ unless conditions.empty?
17
+ @reply = model.find :all, :conditions => conditions
18
+ else
19
+ @reply = model.find :all
23
20
  end
24
-
25
- render :xml => @request
26
- rescue
27
- raise ActionController::RoutingError.new('Not Found')
28
- end
21
+ @host="http://"+request.env["HTTP_HOST"]
22
+
23
+ @rdf_model = rdf.get_model_rdf(@reply,params[:model],"http://"+request.env["HTTP_HOST"])
24
+
25
+ @xml = Builder::XmlMarkup.new
26
+ respond_to do |format|
27
+ format.html
28
+ format.xml # render :template => "/rdf/request.xml.builder"
29
+ end
30
+ #render :file => "/rdf/request",:content_type => "application/xml",:locals => {:rdf_model => @rdf_model}
31
+ # rescue
32
+ # raise ActionController::RoutingError.new('Not Found')
33
+ # end
34
+
29
35
  end
30
36
 
31
37
  def describe_api
32
38
  models = DataModels.load_models
33
39
  list = {}
34
40
  models.each do |mod|
35
- list[mod] = "foaf/#{mod}"
41
+ list[mod.gsub("::","_")] = "#{mod.gsub("::","_")}"
36
42
  end
37
43
 
38
44
  render :xml => list
39
45
  end
46
+
47
+ def custom_rdf
48
+ @models = DataModels.load_models
49
+ end
50
+
51
+ def model_attributes
52
+
53
+ rdf = ModelRdf.new
54
+
55
+ @model_attributes = rdf.get_attributes_model(params[:model])
56
+ @model = params[:model]
57
+
58
+ render :partial => "model_attributes",:layout => nil
59
+
60
+ end
61
+
62
+ def model_attributes_edit
63
+
64
+ rdf = ModelRdf.new
65
+
66
+ @model_attributes = rdf.get_attributes_model(params[:model])
67
+ @model = params[:model]
68
+ @namespaces = EasyData::RDF::Namespaces.list_form
69
+
70
+ render :partial => "model_attributes_edit",:layout => nil
71
+
72
+ end
73
+
74
+ def load_properties
75
+
76
+ unless params[:id] == ""
77
+ namespace = "EasyData::RDF::#{params[:id].upcase}"
78
+
79
+ rdf = ModelRdf.new
80
+
81
+ @namespace = params[:id]
82
+ @model_attributes = rdf.get_attributes_model(params[:model])
83
+
84
+ properties = (eval namespace).properties_form
85
+
86
+ render :inline => "<span>Property:</span><%= select type+'_property',attribute,properties,{:prompt => 'Select a property...'} -%><span class='rdf_info'>(Current value: <%= current_value%>)</span>",
87
+ :locals => {:properties => properties,
88
+ :type => params[:type],
89
+ :attribute => params[:attribute],
90
+ :current_value => @model_attributes[params[:type]][params[:attribute]][:property]}
91
+ else
92
+ render :inline => ""
93
+ end
94
+ end
95
+ def custom_attributes
96
+
97
+ rdf = ModelRdf.new
98
+ @model = params[:model]
99
+
100
+ params["rdf_type_attributes"].each do |att,value|
101
+ if params["attributes_property"][att] != "" && value != ""
102
+ rdf.update_attributes_model(params[:model],att,'namespace',value)
103
+ rdf.update_attributes_model(params[:model],att,'property',params["attributes_property"][att])
104
+ rdf.update_attributes_model(params[:model],att,'privacy',rdf.privacy(params[:privacy][att].to_i))
105
+ end
106
+ end
107
+
108
+ params["rdf_type_associations"].each do |assoc,value|
109
+ if value != "" && params["associations_property"][assoc] != ""
110
+ rdf.update_associations_model(params[:model],assoc,'namespace',value)
111
+ rdf.update_associations_model(params[:model],assoc,'property',params["associations_property"][assoc])
112
+ rdf.update_associations_model(params[:model],assoc,'privacy',rdf.privacy(params[:privacy][assoc].to_i))
113
+ end
114
+ end
115
+
116
+ rdf.save
117
+
118
+ @model_attributes = rdf.get_attributes_model(@model)
119
+
120
+ render :partial => "model_attributes",:layout => nil
121
+ end
122
+
123
+ private
124
+
125
+ def parser_params (params = nil)
126
+
127
+ conditions = {}
128
+
129
+ if params.nil? || params == 'ALL'
130
+ return conditions
131
+ else
132
+ params = params.split("$")
133
+ params.each do |p|
134
+ p = p.split(':')
135
+ conditions[p[0].downcase.to_sym] = p[1]
136
+ end
137
+ return conditions
138
+ end
139
+ end
140
+
40
141
  end
@@ -1,33 +1,39 @@
1
1
  module DataModels
2
2
 
3
3
  def self.load_models
4
-
5
4
  models = []
6
-
7
- #To test executable /bin/linked_data
8
- #Dir["/home/jnillo/Documentos/Proyectos/redmine/app/models/**/*.rb"].each do |file|
9
- # models << file.gsub('/home/jnillo/Documentos/Proyectos/redmine/app/models/',"").gsub('.rb','').gsub(":","")
10
- #end
11
5
 
12
-
13
- Dir["#{RAILS_ROOT}/app/models/**/*.rb"].each do |file|
14
- models << file.gsub(RAILS_ROOT+'/app/models/',"").gsub('.rb','').classify.gsub(":","")
15
- end
16
-
6
+ Dir["#{RAILS_ROOT}/app/models/**/*.rb"].each do |file|
7
+ models << file.gsub(RAILS_ROOT+'/app/models/',"").gsub('.rb','').classify
8
+ end
9
+
17
10
  models
18
-
19
11
  end
20
12
 
21
- def self.model_attributes(model)
22
-
23
- clase = eval model
24
-
25
- clase.columns.map{|att| [att.name,att.type]}
26
-
13
+ def self.model_attributes(model)
14
+ model.columns.map{|att| att.name}.join(", ")
15
+ end
16
+
17
+ def self.model_relations(model)
18
+
19
+ relations = {}
20
+
21
+ model.reflections.each do |relation,values|
22
+ relations[relation] = {"model" => values.class_name,"type" => values.macro.to_s}
23
+ end
24
+
25
+ relations
27
26
  end
28
27
 
29
28
  def self.build_models_yaml_file
29
+ self.models
30
+ end
30
31
 
31
- self.models
32
+ def self.get_model_data(model)
33
+ begin
34
+ eval model
35
+ rescue
36
+ eval model.pluralize
37
+ end
32
38
  end
33
39
  end
@@ -0,0 +1,156 @@
1
+ require "yaml"
2
+
3
+ class ModelRdf
4
+
5
+ #######################################################################
6
+ # Attributes declarations
7
+ #######################################################################
8
+ @@privacy = ["Hidden","Public","Authenticated"]
9
+
10
+ attr_accessor :model_rdf
11
+
12
+
13
+ #######################################################################
14
+ # Query methods
15
+ #######################################################################
16
+
17
+ #Read the document of attributes relations with rdf properties
18
+ def initialize
19
+ @model_rdf = YAML::load(File.open("#{RAILS_ROOT}/config/easy_data/rdf_info.yaml"))
20
+ end
21
+
22
+ # Return datas storeds in the configuration's yaml file
23
+ def get_models
24
+ self.model_rdf
25
+ end
26
+
27
+ #Return attributes of model stored in the configuration yaml file
28
+ def get_attributes_model(model)
29
+ self.model_rdf[model]
30
+ end
31
+
32
+ # update attributes with rdf properties.
33
+ def update_attributes_model(model,attribute,param,value)
34
+ self.model_rdf[model]['attributes'][attribute][param.to_sym] = value
35
+ end
36
+
37
+ def update_associations_model(model,association,param,value)
38
+ self.model_rdf[model]['associations'][association][param.to_sym] = value
39
+ end
40
+
41
+ # Return privacy of a attribute
42
+ def privacy(index)
43
+ @@privacy[index]
44
+ end
45
+
46
+ # Save changes in rdf_info.yaml (configuration's yaml file)
47
+ def save
48
+ file = File.open("#{RAILS_ROOT}/config/easy_data/rdf_info.yaml",'w')
49
+ file.puts YAML::dump(self.model_rdf)
50
+ file.close
51
+ end
52
+
53
+ #######################################################################
54
+ # Building RDF
55
+ #######################################################################
56
+
57
+ def get_model_rdf(query,model,host)
58
+ request = {:body => "",:header => {"xmlns:rdf"=>"http://www.w3.org/1999/02/22-rdf-syntax-ns#"}}
59
+ elements = {}
60
+ models = []
61
+ query.each do |element|
62
+ elements[element.id] = {'description' => "#{host}/#{element.class.to_s}/#id:#{element.id}",
63
+ 'attributes' => get_properties_tag(element),
64
+ 'associations' => get_associations_tag(element)
65
+ }
66
+
67
+ models << element.class.to_s
68
+ end
69
+ attributes = {}
70
+ request[:body] = elements
71
+ models.each do |mod|
72
+ attributes = get_attributes_model(mod) || get_attributes_model((eval mod).base_class.to_s)
73
+ request[:header].merge!(get_header(attributes))
74
+ end
75
+ request
76
+ #Generating of rdf variable
77
+ end
78
+
79
+ def get_header(attributes)
80
+ headers = {}
81
+
82
+ (attributes["attributes"].merge(attributes["associations"])).each do |att,properties|
83
+ if properties != "no publication" && properties[:namespace] != 'not defined'
84
+ headers["xmlns:#{properties[:namespace]}"] = (eval "EasyData::RDF::#{properties[:namespace].upcase}.get_uri") #EasyData.get_uri_namespace(properties[:namespace])
85
+ end
86
+ end
87
+ headers
88
+ end
89
+
90
+ def get_properties_tag(element)
91
+
92
+ attributes = get_attributes_model(element.class.to_s)
93
+
94
+ # If element's class is a polimorphic class, we used base class.
95
+ if attributes.nil?
96
+ attributes = get_attributes_model(element.class.base_class.to_s)
97
+ end
98
+
99
+ properties = {}
100
+ if element.attributes.respond_to? :each
101
+ element.attributes.each do |att|
102
+ #conditions to methods to check if can be show
103
+ if can_see?(attributes["attributes"][att.first][:privacy]) && exist_info_att(attributes["attributes"][att.first],att.second)
104
+ properties["#{attributes['attributes'][att.first][:namespace]}:#{attributes["attributes"][att.first][:property]}"] = att.second
105
+ end
106
+ end
107
+ end
108
+
109
+ properties
110
+
111
+ end
112
+
113
+ def get_associations_tag(element)
114
+
115
+ associations = get_attributes_model(element.class.to_s)
116
+
117
+ if associations.nil?
118
+ associations = get_attributes_model(element.class.base_class.to_s)
119
+ end
120
+ properties = {}
121
+ element.class.reflections.each do |ref,value|
122
+ rel = eval "element.#{ref}"
123
+
124
+ if exist_info_assoc(rel.to_a,associations["associations"][ref.to_s]) && can_see?(associations["associations"][ref.to_s][:privacy]) && !rel.empty?
125
+
126
+ properties.merge!({"#{associations['associations'][ref.to_s][:namespace]}:#{associations['associations'][ref.to_s][:property]}" => {:model => rel.first.class ,
127
+ :id => rel.collect{|obj| obj.id}}
128
+ })
129
+ end
130
+ end
131
+ properties
132
+ end
133
+
134
+
135
+ private
136
+ ########################################################################
137
+ ## FUNCTIONS FOR CHECK IF SHOW oR NoT THE CURRENT ITEM ##
138
+ ########################################################################
139
+
140
+ def can_see?(privacy)
141
+ privacy=="Public" || (privacy=="Private" && !@current_user.nil?)
142
+ end
143
+
144
+ def exist_info_att(attributes,value)
145
+ attributes[:namespace] != "not defined" &&
146
+ attributes[:property] !="not defined" &&
147
+ !value.nil?
148
+ end
149
+
150
+ def exist_info_assoc(rels,rdf_info)
151
+ !rels.nil? && !rels.empty? &&
152
+ rdf_info[:namespace] != "not defined" &&
153
+ rdf_info[:property] != "not defined"
154
+
155
+ end
156
+ end
@@ -0,0 +1,36 @@
1
+ module EasyData
2
+ module RDF
3
+ class CC < Namespaces
4
+ @@uri = "xmlns:cc=http://creativecommons.org/ns#"
5
+ @@properties= {"attributionName" => "<cc:attributionName>%value%</cc:attributionName>",
6
+ "attributionURL" => "",
7
+ "deprecatedOn" => "",
8
+ "jurisdiction" => "",
9
+ "legalcode" => "",
10
+ "license" => "",
11
+ "morePermissions" => "",
12
+ "permits" => "",
13
+ "prohibits" => "",
14
+ "requires" => ""
15
+ }
16
+
17
+ # Return Namespace URI
18
+ def self.get_uri
19
+ @@uri
20
+ end
21
+
22
+ #Return a list of Namespace's properties
23
+ def self.properties
24
+ @@properties.keys
25
+ end
26
+
27
+ def self.properties_form
28
+ list = {}
29
+ @@properties.keys.each do |property|
30
+ list[property] = property
31
+ end
32
+ list
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,33 @@
1
+ module EasyData
2
+ module RDF
3
+ class CERT < Namespaces
4
+ @@uri = "http://www.w3.org/ns/auth/cert#"
5
+ @@properties= {"decimal" => "",
6
+ "hex" => "",
7
+ "identity" => "",
8
+ "public_key" => "",
9
+ }
10
+
11
+ # Return Namespace URI
12
+ def self.get_uri
13
+ @@uri
14
+ end
15
+ # Return tag to rdf doc
16
+ def self.to_s(property,uri,value)
17
+ @@properties[property].gsub("%uri%",uri).gsub('%value%',value)
18
+ end
19
+
20
+ #Return a list of Namespace's properties
21
+ def self.properties
22
+ @@properties.keys
23
+ end
24
+
25
+ def self.properties_form
26
+ list = {}
27
+ @@properties.keys.each do |property|
28
+ list[property] = property
29
+ end
30
+ list
31
+ end end
32
+ end
33
+ end
@@ -0,0 +1,87 @@
1
+ module EasyData
2
+ module RDF
3
+ class DC < Namespaces
4
+ @@uri = "http://purl.org/dc/elements/1.1/"
5
+
6
+ @@properties = {"abstract" => "",
7
+ "accessRights" => "",
8
+ "accrualMethod" => "",
9
+ "accrualPeriodicity" => "",
10
+ "accrualPolicy" => "",
11
+ "alternative" => "",
12
+ "audience" => "",
13
+ "available" => "",
14
+ "bibliographicCitation" => "",
15
+ "conformsTo" => "",
16
+ "contributor" => "",
17
+ "coverage" => "",
18
+ "created" => "",
19
+ "creator" => "",
20
+ "date" => "",
21
+ "dateAccepted" => "",
22
+ "dateCopyrighted" => "",
23
+ "dateSubmitted" => "",
24
+ "description" => "",
25
+ "educationLevel" => "",
26
+ "extent" => "",
27
+ "format" => "",
28
+ "hasFormat" => "",
29
+ "hasPart" => "",
30
+ "hasVersion" => "",
31
+ "identifier" => "",
32
+ "instructionalMethod" => "",
33
+ "isFormatOf" => "",
34
+ "isPartOf" => "",
35
+ "isReferencedBy" => "",
36
+ "isReplacedBy" => "",
37
+ "isRequiredBy" => "",
38
+ "isVersionOf" => "",
39
+ "issued" => "",
40
+ "language" => "",
41
+ "license" => "",
42
+ "mediator" => "",
43
+ "medium" => "",
44
+ "modified" => "",
45
+ "provenance" => "",
46
+ "publisher" => "",
47
+ "references" => "",
48
+ "relation" => "",
49
+ "replaces" => "",
50
+ "requires" => "",
51
+ "rights" => "",
52
+ "rightsHolder" => "",
53
+ "source" => "",
54
+ "spatial" => "",
55
+ "subject" => "",
56
+ "tableOfContents" => "",
57
+ "temporal" => "",
58
+ "title" => "",
59
+ "type" => "",
60
+ "valid" => ""
61
+ }
62
+
63
+ # Return Namespace URI
64
+ def self.get_uri
65
+ @@uri
66
+ end
67
+
68
+ # Return tag to rdf doc
69
+ def self.to_s(property,uri,value)
70
+ @@properties[property].gsub("%uri%",uri).gsub('%value%',value)
71
+ end
72
+
73
+ #Return a list of Namespace's properties
74
+ def self.properties
75
+ @@properties.keys
76
+ end
77
+
78
+ def self.properties_form
79
+ list = {}
80
+ @@properties.keys.each do |property|
81
+ list[property] = property
82
+ end
83
+ list
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,47 @@
1
+ module EasyData
2
+ module RDF
3
+ class DC11 < Namespaces
4
+ @@uri = "http://purl.org/dc/elements/1.1/"
5
+ @@properties= {"contributor" => "",
6
+ "coverage" => "",
7
+ "creator" => "",
8
+ "date" => "",
9
+ "description" => "",
10
+ "format" => "",
11
+ "identifier" => "",
12
+ "language" => "",
13
+ "publisher" => "",
14
+ "relation" => "",
15
+ "rights" => "",
16
+ "source" => "",
17
+ "subject" => "",
18
+ "title" => "",
19
+ "type" => "",
20
+ }
21
+
22
+ # Return Namespace URI
23
+ def self.get_uri
24
+ @@uri
25
+ # "http://purl.org/dc/elements/1.1/"
26
+ end
27
+
28
+ # Return tag to rdf doc
29
+ def self.to_s(property,uri,value)
30
+ @@properties[property].gsub("%uri%",uri).gsub('%value%',value)
31
+ end
32
+
33
+ #Return a list of Namespace's properties
34
+ def self.properties
35
+ @@properties.keys
36
+ end
37
+
38
+ def self.properties_form
39
+ list = {}
40
+ @@properties.keys.each do |property|
41
+ list[property] = property
42
+ end
43
+ list
44
+ end
45
+ end
46
+ end
47
+ end