easy_data 0.0.2 → 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 (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