bio-publisci 0.0.6 → 0.0.7
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.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/Rakefile +1 -1
- data/examples/prov_dsl.prov +2 -1
- data/examples/safe_gen.rb +7 -0
- data/examples/visualization/primer.prov +66 -0
- data/examples/visualization/prov_viz.rb +140 -0
- data/examples/visualization/viz.rb +35 -0
- data/features/metadata_steps.rb +2 -4
- data/features/orm_steps.rb +4 -4
- data/features/reader_steps.rb +1 -1
- data/features/store_steps.rb +1 -1
- data/features/writer.feature +1 -1
- data/features/writer_steps.rb +1 -1
- data/lib/bio-publisci.rb +10 -2
- data/lib/bio-publisci/analyzer.rb +4 -4
- data/lib/bio-publisci/{spira.rb → datacube_model.rb} +4 -5
- data/lib/bio-publisci/dataset/ORM/data_cube_orm.rb +12 -12
- data/lib/bio-publisci/dataset/ORM/observation.rb +1 -1
- data/lib/bio-publisci/dataset/configuration.rb +31 -0
- data/lib/bio-publisci/dataset/data_cube.rb +28 -17
- data/lib/bio-publisci/dataset/dataset.rb +11 -0
- data/lib/bio-publisci/dataset/dataset_for.rb +19 -9
- data/lib/bio-publisci/dataset/interactive.rb +1 -1
- data/lib/bio-publisci/dsl/config.rb +34 -0
- data/lib/bio-publisci/dsl/dataset_dsl.rb +91 -0
- data/lib/bio-publisci/dsl/dsl.rb +69 -0
- data/lib/bio-publisci/dsl/metadata_dsl.rb +85 -0
- data/lib/bio-publisci/{metadata/prov/dsl.rb → dsl/prov_dsl.rb} +30 -6
- data/lib/bio-publisci/metadata/generator.rb +323 -0
- data/lib/bio-publisci/metadata/metadata.rb +3 -314
- data/lib/bio-publisci/metadata/prov/activity.rb +3 -1
- data/lib/bio-publisci/metadata/prov/agent.rb +1 -1
- data/lib/bio-publisci/metadata/prov/association.rb +2 -2
- data/lib/bio-publisci/metadata/prov/config.rb +34 -0
- data/lib/bio-publisci/metadata/prov/derivation.rb +7 -2
- data/lib/bio-publisci/metadata/prov/element.rb +2 -2
- data/lib/bio-publisci/metadata/prov/entity.rb +1 -22
- data/lib/bio-publisci/metadata/prov/model/prov_models.rb +8 -9
- data/lib/bio-publisci/metadata/prov/plan.rb +1 -1
- data/lib/bio-publisci/metadata/prov/prov.rb +23 -21
- data/lib/bio-publisci/metadata/prov/role.rb +1 -1
- data/lib/bio-publisci/metadata/prov/usage.rb +1 -1
- data/lib/bio-publisci/metadata/publisher.rb +25 -0
- data/lib/bio-publisci/mixins/dereferencable.rb +1 -1
- data/lib/bio-publisci/mixins/registry.rb +27 -0
- data/lib/bio-publisci/output.rb +1 -1
- data/lib/bio-publisci/parser.rb +1 -1
- data/lib/bio-publisci/query/query_helper.rb +14 -14
- data/lib/bio-publisci/r_client.rb +5 -5
- data/lib/bio-publisci/readers/arff.rb +5 -5
- data/lib/bio-publisci/readers/csv.rb +3 -3
- data/lib/bio-publisci/readers/dataframe.rb +3 -3
- data/lib/bio-publisci/readers/r_cross.rb +4 -4
- data/lib/bio-publisci/readers/r_matrix.rb +3 -3
- data/lib/bio-publisci/store.rb +3 -3
- data/lib/bio-publisci/writers/arff.rb +6 -6
- data/lib/bio-publisci/writers/dataframe.rb +5 -5
- data/scripts/islet_mlratio.rb +1 -1
- data/scripts/scan_islet.rb +1 -1
- data/scripts/update_reference.rb +2 -2
- data/spec/ORM/data_cube_orm_spec.rb +2 -2
- data/spec/ORM/prov_model_spec.rb +19 -0
- data/spec/analyzer_spec.rb +7 -7
- data/spec/data_cube_spec.rb +13 -13
- data/spec/dataset_for_spec.rb +11 -4
- data/spec/dsl_spec.rb +90 -0
- data/spec/generators/csv_spec.rb +4 -4
- data/spec/generators/dataframe_spec.rb +6 -6
- data/spec/generators/r_cross_spec.rb +2 -2
- data/spec/generators/r_matrix_spec.rb +2 -2
- data/spec/metadata/metadata_dsl_spec.rb +68 -0
- data/spec/prov/activity_spec.rb +4 -4
- data/spec/prov/agent_spec.rb +3 -4
- data/spec/prov/association_spec.rb +1 -2
- data/spec/prov/config_spec.rb +28 -0
- data/spec/prov/derivation_spec.rb +30 -0
- data/spec/prov/entity_spec.rb +3 -4
- data/spec/prov/role_spec.rb +1 -2
- data/spec/prov/usage_spec.rb +1 -2
- data/spec/r_builder_spec.rb +3 -3
- data/spec/turtle/bacon +20 -4
- data/spec/turtle/reference +20 -4
- metadata +37 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 84c3e7a1f4ffe93284a75856a424d4f86624032f
|
4
|
+
data.tar.gz: 834eb95f1ef0e2353d3aab93bcf4d9c35f34a1d4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b1c7a7e6f43f26f089a871fffafc10b0f6eb35b6367dde310e1e2df09c9ab40d725048d6291c5e67c12d32454d36a5539342f71130a90121bd4dd19946050f2b
|
7
|
+
data.tar.gz: 91a1bf68f52d3477d5fa5a89762619cdf7b038d3af49042cf34ce1b6f90e833324cea537bc60e9c6afc23c86163f44855f739e1838266cf0b905f5c20b2a9679
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -21,7 +21,7 @@ Jeweler::Tasks.new do |gem|
|
|
21
21
|
gem.description = %Q{A toolkit for publishing scientific results and datasets using RDF, OWL, and related technologies }
|
22
22
|
gem.email = "wstrinz@gmail.com"
|
23
23
|
gem.authors = ["Will Strinz"]
|
24
|
-
gem.version = "0.0.
|
24
|
+
gem.version = "0.0.7"
|
25
25
|
|
26
26
|
# dependencies defined in Gemfile
|
27
27
|
end
|
data/examples/prov_dsl.prov
CHANGED
@@ -0,0 +1,66 @@
|
|
1
|
+
# Provenance generation code for primer example at
|
2
|
+
# http://www.w3.org/TR/prov-primer/images/agents.png
|
3
|
+
|
4
|
+
# Set the base url
|
5
|
+
base_url "http://example.org"
|
6
|
+
|
7
|
+
# Elements can be created with an options hash
|
8
|
+
entity :chart1, attributed_to: :derek
|
9
|
+
|
10
|
+
# entity => http://www.w3.org/TR/prov-o/#Entity
|
11
|
+
entity :composition1
|
12
|
+
entity :regionList1
|
13
|
+
|
14
|
+
# Elements can also be defined using a block
|
15
|
+
#
|
16
|
+
# agent => http://www.w3.org/TR/prov-o/#Agent
|
17
|
+
agent :derek do
|
18
|
+
|
19
|
+
# name => foaf:name
|
20
|
+
name "Derek"
|
21
|
+
|
22
|
+
# on_behalf_of => http://www.w3.org/TR/prov-o/#actedOnBehalfOf
|
23
|
+
on_behalf_of :chartgen
|
24
|
+
end
|
25
|
+
|
26
|
+
# Some methods are just wrappers with argument generation
|
27
|
+
# "organization" is short for agent :chartgen, type: "organization"
|
28
|
+
#
|
29
|
+
# organization => http://www.w3.org/TR/prov-o/#Organization
|
30
|
+
organization :chartgen
|
31
|
+
|
32
|
+
|
33
|
+
# An element of the correct type will be looked up for any
|
34
|
+
# method whose argument is a symbol
|
35
|
+
activity :illustrate do
|
36
|
+
|
37
|
+
# generated => http://www.w3.org/TR/prov-o/#generated
|
38
|
+
generated :chart1
|
39
|
+
|
40
|
+
# associated_with => http://www.w3.org/TR/prov-o/#wasAssociatedWith
|
41
|
+
associated_with :derek
|
42
|
+
|
43
|
+
# used => http://www.w3.org/TR/prov-o/#used
|
44
|
+
used :composition1
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
activity :compose1 do
|
49
|
+
generated :composition1
|
50
|
+
associated_with :derek
|
51
|
+
used :regionList1
|
52
|
+
|
53
|
+
# Since symbols are lazy loaded (only when looked up by generate_n3)
|
54
|
+
# you can call used here before declaring dataSet1
|
55
|
+
used :dataSet1
|
56
|
+
end
|
57
|
+
|
58
|
+
# data is aliased to entity
|
59
|
+
data :dataSet1
|
60
|
+
|
61
|
+
# Returns the turtle form of each element
|
62
|
+
generate_n3
|
63
|
+
|
64
|
+
# Can return abbreviated form by passing true
|
65
|
+
# (easier to read, some prefixes not yet included so may not work w/ triple stores)
|
66
|
+
# generate_n3(true)
|
@@ -0,0 +1,140 @@
|
|
1
|
+
require 'bio-publisci'
|
2
|
+
require 'graphviz'
|
3
|
+
|
4
|
+
def entity_node(label)
|
5
|
+
ent = @g.add_nodes(label)
|
6
|
+
ent.color = "#F3F781"
|
7
|
+
ent.style = "filled"
|
8
|
+
ent
|
9
|
+
end
|
10
|
+
|
11
|
+
def agent_node(label)
|
12
|
+
ag = @g.add_nodes(label)
|
13
|
+
ag.color = "#FE9A2E"
|
14
|
+
ag.style = "filled"
|
15
|
+
ag.shape = "box"
|
16
|
+
ag
|
17
|
+
end
|
18
|
+
|
19
|
+
def activity_node(label)
|
20
|
+
act = @g.add_nodes(label)
|
21
|
+
act.color = "#5858FA"
|
22
|
+
act.style = "filled"
|
23
|
+
act.shape = "box"
|
24
|
+
act
|
25
|
+
end
|
26
|
+
|
27
|
+
def generic_node(label)
|
28
|
+
act = @g.add_nodes(label)
|
29
|
+
# act.color = "#5858FA"
|
30
|
+
# act.style = "filled"
|
31
|
+
act.shape = "box"
|
32
|
+
act
|
33
|
+
end
|
34
|
+
|
35
|
+
def make_edges(from_obj,to_class,predicate)
|
36
|
+
# from_class.enum_for.to_a.map{|from_obj|
|
37
|
+
raise "Unknown From Node: #{from_obj.subject}" unless @nodemap[from_obj.subject]
|
38
|
+
relation = from_obj.send(predicate)
|
39
|
+
if relation
|
40
|
+
if relation.is_a? Array
|
41
|
+
relation.map{|r|
|
42
|
+
other = to_class.for(r)
|
43
|
+
raise "Unknown To Node: #{other.subject}" unless @nodemap[other.subject]
|
44
|
+
@g.add_edges(@nodemap[from_obj.subject],@nodemap[other.subject]).label=predicate.to_s
|
45
|
+
}
|
46
|
+
else
|
47
|
+
other = to_class.for(relation)
|
48
|
+
raise "Unknown To Node: #{other.subject}" unless @nodemap[other.subject]
|
49
|
+
@g.add_edges(@nodemap[from_obj.subject],@nodemap[other.subject]).label=predicate.to_s
|
50
|
+
end
|
51
|
+
end
|
52
|
+
# }
|
53
|
+
end
|
54
|
+
|
55
|
+
@nodemap={}
|
56
|
+
@g = GraphViz.new(:G, type: :digraph)
|
57
|
+
infile = ARGV[0] || 'primer.prov'
|
58
|
+
runner = PubliSci::Prov::DSL::Instance.new
|
59
|
+
runner.instance_eval(IO.read(infile),infile)
|
60
|
+
repo = runner.to_repository
|
61
|
+
Spira.add_repository :default, repo
|
62
|
+
|
63
|
+
include PubliSci::Prov::Model
|
64
|
+
|
65
|
+
Entity.enum_for.to_a.map{|e|
|
66
|
+
@nodemap[e.subject]=entity_node(e.label)
|
67
|
+
}
|
68
|
+
|
69
|
+
Agent.enum_for.to_a.map{|agent|
|
70
|
+
@nodemap[agent.subject]=agent_node(agent.label)
|
71
|
+
}
|
72
|
+
|
73
|
+
Activity.enum_for.to_a.map{|act|
|
74
|
+
@nodemap[act.subject]=activity_node(act.label)
|
75
|
+
}
|
76
|
+
|
77
|
+
Association.enum_for.to_a.map{|association|
|
78
|
+
@nodemap[association.subject]=generic_node(association.label)
|
79
|
+
}
|
80
|
+
|
81
|
+
Plan.enum_for.to_a.map{|plan|
|
82
|
+
@nodemap[plan.subject]=generic_node(plan.label)
|
83
|
+
}
|
84
|
+
|
85
|
+
|
86
|
+
# Derivation.enum_for.to_a.map{|deriv|
|
87
|
+
# @nodemap[deriv.subject]=generic_node(deriv.label)
|
88
|
+
# }
|
89
|
+
|
90
|
+
Entity.enum_for.to_a.map{|e|
|
91
|
+
attribs ={
|
92
|
+
"wasAttributedTo" => Agent,
|
93
|
+
"wasGeneratedBy" => Activity,
|
94
|
+
"wasDerivedFrom" => Entity,
|
95
|
+
}
|
96
|
+
attribs.each{|predicate,range| make_edges(e,range,predicate)}
|
97
|
+
}
|
98
|
+
|
99
|
+
Activity.enum_for.to_a.map{|act|
|
100
|
+
attribs ={
|
101
|
+
"generated" => Entity,
|
102
|
+
"used" => Entity,
|
103
|
+
"wasAssociatedWith" => Agent,
|
104
|
+
"qualifiedAssociation" => Agent,
|
105
|
+
}
|
106
|
+
attribs.each{|predicate,range| make_edges(act,range,predicate)}
|
107
|
+
}
|
108
|
+
|
109
|
+
Agent.enum_for.to_a.map{|agent|
|
110
|
+
attribs = {
|
111
|
+
"actedOnBehalfOf" => Agent
|
112
|
+
}
|
113
|
+
attribs.each{|predicate,range| make_edges(agent,range,predicate)}
|
114
|
+
}
|
115
|
+
|
116
|
+
Association.enum_for.to_a.map{|assoc|
|
117
|
+
attribs ={
|
118
|
+
"agent" => Agent,
|
119
|
+
"hadPlan" => Plan
|
120
|
+
}
|
121
|
+
attribs.each{|predicate,range| make_edges(assoc,range,predicate)}
|
122
|
+
}
|
123
|
+
|
124
|
+
# Association.enum_for.to_a.map{|assoc|
|
125
|
+
# attribs ={
|
126
|
+
# "agent" => Agent
|
127
|
+
# "hadPlan" => Plan
|
128
|
+
# }
|
129
|
+
# attribs.each{|predicate,range| make_edges(assoc,range,predicate)}
|
130
|
+
# }
|
131
|
+
|
132
|
+
# Derivation.enum_for.to_a.map{|assoc|
|
133
|
+
# attribs ={
|
134
|
+
# "agent" => Entity
|
135
|
+
# }
|
136
|
+
# attribs.each{|predicate,range| make_edges(assoc,range,predicate)}
|
137
|
+
# }
|
138
|
+
|
139
|
+
@g.output(png: "out.png")
|
140
|
+
begin `eog out.png` rescue nil end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'graphviz'
|
2
|
+
|
3
|
+
def entity_node(label)
|
4
|
+
ent = @g.add_nodes(label)
|
5
|
+
ent.color = "#F3F781"
|
6
|
+
ent.style = "filled"
|
7
|
+
ent
|
8
|
+
end
|
9
|
+
|
10
|
+
def agent_node(label)
|
11
|
+
ag = @g.add_nodes(label)
|
12
|
+
ag.color = "#FE9A2E"
|
13
|
+
ag.style = "filled"
|
14
|
+
ag.shape = "box"
|
15
|
+
ag
|
16
|
+
end
|
17
|
+
|
18
|
+
def activity_node(label)
|
19
|
+
act = @g.add_nodes(label)
|
20
|
+
act.color = "#5858FA"
|
21
|
+
act.style = "filled"
|
22
|
+
act.shape = "box"
|
23
|
+
act
|
24
|
+
end
|
25
|
+
|
26
|
+
@g = GraphViz.new(:G, type: :digraph)
|
27
|
+
g = @g
|
28
|
+
|
29
|
+
ent_n = entity_node("entity") #g.add_nodes("entity")
|
30
|
+
ag_n = activity_node("activity")
|
31
|
+
|
32
|
+
g.add_edges(ent_n,ag_n).label="attributed"
|
33
|
+
|
34
|
+
g.output(png: "out.png")
|
35
|
+
`eog out.png`
|
data/features/metadata_steps.rb
CHANGED
data/features/orm_steps.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require_relative '../lib/bio-publisci.rb'
|
2
2
|
|
3
3
|
Given /^an ORM::DataCube entitled "(.*?)"$/ do |name|
|
4
|
-
@cube =
|
4
|
+
@cube = PubliSci::ORM::DataCube.new(name: name)
|
5
5
|
end
|
6
6
|
|
7
7
|
Given /^an ORM::DataCube entitled "(.*?)" with the following options:$/ do |name, opts|
|
@@ -18,7 +18,7 @@ Given /^an ORM::DataCube entitled "(.*?)" with the following options:$/ do |name
|
|
18
18
|
|
19
19
|
options_hash[k] = v
|
20
20
|
}
|
21
|
-
@cube =
|
21
|
+
@cube = PubliSci::ORM::DataCube.new(options_hash)
|
22
22
|
end
|
23
23
|
|
24
24
|
Given(/^a turtle string from file (.*)$/) do |file|
|
@@ -30,7 +30,7 @@ Given(/^the URI string "(.*?)"$/) do |uri|
|
|
30
30
|
end
|
31
31
|
|
32
32
|
When(/^I call the ORM::DataCube class method load on it$/) do
|
33
|
-
@cube =
|
33
|
+
@cube = PubliSci::ORM::DataCube.load(@string)
|
34
34
|
end
|
35
35
|
|
36
36
|
When /^I add a "(.*?)" dimension$/ do |dim|
|
@@ -70,5 +70,5 @@ Then /^the to_n3 method should return a string with a "(.*?)"$/ do |search|
|
|
70
70
|
end
|
71
71
|
|
72
72
|
Then(/^I should receive an ORM::DataCube object$/) do
|
73
|
-
@cube.is_a?(
|
73
|
+
@cube.is_a?(PubliSci::ORM::DataCube).should == true
|
74
74
|
end
|
data/features/reader_steps.rb
CHANGED
data/features/store_steps.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require_relative '../lib/bio-publisci.rb'
|
2
2
|
|
3
3
|
Given /a store of type (.*?)$/ do |type|
|
4
|
-
@store =
|
4
|
+
@store = PubliSci::Store.new(type: :"#{type}")
|
5
5
|
end
|
6
6
|
|
7
7
|
When /^I call the stores add method with the turtle file (.*?) and an RDF::(.*?)$/ do |file,graph|
|
data/features/writer.feature
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Feature: export to various formats using writers
|
2
2
|
|
3
3
|
In order to use RDF encoded data in other applications
|
4
|
-
I want to export domain objects using an
|
4
|
+
I want to export domain objects using an PubliSci::Writer object
|
5
5
|
|
6
6
|
Scenario: write to ARFF format
|
7
7
|
Given a ARFF writer
|
data/features/writer_steps.rb
CHANGED
data/lib/bio-publisci.rb
CHANGED
@@ -7,6 +7,11 @@ require 'rserve'
|
|
7
7
|
require 'sparql'
|
8
8
|
require 'sparql/client'
|
9
9
|
require 'rdf/turtle'
|
10
|
+
begin
|
11
|
+
require 'spira'
|
12
|
+
rescue LoadError
|
13
|
+
puts "can't load spira; orm unavailable"
|
14
|
+
end
|
10
15
|
|
11
16
|
def load_folder(folder)
|
12
17
|
Dir.foreach(File.dirname(__FILE__) + "/#{folder}") do |file|
|
@@ -27,11 +32,14 @@ load File.dirname(__FILE__) + '/bio-publisci/analyzer.rb'
|
|
27
32
|
load File.dirname(__FILE__) + '/bio-publisci/store.rb'
|
28
33
|
load File.dirname(__FILE__) + '/bio-publisci/dataset/data_cube.rb'
|
29
34
|
load File.dirname(__FILE__) + '/bio-publisci/dataset/dataset_for.rb'
|
35
|
+
load File.dirname(__FILE__) + '/bio-publisci/dataset/configuration.rb'
|
36
|
+
load File.dirname(__FILE__) + '/bio-publisci/dataset/dataset.rb'
|
30
37
|
load File.dirname(__FILE__) + '/bio-publisci/output.rb'
|
31
|
-
load File.dirname(__FILE__) + '/bio-publisci/metadata/prov/prov.rb'
|
32
38
|
load File.dirname(__FILE__) + '/bio-publisci/metadata/prov/element.rb'
|
39
|
+
load File.dirname(__FILE__) + '/bio-publisci/metadata/prov/prov.rb'
|
33
40
|
|
34
41
|
|
42
|
+
load_folder('bio-publisci/dsl')
|
35
43
|
load_folder('bio-publisci/metadata')
|
36
44
|
load_folder('bio-publisci/metadata/prov')
|
37
45
|
load_folder('bio-publisci/metadata/prov/model')
|
@@ -42,4 +50,4 @@ load_folder('bio-publisci/dataset/ORM')
|
|
42
50
|
# unless file == "." or file == ".."
|
43
51
|
# load File.dirname(__FILE__) + '/generators/' + file
|
44
52
|
# end
|
45
|
-
# end
|
53
|
+
# end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
module
|
2
|
-
|
1
|
+
module PubliSci
|
2
|
+
|
3
3
|
#handles analysis of R expression to extract properties and recognize potential
|
4
4
|
#ambiguity
|
5
5
|
module Analyzer
|
@@ -13,10 +13,10 @@ module R2RDF
|
|
13
13
|
data.map{|datum|
|
14
14
|
return true if dirty?(datum)
|
15
15
|
}
|
16
|
-
else
|
16
|
+
else
|
17
17
|
dirty_characters = [".",' ']
|
18
18
|
if data.to_s.scan(/./) & dirty_characters
|
19
|
-
true
|
19
|
+
true
|
20
20
|
else
|
21
21
|
false
|
22
22
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'rdf/4store'
|
2
|
-
require 'spira'
|
3
2
|
|
4
|
-
module
|
3
|
+
module PubliSci
|
5
4
|
module ORM
|
6
5
|
|
7
6
|
# class Person < Spira::Base
|
@@ -53,7 +52,7 @@ module R2RDF
|
|
53
52
|
end
|
54
53
|
|
55
54
|
def observation
|
56
|
-
unless
|
55
|
+
unless PubliSci::ORM.const_defined?("Observation")
|
57
56
|
obs = Class.new(Spira::Base) do
|
58
57
|
type RDF::URI.new('http://purl.org/linked-data/cube#Observation')
|
59
58
|
|
@@ -63,13 +62,13 @@ module R2RDF
|
|
63
62
|
property strip_uri(component.subject.to_s), predicate: component.subject
|
64
63
|
}
|
65
64
|
end
|
66
|
-
|
65
|
+
PubliSci::ORM.const_set("Observation",obs)
|
67
66
|
end
|
68
67
|
Observation
|
69
68
|
end
|
70
69
|
|
71
70
|
def reload_observation
|
72
|
-
|
71
|
+
PubliSci::ORM.send(:remove_const, "Observation")
|
73
72
|
observation
|
74
73
|
end
|
75
74
|
|