publisci 0.1.2

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 (220) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/.rspec +1 -0
  4. data/.travis.yml +13 -0
  5. data/Gemfile +36 -0
  6. data/LICENSE.txt +20 -0
  7. data/README.md +51 -0
  8. data/README.rdoc +48 -0
  9. data/Rakefile +68 -0
  10. data/bin/bio-publisci +106 -0
  11. data/bin/bio-publisci-server +50 -0
  12. data/examples/bio-band_integration.rb +9 -0
  13. data/examples/no_magic.prov +58 -0
  14. data/examples/no_magic.rb +58 -0
  15. data/examples/orm.prov +48 -0
  16. data/examples/primer-full.prov +120 -0
  17. data/examples/primer.prov +66 -0
  18. data/examples/prov_dsl.prov +85 -0
  19. data/examples/safe_gen.rb +7 -0
  20. data/examples/visualization/primer.prov +66 -0
  21. data/examples/visualization/prov_viz.rb +140 -0
  22. data/examples/visualization/viz.rb +35 -0
  23. data/features/create_generator.feature +21 -0
  24. data/features/integration.feature +12 -0
  25. data/features/integration_steps.rb +10 -0
  26. data/features/metadata.feature +37 -0
  27. data/features/metadata_steps.rb +40 -0
  28. data/features/orm.feature +60 -0
  29. data/features/orm_steps.rb +74 -0
  30. data/features/prov_dsl.feature +14 -0
  31. data/features/prov_dsl_steps.rb +11 -0
  32. data/features/reader.feature +25 -0
  33. data/features/reader_steps.rb +61 -0
  34. data/features/step_definitions/bio-publisci_steps.rb +0 -0
  35. data/features/store.feature +27 -0
  36. data/features/store_steps.rb +42 -0
  37. data/features/support/env.rb +13 -0
  38. data/features/writer.feature +14 -0
  39. data/features/writer_steps.rb +24 -0
  40. data/lib/bio-publisci.rb +64 -0
  41. data/lib/bio-publisci/analyzer.rb +57 -0
  42. data/lib/bio-publisci/datacube_model.rb +111 -0
  43. data/lib/bio-publisci/dataset/ORM/data_cube_orm.rb +240 -0
  44. data/lib/bio-publisci/dataset/ORM/observation.rb +20 -0
  45. data/lib/bio-publisci/dataset/configuration.rb +31 -0
  46. data/lib/bio-publisci/dataset/data_cube.rb +418 -0
  47. data/lib/bio-publisci/dataset/dataset.rb +11 -0
  48. data/lib/bio-publisci/dataset/dataset_for.rb +186 -0
  49. data/lib/bio-publisci/dataset/interactive.rb +72 -0
  50. data/lib/bio-publisci/dsl/config.rb +34 -0
  51. data/lib/bio-publisci/dsl/dataset_dsl.rb +93 -0
  52. data/lib/bio-publisci/dsl/dsl.rb +72 -0
  53. data/lib/bio-publisci/dsl/metadata_dsl.rb +85 -0
  54. data/lib/bio-publisci/dsl/prov_dsl.rb +143 -0
  55. data/lib/bio-publisci/metadata/generator.rb +323 -0
  56. data/lib/bio-publisci/metadata/metadata.rb +5 -0
  57. data/lib/bio-publisci/metadata/metadata_model.rb +25 -0
  58. data/lib/bio-publisci/metadata/prov/activity.rb +88 -0
  59. data/lib/bio-publisci/metadata/prov/agent.rb +100 -0
  60. data/lib/bio-publisci/metadata/prov/association.rb +107 -0
  61. data/lib/bio-publisci/metadata/prov/config.rb +34 -0
  62. data/lib/bio-publisci/metadata/prov/derivation.rb +60 -0
  63. data/lib/bio-publisci/metadata/prov/element.rb +120 -0
  64. data/lib/bio-publisci/metadata/prov/entity.rb +64 -0
  65. data/lib/bio-publisci/metadata/prov/model/prov_models.rb +109 -0
  66. data/lib/bio-publisci/metadata/prov/plan.rb +32 -0
  67. data/lib/bio-publisci/metadata/prov/prov.rb +78 -0
  68. data/lib/bio-publisci/metadata/prov/role.rb +40 -0
  69. data/lib/bio-publisci/metadata/prov/usage.rb +64 -0
  70. data/lib/bio-publisci/metadata/publisher.rb +25 -0
  71. data/lib/bio-publisci/mixins/custom_predicate.rb +38 -0
  72. data/lib/bio-publisci/mixins/dereferencable.rb +34 -0
  73. data/lib/bio-publisci/mixins/registry.rb +27 -0
  74. data/lib/bio-publisci/mixins/vocabulary.rb +8 -0
  75. data/lib/bio-publisci/output.rb +27 -0
  76. data/lib/bio-publisci/parser.rb +266 -0
  77. data/lib/bio-publisci/post_processor.rb +95 -0
  78. data/lib/bio-publisci/query/query_helper.rb +123 -0
  79. data/lib/bio-publisci/r_client.rb +54 -0
  80. data/lib/bio-publisci/readers/arff.rb +49 -0
  81. data/lib/bio-publisci/readers/base.rb +57 -0
  82. data/lib/bio-publisci/readers/csv.rb +88 -0
  83. data/lib/bio-publisci/readers/dataframe.rb +67 -0
  84. data/lib/bio-publisci/readers/maf.rb +199 -0
  85. data/lib/bio-publisci/readers/r_cross.rb +112 -0
  86. data/lib/bio-publisci/readers/r_matrix.rb +176 -0
  87. data/lib/bio-publisci/store.rb +56 -0
  88. data/lib/bio-publisci/writers/arff.rb +91 -0
  89. data/lib/bio-publisci/writers/base.rb +93 -0
  90. data/lib/bio-publisci/writers/csv.rb +31 -0
  91. data/lib/bio-publisci/writers/dataframe.rb +81 -0
  92. data/lib/bio-publisci/writers/json.rb +18 -0
  93. data/lib/r2rdf.rb +226 -0
  94. data/lib/template_bak.rb +12 -0
  95. data/lib/template_bak/publisci.rb +3 -0
  96. data/lib/vocabs/cc.rb +18 -0
  97. data/lib/vocabs/cert.rb +13 -0
  98. data/lib/vocabs/dc.rb +63 -0
  99. data/lib/vocabs/dc11.rb +23 -0
  100. data/lib/vocabs/doap.rb +45 -0
  101. data/lib/vocabs/exif.rb +168 -0
  102. data/lib/vocabs/foaf.rb +69 -0
  103. data/lib/vocabs/geo.rb +13 -0
  104. data/lib/vocabs/http.rb +26 -0
  105. data/lib/vocabs/ma.rb +78 -0
  106. data/lib/vocabs/owl.rb +59 -0
  107. data/lib/vocabs/rdfs.rb +17 -0
  108. data/lib/vocabs/rsa.rb +12 -0
  109. data/lib/vocabs/rss.rb +14 -0
  110. data/lib/vocabs/sioc.rb +93 -0
  111. data/lib/vocabs/skos.rb +36 -0
  112. data/lib/vocabs/wot.rb +21 -0
  113. data/lib/vocabs/xhtml.rb +9 -0
  114. data/lib/vocabs/xsd.rb +58 -0
  115. data/resources/maf_example.maf +10 -0
  116. data/resources/maf_rdf.ttl +1173 -0
  117. data/resources/primer.ttl +38 -0
  118. data/resources/queries/code_resources.rq +10 -0
  119. data/resources/queries/codes.rq +18 -0
  120. data/resources/queries/dataset.rq +7 -0
  121. data/resources/queries/dimension_ranges.rq +8 -0
  122. data/resources/queries/dimensions.rq +12 -0
  123. data/resources/queries/gene.rq +16 -0
  124. data/resources/queries/hugo_to_ensembl.rq +7 -0
  125. data/resources/queries/maf_column.rq +26 -0
  126. data/resources/queries/measures.rq +12 -0
  127. data/resources/queries/observation_labels.rq +8 -0
  128. data/resources/queries/observations.rq +13 -0
  129. data/resources/queries/patient.rq +11 -0
  130. data/resources/queries/patient_list.rq +11 -0
  131. data/resources/queries/patients_with_mutation.rq +18 -0
  132. data/resources/queries/properties.rq +8 -0
  133. data/resources/queries/test.rq +3 -0
  134. data/resources/weather.numeric.arff +28 -0
  135. data/scripts/get_gene_lengths.rb +50 -0
  136. data/scripts/islet_mlratio.rb +6 -0
  137. data/scripts/scan_islet.rb +6 -0
  138. data/scripts/update_reference.rb +25 -0
  139. data/server/helpers.rb +215 -0
  140. data/server/public/src-min-noconflict/LICENSE +24 -0
  141. data/server/public/src-min-noconflict/ace.js +11 -0
  142. data/server/public/src-min-noconflict/ext-chromevox.js +1 -0
  143. data/server/public/src-min-noconflict/ext-elastic_tabstops_lite.js +1 -0
  144. data/server/public/src-min-noconflict/ext-emmet.js +1 -0
  145. data/server/public/src-min-noconflict/ext-keybinding_menu.js +1 -0
  146. data/server/public/src-min-noconflict/ext-language_tools.js +1 -0
  147. data/server/public/src-min-noconflict/ext-modelist.js +1 -0
  148. data/server/public/src-min-noconflict/ext-old_ie.js +1 -0
  149. data/server/public/src-min-noconflict/ext-searchbox.js +1 -0
  150. data/server/public/src-min-noconflict/ext-settings_menu.js +1 -0
  151. data/server/public/src-min-noconflict/ext-spellcheck.js +1 -0
  152. data/server/public/src-min-noconflict/ext-split.js +1 -0
  153. data/server/public/src-min-noconflict/ext-static_highlight.js +1 -0
  154. data/server/public/src-min-noconflict/ext-statusbar.js +1 -0
  155. data/server/public/src-min-noconflict/ext-textarea.js +1 -0
  156. data/server/public/src-min-noconflict/ext-themelist.js +1 -0
  157. data/server/public/src-min-noconflict/ext-whitespace.js +1 -0
  158. data/server/public/src-min-noconflict/keybinding-emacs.js +1 -0
  159. data/server/public/src-min-noconflict/keybinding-vim.js +1 -0
  160. data/server/public/src-min-noconflict/mode-ruby.js +1 -0
  161. data/server/public/src-min-noconflict/snippets/ruby.js +1 -0
  162. data/server/public/src-min-noconflict/theme-twilight.js +1 -0
  163. data/server/public/src-min-noconflict/worker-coffee.js +1 -0
  164. data/server/public/src-min-noconflict/worker-css.js +1 -0
  165. data/server/public/src-min-noconflict/worker-javascript.js +1 -0
  166. data/server/public/src-min-noconflict/worker-json.js +1 -0
  167. data/server/public/src-min-noconflict/worker-lua.js +1 -0
  168. data/server/public/src-min-noconflict/worker-php.js +1 -0
  169. data/server/public/src-min-noconflict/worker-xquery.js +1 -0
  170. data/server/routes.rb +123 -0
  171. data/server/views/dsl.haml +65 -0
  172. data/server/views/dump.haml +3 -0
  173. data/server/views/import.haml +35 -0
  174. data/server/views/new_repository.haml +25 -0
  175. data/server/views/query.haml +28 -0
  176. data/server/views/repository.haml +25 -0
  177. data/spec/ORM/data_cube_orm_spec.rb +33 -0
  178. data/spec/ORM/prov_model_spec.rb +72 -0
  179. data/spec/analyzer_spec.rb +36 -0
  180. data/spec/bnode_spec.rb +66 -0
  181. data/spec/csv/bacon.csv +4 -0
  182. data/spec/csv/moar_bacon.csv +11 -0
  183. data/spec/data_cube_spec.rb +169 -0
  184. data/spec/dataset_for_spec.rb +77 -0
  185. data/spec/dsl_spec.rb +134 -0
  186. data/spec/generators/csv_spec.rb +44 -0
  187. data/spec/generators/dataframe_spec.rb +44 -0
  188. data/spec/generators/maf_spec.rb +40 -0
  189. data/spec/generators/r_cross_spec.rb +51 -0
  190. data/spec/generators/r_matrix_spec.rb +44 -0
  191. data/spec/length_lookup_spec.rb +0 -0
  192. data/spec/maf_query_spec.rb +343 -0
  193. data/spec/metadata/metadata_dsl_spec.rb +68 -0
  194. data/spec/prov/activity_spec.rb +74 -0
  195. data/spec/prov/agent_spec.rb +54 -0
  196. data/spec/prov/association_spec.rb +55 -0
  197. data/spec/prov/config_spec.rb +28 -0
  198. data/spec/prov/derivation_spec.rb +30 -0
  199. data/spec/prov/entity_spec.rb +52 -0
  200. data/spec/prov/role_spec.rb +94 -0
  201. data/spec/prov/usage_spec.rb +98 -0
  202. data/spec/queries/integrity/1.rq +21 -0
  203. data/spec/queries/integrity/11.rq +29 -0
  204. data/spec/queries/integrity/12.rq +37 -0
  205. data/spec/queries/integrity/14.rq +25 -0
  206. data/spec/queries/integrity/19_1.rq +21 -0
  207. data/spec/queries/integrity/19_2.rq +15 -0
  208. data/spec/queries/integrity/2.rq +22 -0
  209. data/spec/queries/integrity/3.rq +19 -0
  210. data/spec/queries/integrity/4.rq +13 -0
  211. data/spec/queries/integrity/5.rq +14 -0
  212. data/spec/r_builder_spec.rb +33 -0
  213. data/spec/resource/.RData +0 -0
  214. data/spec/resource/example.Rhistory +3 -0
  215. data/spec/spec_helper.rb +17 -0
  216. data/spec/turtle/bacon +147 -0
  217. data/spec/turtle/reference +2064 -0
  218. data/spec/turtle/weather +275 -0
  219. data/spec/writer_spec.rb +75 -0
  220. metadata +589 -0
@@ -0,0 +1,11 @@
1
+ module PubliSci
2
+ class Dataset
3
+ extend PubliSci::Interactive
4
+ extend PubliSci::Registry
5
+
6
+ def self.configuration
7
+ @config ||= Dataset::Configuration.new
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,186 @@
1
+ require 'open-uri'
2
+ module PubliSci
3
+ class Dataset
4
+ extend PubliSci::Interactive
5
+
6
+ def self.reader_registry
7
+ @reader_registry ||= {}
8
+ end
9
+
10
+ def self.register_reader(extension,klass)
11
+ reader_registry[extension] = klass
12
+ end
13
+
14
+ def self.for(object, options={}, ask_on_ambiguous=true)
15
+ if options == false || options == true
16
+ ask_on_ambiguous = options
17
+ options = {}
18
+ end
19
+
20
+ if object.is_a? String
21
+ if File.exist? object
22
+ if File.extname(object).size > 0
23
+ extension = File.extname(object)
24
+ elsif File.basename(object)[0] == '.' && File.basename(object).count('.') == 1
25
+ extension = File.basename(object)
26
+ else
27
+ raise "Can't load file #{object}; file type inference not yet implemented"
28
+ end
29
+
30
+ if reader_registry.keys.include? extension
31
+ reader_registry[extension].new.automatic(object,options,ask_on_ambiguous)
32
+ else
33
+ case extension
34
+ when ".RData"
35
+ r_object(object, options, ask_on_ambiguous)
36
+ when /.csv/i
37
+ PubliSci::Readers::CSV.new.automatic(object,nil,options,ask_on_ambiguous)
38
+ when /.arff/i
39
+ PubliSci::Readers::ARFF.new.generate_n3(object)
40
+ else
41
+ # false
42
+ raise "Unkown Extension #{extension}"
43
+ end
44
+ end
45
+ elsif object =~ %r{htt(p|ps)://.+}
46
+ self.for(download(object).path, options, ask_on_ambiguous) || RDF::Statement.new(RDF::URI(object), RDF::URI('http://semanticscience.org/resource/hasValue'), IO.read(download(object).path)).to_s
47
+ # raise res
48
+ # self.for_remote(object)
49
+ else
50
+ raise "Unable to find reader for String '#{object}'"
51
+ # TODO: better handling of missing readers; need this way for raw strings for now
52
+ # false
53
+ end
54
+ elsif object.is_a? Rserve::REXP
55
+ r_object(object, options, ask_on_ambiguous)
56
+ else
57
+ raise "not recognize Ruby objects of this type yet (#{object})"
58
+ end
59
+ end
60
+
61
+ def self.download(uri)
62
+ out = Tempfile.new(uri.split('/').last)
63
+ out.write open(uri).read
64
+ out.close
65
+ out
66
+ end
67
+
68
+ def self.r_object(object, options={}, ask_on_ambiguous=true)
69
+ if object.is_a? String
70
+ con = Rserve::Connection.new
71
+ vars = con.eval("load('#{File.absolute_path object}')")
72
+ if vars.to_ruby.size > 1 && ask_on_ambiguous
73
+ puts "Which variable? #{vars.to_ruby}"
74
+ var = vars.to_ruby[gets.to_i]
75
+ else
76
+ var = vars.to_ruby[0]
77
+ end
78
+
79
+ r_classes = con.eval("class(#{var})").to_ruby
80
+
81
+ if r_classes.include? "data.frame"
82
+ df = PubliSci::Readers::Dataframe.new
83
+ unless options[:dimensions] || !ask_on_ambiguous
84
+ dims = con.eval("names(#{var})").to_ruby
85
+ puts "Which dimensions? #{dims}"
86
+ selection = gets.chomp
87
+ if selection.size > 0
88
+ options[:dimensions] = selection.split(',').map(&:to_i).map{|i| dims[i]}
89
+ end
90
+ end
91
+ unless options[:measures] || !ask_on_ambiguous
92
+ meas = con.eval("names(#{var})").to_ruby
93
+ puts "Which measures? #{meas} "
94
+ selection = gets.chomp
95
+ if selection.size > 0
96
+ options[:measures] = selection.split(',').map(&:to_i).map{|i| meas[i]}
97
+ end
98
+ end
99
+
100
+ df.generate_n3(con.eval(var),var,options)
101
+
102
+ elsif r_classes.include? "cross"
103
+ bc = PubliSci::Readers::RCross.new
104
+
105
+ unless options[:measures] || !ask_on_ambiguous
106
+ pheno_names = con.eval("names(#{var}$pheno)").to_ruby
107
+ puts "Which phenotype traits? #{pheno_names}"
108
+ selection = gets.chomp
109
+ if selection.size > 0
110
+ options[:measures] = selection.split(',').map(&:to_i).map{|i| pheno_names[i]}
111
+ end
112
+ end
113
+
114
+ base = var
115
+ if ask_on_ambiguous
116
+ puts "Output file base?"
117
+ base = gets.chomp
118
+ base = var unless base.size > 0
119
+ end
120
+
121
+ bc.generate_n3(con, var, base, options)
122
+
123
+ elsif r_classes.include? "matrix"
124
+ mat = PubliSci::Readers::RMatrix.new
125
+
126
+ unless options[:measures] || !ask_on_ambiguous
127
+ puts "Row label"
128
+ rows = gets.chomp
129
+ rows = "row" unless rows.size > 0
130
+
131
+ puts "Column label"
132
+ cols = gets.chomp
133
+ cols = "column" unless cols.size > 0
134
+
135
+ puts "Entry label"
136
+ vals = gets.chomp
137
+ vals = "value" unless vals.size > 0
138
+
139
+ options[:measures] = [cols,rows,vals]
140
+ end
141
+
142
+ base = var
143
+ if ask_on_ambiguous
144
+ puts "Output file base?"
145
+ base = gets.chomp
146
+ base = var unless base.size > 0
147
+ end
148
+
149
+ mat.generate_n3(con, var, base, options)
150
+ else
151
+ raise "no PubliSci::Readers found for #{r_classes}"
152
+ end
153
+
154
+ elsif object.is_a? Rserve::REXP
155
+ if object.attr.payload["class"].payload.first
156
+
157
+ df = PubliSci::Readers::Dataframe.new
158
+
159
+ var = nil
160
+
161
+ if ask_on_ambiguous
162
+ var = interact("Dataset name?",nil)
163
+ end
164
+
165
+ unless options[:dimensions] || !ask_on_ambiguous
166
+ dims = object.payload.names
167
+ selection = interact("Which dimensions?","row",dims){|s| puts s; nil}
168
+ options[:dimensions] = selection if selection
169
+ end
170
+
171
+ unless options[:measures] || !ask_on_ambiguous
172
+ meas = object.payload.names
173
+ options[:measures] = interact("Which measures?",meas,meas)
174
+ end
175
+
176
+ df.generate_n3(object,var,options)
177
+ else
178
+ raise "support for other Rserve objects coming shortly"
179
+ end
180
+
181
+ else
182
+ raise "#{object} is not an R object"
183
+ end
184
+ end
185
+ end
186
+ end
@@ -0,0 +1,72 @@
1
+ module PubliSci
2
+ module Interactive
3
+ #to be called by other classes if user input is required
4
+
5
+ #take message, options, defaults. can be passed block to handle default as well
6
+ def interact(message, default, options=nil)
7
+ puts message + " (#{default})\n[#{options}]"
8
+ str = gets.chomp
9
+ if str.size > 0
10
+ if options
11
+ if str.split(',').all?{|s| Integer(s) rescue nil}
12
+ str.split(',').map(&:to_i).map{|i| options[i]}
13
+ else
14
+ str.split(',').each{|s| raise "unkown selection #{s}" unless options.include? s.strip}
15
+ str.split(',').map(&:strip)
16
+ end
17
+ else
18
+ str
19
+ end
20
+ elsif block_given?
21
+ yield str
22
+ else
23
+ default
24
+ end
25
+ end
26
+
27
+ # def interactive(options={})
28
+ # options = defaults.merge(options)
29
+ # qb = {}
30
+
31
+ # puts "load config from file? [y/N]"
32
+ # if gets.chomp == "y"
33
+ # #use yaml or DSL file to configure
34
+ # else
35
+ # qb[:dimensions] = dimensions()
36
+ # qb[:measures] = measures()
37
+ # end
38
+
39
+ # puts "load data from file? [y/N]"
40
+ # if gets.chomp == "y"
41
+ # #attempt to load dataset from file, ask user to resolve problems or ambiguity
42
+ # else
43
+ # end
44
+ # qb
45
+ # end
46
+
47
+ # def dimensions
48
+ # puts "Enter a list of dimensions, separated by commas"
49
+ # arr = gets.chomp.split(",")
50
+ # dims = {}
51
+
52
+ # arr.map{|dim|
53
+ # puts "What is the range of #{dim.chomp.strip}? [:coded]"
54
+ # type = gets.chomp
55
+ # type = :coded if type == ":coded" || type == ""
56
+ # dims[dim.chomp.strip] = {type: type}
57
+ # }
58
+
59
+ # dims
60
+ # end
61
+
62
+ # def measures
63
+ # puts "Enter a list of measures, separated by commas"
64
+ # arr = gets.chomp.split(",")
65
+ # meas = []
66
+
67
+ # arr.map{|m| meas << m.chomp.strip}
68
+
69
+ # meas
70
+ # end
71
+ end
72
+ end
@@ -0,0 +1,34 @@
1
+ module PubliSci
2
+ module DSL
3
+ class Configuration
4
+ def self.defaults
5
+ {
6
+ output: :generate_n3,
7
+ abbreviate: false,
8
+ repository: :in_memory,
9
+ repository_url: 'http://localhost:8080/'
10
+ }
11
+ end
12
+
13
+ defaults.keys.each{|k|
14
+ default = defaults[k]
15
+ define_method(k) do |input=nil|
16
+ var = instance_variable_get :"@#{k}"
17
+ if var
18
+ var
19
+ else
20
+ instance_variable_set :"@#{k}", default
21
+ end
22
+
23
+ if input
24
+ instance_variable_set :"@#{k}", input
25
+ end
26
+
27
+ instance_variable_get :"@#{k}"
28
+ end
29
+
30
+ attr_writer k
31
+ }
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,93 @@
1
+ module PubliSci
2
+ class Dataset
3
+ module DSL
4
+
5
+ class Instance
6
+ include Dataset::DSL
7
+
8
+ def initialize
9
+ Dataset.registry.clear
10
+ end
11
+ end
12
+
13
+ # def interactive(value=nil)
14
+ # set_or_get('interactive',value)
15
+ # end
16
+
17
+ def object(file=nil)
18
+ add_or_get('object',file)
19
+ end
20
+ alias_method :source, :object
21
+
22
+ def dimension(*args)
23
+ if args.size == 0
24
+ add_or_get('dimension',nil)
25
+ else
26
+ args.each{|arg|
27
+ add_or_get('dimension',arg)
28
+ }
29
+ end
30
+ end
31
+
32
+ def measure(*args)
33
+ if args.size == 0
34
+ add_or_get('measure',nil)
35
+ else
36
+ args.each{|arg|
37
+ add_or_get('measure',arg)
38
+ }
39
+ end
40
+ end
41
+
42
+ def option(opt=nil,value=nil)
43
+ if opt == nil || value == nil
44
+ @dataset_generator_options
45
+ else
46
+ (@dataset_generator_options ||= {})[opt] = value
47
+ end
48
+ end
49
+ alias_method :options, :option
50
+
51
+ def settings
52
+ Dataset.configuration
53
+ end
54
+
55
+ def generate_n3
56
+ opts = {}
57
+ %w{dimension measure}.each{|field|
58
+ opts[field.to_sym] = send(field.to_sym) if send(field.to_sym)
59
+ }
60
+ interact = settings.interactive
61
+ if options
62
+ opts = opts.merge(options)
63
+ end
64
+ object().map{|obj|
65
+ Dataset.for(obj,opts,interact)
66
+ }.join("\n")
67
+ end
68
+
69
+ private
70
+ def set_or_get(var,input=nil)
71
+ ivar = instance_variable_get("@#{var}")
72
+
73
+ if input
74
+ instance_variable_set("@#{var}", input)
75
+ else
76
+ ivar
77
+ end
78
+ end
79
+
80
+ def add_or_get(var,input)
81
+ ivar = instance_variable_get("@#{var}")
82
+
83
+ if input
84
+ instance_variable_set("@#{var}", []) unless ivar
85
+ instance_variable_get("@#{var}") << input
86
+ instance_variable_get("@#{var}")
87
+ else
88
+ ivar
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,72 @@
1
+ module PubliSci
2
+ module DSL
3
+ attr_reader :base_url
4
+
5
+ class Instance
6
+ include PubliSci::DSL
7
+ end
8
+ # Use to set base url for whole script; helps when referring to dataset
9
+ # resources from metadata and
10
+ def base_url=(url)
11
+ @base_url = url
12
+ Prov.base_url=url
13
+ end
14
+
15
+ def data(&block)
16
+ inst=PubliSci::Dataset::DSL::Instance.new
17
+ inst.instance_eval(&block)
18
+ @_dsl_data ||= [] << inst
19
+ inst
20
+ end
21
+
22
+ def metadata(&block)
23
+ inst=PubliSci::Metadata::DSL::Instance.new
24
+ inst.instance_eval(&block)
25
+ @_dsl_metadata = inst
26
+ inst
27
+ end
28
+
29
+ def provenance(&block)
30
+ inst=PubliSci::Prov::DSL::Instance.new
31
+ inst.instance_eval(&block)
32
+ @_dsl_prov = inst
33
+ inst
34
+ end
35
+
36
+ def configuration
37
+ @_dsl_config ||= DSL::Configuration.new
38
+ end
39
+
40
+ def configure
41
+ yield configuration
42
+ end
43
+
44
+ def settings
45
+ configuration
46
+ end
47
+
48
+ def generate_n3
49
+ out = ""
50
+ @_dsl_data.each{|dat| out << dat.generate_n3 } if @_dsl_data
51
+ out << @_dsl_metadata.generate_n3 if @_dsl_metadata
52
+ out << @_dsl_prov.generate_n3 if @_dsl_prov
53
+ out
54
+ end
55
+
56
+ def to_repository(turtle_string=generate_n3)
57
+ repo = settings.repository
58
+ case repo
59
+ when :in_memory
60
+ repo = RDF::Repository.new
61
+ when :fourstore
62
+ repo = RDF::FourStore::Repository.new('http://localhost:8080')
63
+ end
64
+ f=Tempfile.new(['repo','.ttl'])
65
+ f.write(turtle_string)
66
+ f.close
67
+ repo.load(f.path, :format => :ttl).to_s
68
+ f.unlink
69
+ repo
70
+ end
71
+ end
72
+ end