mexico 0.0.9
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 +15 -0
- data/.document +5 -0
- data/.gitmodules +3 -0
- data/.project +14 -0
- data/.rspec +2 -0
- data/Gemfile +31 -0
- data/LICENSE.txt +165 -0
- data/README.md +116 -0
- data/Rakefile +66 -0
- data/VERSION +1 -0
- data/assets/TESTCORPUS/Corpus.xml +26 -0
- data/assets/fiesta/b6/layer_connectors.fst +16 -0
- data/assets/fiesta/b6/match_jones_161_CM_neu_checked.parsed.xml +1225 -0
- data/assets/fiesta/elan/ElanFileFormat.eaf +76 -0
- data/assets/fiesta/elan/ElanFileFormat.pfsx +8 -0
- data/assets/fiesta/elan/ElanFileFormatComplexInterLayerLinks.eaf +107 -0
- data/assets/fiesta/elan/reflinks_example.eaf +270 -0
- data/assets/fiesta/elan/test_all_interlayerrelations.fst +43 -0
- data/assets/fiesta/head/head.fst +24 -0
- data/assets/fiesta/praat/mexico.ShortTextGrid +81 -0
- data/assets/fiesta/praat/mexico.TextGrid +104 -0
- data/assets/helpers/collection_ref_handler.rb +29 -0
- data/assets/helpers/id_ref_handler.rb +29 -0
- data/assets/helpers/roxml_attribute_handler.rb +57 -0
- data/assets/out_only/construct_and_write_spec.toe +99 -0
- data/assets/spec.html +554 -0
- data/bin/mexico +5 -0
- data/features/mexico.feature +9 -0
- data/features/step_definitions/mexico_steps.rb +0 -0
- data/features/support/env.rb +15 -0
- data/info/releasenotes/0.0.1.md +5 -0
- data/info/releasenotes/0.0.2.md +5 -0
- data/info/releasenotes/0.0.3.md +5 -0
- data/info/releasenotes/0.0.4.md +5 -0
- data/info/releasenotes/0.0.5.md +8 -0
- data/info/releasenotes/0.0.6.md +3 -0
- data/info/releasenotes/0.0.7.md +4 -0
- data/info/releasenotes/0.0.8.md +9 -0
- data/info/releasenotes/0.0.9.md +7 -0
- data/lib/mexico/cmd.rb +210 -0
- data/lib/mexico/constants.rb +82 -0
- data/lib/mexico/constraints/constraint.rb +85 -0
- data/lib/mexico/constraints/fiesta_constraints.rb +209 -0
- data/lib/mexico/constraints.rb +27 -0
- data/lib/mexico/core/corpus_core.rb +39 -0
- data/lib/mexico/core/design_core.rb +31 -0
- data/lib/mexico/core/media_type.rb +61 -0
- data/lib/mexico/core.rb +36 -0
- data/lib/mexico/fiesta/interfaces/b6_chat_game_interface.rb +222 -0
- data/lib/mexico/fiesta/interfaces/elan_interface.rb +143 -0
- data/lib/mexico/fiesta/interfaces/short_text_grid_interface.rb +99 -0
- data/lib/mexico/fiesta/interfaces/text_grid_interface.rb +103 -0
- data/lib/mexico/fiesta/interfaces.rb +31 -0
- data/lib/mexico/fiesta.rb +27 -0
- data/lib/mexico/file_system/bound_to_corpus.rb +37 -0
- data/lib/mexico/file_system/corpus.rb +207 -0
- data/lib/mexico/file_system/data.rb +96 -0
- data/lib/mexico/file_system/design.rb +75 -0
- data/lib/mexico/file_system/design_component.rb +78 -0
- data/lib/mexico/file_system/entry.rb +59 -0
- data/lib/mexico/file_system/fiesta_document.rb +344 -0
- data/lib/mexico/file_system/fiesta_map.rb +112 -0
- data/lib/mexico/file_system/head.rb +33 -0
- data/lib/mexico/file_system/id_ref.rb +46 -0
- data/lib/mexico/file_system/implicit_item_link.rb +19 -0
- data/lib/mexico/file_system/interval_link.rb +84 -0
- data/lib/mexico/file_system/item.rb +166 -0
- data/lib/mexico/file_system/item_link.rb +98 -0
- data/lib/mexico/file_system/item_links_proxy.rb +13 -0
- data/lib/mexico/file_system/layer.rb +89 -0
- data/lib/mexico/file_system/layer_connector.rb +74 -0
- data/lib/mexico/file_system/layer_link.rb +75 -0
- data/lib/mexico/file_system/local_file.rb +101 -0
- data/lib/mexico/file_system/participant.rb +69 -0
- data/lib/mexico/file_system/participant_role.rb +43 -0
- data/lib/mexico/file_system/point_link.rb +79 -0
- data/lib/mexico/file_system/property.rb +35 -0
- data/lib/mexico/file_system/property_map.rb +37 -0
- data/lib/mexico/file_system/resource.rb +174 -0
- data/lib/mexico/file_system/scale.rb +125 -0
- data/lib/mexico/file_system/section.rb +41 -0
- data/lib/mexico/file_system/static_collection_ref.rb +64 -0
- data/lib/mexico/file_system/template.rb +23 -0
- data/lib/mexico/file_system/trial.rb +87 -0
- data/lib/mexico/file_system/url.rb +65 -0
- data/lib/mexico/file_system.rb +62 -0
- data/lib/mexico/not_yet_implemented_error.rb +28 -0
- data/lib/mexico/util/fancy_container.rb +57 -0
- data/lib/mexico/util.rb +51 -0
- data/lib/mexico.rb +36 -0
- data/spec/constraints/constraints_spec.rb +306 -0
- data/spec/core/media_type_spec.rb +50 -0
- data/spec/fiesta/b6_spec.rb +43 -0
- data/spec/fiesta/elan_spec.rb +43 -0
- data/spec/fiesta/head_spec.rb +54 -0
- data/spec/fiesta/praat_spec.rb +54 -0
- data/spec/fiesta/read_spec.rb +76 -0
- data/spec/file_system_based/better_collection_spec.rb +142 -0
- data/spec/file_system_based/corpus_spec.rb +194 -0
- data/spec/file_system_based/design_spec.rb +100 -0
- data/spec/file_system_based/inter_links_spec.rb +100 -0
- data/spec/file_system_based/item_links_spec.rb +76 -0
- data/spec/file_system_based/rdf_spec.rb +177 -0
- data/spec/file_system_based/resource_spec.rb +111 -0
- data/spec/file_system_based/trial_spec.rb +129 -0
- data/spec/spec_helper.rb +14 -0
- data/spec/toe/construct_and_write_spec.rb +82 -0
- data/spec/toe/construction_spec.rb +110 -0
- data/spec/toe/item_spec.rb +58 -0
- data/spec/toe/layer_spec.rb +63 -0
- data/spec/toe/scale_spec.rb +89 -0
- data/spec/toe/toe_document_spec.rb +39 -0
- data/test/helper.rb +19 -0
- data/test/test_mexico.rb +7 -0
- metadata +357 -0
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
# This file is part of the MExiCo gem.
|
|
2
|
+
# Copyright (c) 2012-2014 Peter Menke, SFB 673, Universität Bielefeld
|
|
3
|
+
# http://www.sfb673.org
|
|
4
|
+
#
|
|
5
|
+
# MExiCo is free software: you can redistribute it and/or modify
|
|
6
|
+
# it under the terms of the GNU Lesser General Public License as
|
|
7
|
+
# published by the Free Software Foundation, either version 3 of
|
|
8
|
+
# the License, or (at your option) any later version.
|
|
9
|
+
#
|
|
10
|
+
# MExiCo is distributed in the hope that it will be useful,
|
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
# GNU Lesser General Public License for more details.
|
|
14
|
+
#
|
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
|
16
|
+
# License along with MExiCo. If not, see
|
|
17
|
+
# <http://www.gnu.org/licenses/>.
|
|
18
|
+
|
|
19
|
+
# This class provides a corpus representation that is backed up by the filesystem.
|
|
20
|
+
# A central Corpus definition file in the top-level folder contains an
|
|
21
|
+
# XML representation of the corpus structure, and all actual resources are found
|
|
22
|
+
# as files on a file system reachable from the top-level folder.
|
|
23
|
+
|
|
24
|
+
require 'poseidon'
|
|
25
|
+
|
|
26
|
+
# FiESTA Document
|
|
27
|
+
class Mexico::FileSystem::FiestaDocument
|
|
28
|
+
|
|
29
|
+
# This class stands for an XML document in the Toe format.
|
|
30
|
+
|
|
31
|
+
include ::ROXML
|
|
32
|
+
|
|
33
|
+
extend ::Mexico::Util::FancyContainer
|
|
34
|
+
|
|
35
|
+
xml_name 'FiestaDocument'
|
|
36
|
+
|
|
37
|
+
# identifier
|
|
38
|
+
xml_accessor :identifier, :from => '@id'
|
|
39
|
+
|
|
40
|
+
# type String
|
|
41
|
+
xml_accessor :name, :from => '@name'
|
|
42
|
+
|
|
43
|
+
# type Mexico::FileSystem::Head
|
|
44
|
+
xml_accessor :head, :from => "Head", :as => Mexico::FileSystem::Head
|
|
45
|
+
|
|
46
|
+
# collection of Mexico::FileSystem::Scale
|
|
47
|
+
xml_accessor :scales_container, :as => [::Mexico::FileSystem::Scale], :from => "Scale", :in => "ScaleSet"
|
|
48
|
+
|
|
49
|
+
# collection of Mexico::FileSystem::Layer
|
|
50
|
+
xml_accessor :layers_container, :as => [::Mexico::FileSystem::Layer], :from => "Layer", :in => "LayerSet"
|
|
51
|
+
|
|
52
|
+
# collection of Mexico::FileSystem::Layer
|
|
53
|
+
xml_accessor :layer_connectors, :as => [::Mexico::FileSystem::LayerConnector], :from => "LayerConnector", :in => "LayerSet"
|
|
54
|
+
|
|
55
|
+
# collection of Mexico::FileSystem::Item
|
|
56
|
+
xml_accessor :items_container, :as => [::Mexico::FileSystem::Item], :from => "Item", :in => "ItemSet"
|
|
57
|
+
|
|
58
|
+
attr_accessor :resource
|
|
59
|
+
|
|
60
|
+
add_fancy_container :scales
|
|
61
|
+
add_fancy_container :layers
|
|
62
|
+
add_fancy_container :items
|
|
63
|
+
|
|
64
|
+
@@CACHE = {}
|
|
65
|
+
# POSEIdON-based RDF augmentation
|
|
66
|
+
include Poseidon
|
|
67
|
+
self_uri %q(http://cats.sfb673.org/FiestaDocument)
|
|
68
|
+
# instance_uri_scheme %q(http://phoibos.sfb673.org/corpora/#{resource.corpus.identifier}/resources/#{resource.identifier}.fst)
|
|
69
|
+
instance_uri_scheme %q(http://phoibos.sfb673.org/resources/#{identifier})
|
|
70
|
+
rdf_property :identifier, %q(http://cats.sfb673.org/identifier)
|
|
71
|
+
rdf_property :name, %q(http://cats.sfb673.org/name)
|
|
72
|
+
|
|
73
|
+
rdf_include :scales, %q(http://cats.sfb673.org/hasScale)
|
|
74
|
+
rdf_include :layers, %q(http://cats.sfb673.org/hasLayer)
|
|
75
|
+
rdf_include :items, %q(http://cats.sfb673.org/hasItem)
|
|
76
|
+
|
|
77
|
+
# Retrieves a stored object from the temporary import cache.
|
|
78
|
+
# @param (String) xml_id The xml id of the needed object.
|
|
79
|
+
# @return (Object) The needed object, or +nil+ if nothing could be found.
|
|
80
|
+
def self.resolve(xml_id)
|
|
81
|
+
@@CACHE["#{Thread.current.__id__}.#{xml_id}"]
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Retrieves a stored object from the temporary import cache.
|
|
85
|
+
# @param (String) xml_id The xml id of the needed object.
|
|
86
|
+
# @return (Boolean) +true+ if there is an entry for the given id, +false+ otherwise.
|
|
87
|
+
def self.knows?(xml_id)
|
|
88
|
+
@@CACHE.has_key?("#{Thread.current.__id__}.#{xml_id}")
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Retrieves a stored object from the temporary import cache.
|
|
92
|
+
# @param (String) xml_id The xml id of the needed object.
|
|
93
|
+
# @param (String) ruby_object The ruby object to be stored.
|
|
94
|
+
# @return (void)
|
|
95
|
+
def self.store(xml_id, ruby_object)
|
|
96
|
+
@@CACHE = {} unless defined?(@@CACHE)
|
|
97
|
+
@@CACHE["#{Thread.current.__id__}.#{xml_id}"] = ruby_object
|
|
98
|
+
::Mexico::FileSystem::FiestaDocument.check_watch(xml_id, ruby_object)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Put an xml id into the watch list, along with an object and a method
|
|
102
|
+
def self.watch(needed_id, object, method)
|
|
103
|
+
@@WATCHLIST = {} unless defined?(@@WATCHLIST)
|
|
104
|
+
@@WATCHLIST["#{Thread.current.__id__}.#{needed_id}"] = [] unless @@WATCHLIST.has_key?("#{Thread.current.__id__}.#{needed_id}")
|
|
105
|
+
@@WATCHLIST["#{Thread.current.__id__}.#{needed_id}"] << [object, method]
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# Checks whether the given id/object pair is watched, and takes appropriate action
|
|
109
|
+
# if this is the case.
|
|
110
|
+
# @param (String) needed_id The XML ID that might be watched.
|
|
111
|
+
# @param (Object) needed_object The ruby object that might be watched.
|
|
112
|
+
# @return (void)
|
|
113
|
+
def self.check_watch(needed_id, needed_object)
|
|
114
|
+
if defined?(@@WATCHLIST)
|
|
115
|
+
if @@WATCHLIST.has_key?("#{Thread.current.__id__}.#{needed_id}")
|
|
116
|
+
@@WATCHLIST["#{Thread.current.__id__}.#{needed_id}"].each do |entry|
|
|
117
|
+
entry[0].send(entry[1], needed_object)
|
|
118
|
+
end
|
|
119
|
+
@@WATCHLIST.delete("#{Thread.current.__id__}.#{needed_id}")
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# Opens the document at the given location.
|
|
125
|
+
# @param (String) filename The path that points to the file to be opened.
|
|
126
|
+
# @return (Mexico::FileSystem::FiestaDocument) a toe document with that file's contents.
|
|
127
|
+
def self.open(filename)
|
|
128
|
+
self.from_xml(File.open(filename))
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# Creates a new, empty instance of a FiESTA document.
|
|
132
|
+
# @todo Check if all standard or default values are set correctly.
|
|
133
|
+
def initialize
|
|
134
|
+
super
|
|
135
|
+
@head = Mexico::FileSystem::Head.new
|
|
136
|
+
@scales_container = []
|
|
137
|
+
@layers_container = []
|
|
138
|
+
@layer_connectors = []
|
|
139
|
+
@items_container = []
|
|
140
|
+
link_document
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
# Adds a standard timeline scale to the document.
|
|
144
|
+
# @param unit [String] The unit to be used for this timeline.
|
|
145
|
+
# @return [Scale] The created timeline scale object.
|
|
146
|
+
def add_standard_timeline(unit="ms")
|
|
147
|
+
@scales_container << Mexico::FileSystem::Scale.new(identifier: 'timeline01', name: 'Timeline', unit: unit, dimension: Mexico::FileSystem::Scale::DIM_TIME)
|
|
148
|
+
@scales_container.last.document = self
|
|
149
|
+
@scales_container.last
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def add_layer(args)
|
|
153
|
+
if args.is_a?(Hash)
|
|
154
|
+
new_layer = Mexico::FileSystem::Layer.new(args.merge({document: self}))
|
|
155
|
+
@layers_container << new_layer
|
|
156
|
+
return new_layer
|
|
157
|
+
end
|
|
158
|
+
if args.is_a?(Mexico::FileSystem::Layer)
|
|
159
|
+
@layers_container << args
|
|
160
|
+
return args
|
|
161
|
+
end
|
|
162
|
+
# @TODO catch error if parameter has wrong object type
|
|
163
|
+
return nil
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
# This method attempts to link objects from other locations of the XML/object tree
|
|
167
|
+
# into position inside this object, by following the xml ids given in the
|
|
168
|
+
# appropriate fields of this class.
|
|
169
|
+
def after_parse
|
|
170
|
+
link_document
|
|
171
|
+
# then clear cache
|
|
172
|
+
@@CACHE.clear
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def link_document
|
|
176
|
+
# process xml ids
|
|
177
|
+
scales.each do |x|
|
|
178
|
+
x.document = self
|
|
179
|
+
end
|
|
180
|
+
layers.each do |x|
|
|
181
|
+
x.document = self
|
|
182
|
+
end
|
|
183
|
+
items.each do |x|
|
|
184
|
+
x.document = self
|
|
185
|
+
x.item_links.each do |y|
|
|
186
|
+
y.document = self
|
|
187
|
+
end
|
|
188
|
+
x.layer_links.each do |y|
|
|
189
|
+
y.document = self
|
|
190
|
+
end
|
|
191
|
+
x.point_links.each do |y|
|
|
192
|
+
y.document = self
|
|
193
|
+
end
|
|
194
|
+
x.interval_links.each do |y|
|
|
195
|
+
y.document = self
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def add_item(item=nil)
|
|
201
|
+
if item.nil?
|
|
202
|
+
new_item = Mexico::FileSystem::Item.new(identifier: "item#{rand(2**16)}")
|
|
203
|
+
# @TODO check if that random ID is still available!
|
|
204
|
+
end
|
|
205
|
+
if item.is_a?(Hash)
|
|
206
|
+
new_item = Mexico::FileSystem::Item.new(item.merge({document: self}))
|
|
207
|
+
end
|
|
208
|
+
if item.is_a?(Mexico::FileSystem::Item)
|
|
209
|
+
new_item = item
|
|
210
|
+
end
|
|
211
|
+
# @TODO catch error if parameter has wrong object type
|
|
212
|
+
if block_given?
|
|
213
|
+
yield new_item
|
|
214
|
+
end
|
|
215
|
+
# check if item is not in the array already
|
|
216
|
+
@items_container << new_item
|
|
217
|
+
new_item
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
def add_layer_connector(layer_connector)
|
|
221
|
+
@layer_connectors << layer_connector
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
def get_layer_by_id(id)
|
|
225
|
+
matches = layers.select{|l| l.identifier == id}
|
|
226
|
+
return matches[0] if matches.size>0
|
|
227
|
+
return nil
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
def layers_form_a_graph?
|
|
231
|
+
true
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
def layers_form_a_dag?
|
|
235
|
+
raise Mexico::NotYetImplementedError.new('This method has not been implemented yet.')
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
def layers_form_a_cdag?
|
|
239
|
+
raise Mexico::NotYetImplementedError.new('This method has not been implemented yet.')
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
def layers_form_a_forest?
|
|
243
|
+
# check whether all layers have at most one parent layer
|
|
244
|
+
self.layers.each do |layer|
|
|
245
|
+
return false if layer.predecessor_layers.size > 1
|
|
246
|
+
end
|
|
247
|
+
return true
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
def layers_form_a_tree?
|
|
251
|
+
# check whether all layers but one have exactly one parent layer
|
|
252
|
+
other_than_ones = []
|
|
253
|
+
self.layers.each do |layer|
|
|
254
|
+
s = layer.predecessor_layers.size
|
|
255
|
+
other_than_ones << s if s != 1
|
|
256
|
+
end
|
|
257
|
+
true if s.size == 1 && s.first==0
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
def layers_form_an_edgeless_graph?
|
|
261
|
+
@layer_connectors.empty?
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
def layers_form_an_empty_graph?
|
|
265
|
+
layers.empty?
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
def inter_layer_graph(layer1, layer2)
|
|
269
|
+
# 0: source items, 1: target items, 2: links
|
|
270
|
+
result_graph = {
|
|
271
|
+
sources: Set.new,
|
|
272
|
+
sinks: Set.new,
|
|
273
|
+
links: Set.new,
|
|
274
|
+
source_map: Hash.new,
|
|
275
|
+
sink_map: Hash.new
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
result_graph[:sources].merge layer1.items
|
|
279
|
+
result_graph[:sinks].merge layer2.items
|
|
280
|
+
|
|
281
|
+
links = result_graph[:sources].collect{|i| i.item_links }.flatten
|
|
282
|
+
links = links.select{|l| l.target_object.layers.include?(layer2) }
|
|
283
|
+
result_graph[:links] = links
|
|
284
|
+
|
|
285
|
+
# fill the source and target maps with data
|
|
286
|
+
result_graph[:sources].each do |node|
|
|
287
|
+
result_graph[:source_map][node] = Set.new
|
|
288
|
+
end
|
|
289
|
+
result_graph[:sinks].each do |node|
|
|
290
|
+
result_graph[:sink_map][node] = Set.new
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
result_graph[:links].each do |link|
|
|
294
|
+
source = link.item
|
|
295
|
+
sink = link.target_item
|
|
296
|
+
result_graph[:source_map][source] << sink
|
|
297
|
+
result_graph[:sink_map][sink] << source
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
result_graph
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
def inter_layer_graph_list
|
|
304
|
+
# collect all parent child pairs of layers
|
|
305
|
+
# calculate layer graphs for all of them
|
|
306
|
+
ilg_list = Hash.new
|
|
307
|
+
layers.each do |parent_layer|
|
|
308
|
+
parent_layer.successor_layers.each do |child_layer|
|
|
309
|
+
ilg_list[ [parent_layer, child_layer[0]] ] = inter_layer_graph(parent_layer, child_layer[0])
|
|
310
|
+
end
|
|
311
|
+
end
|
|
312
|
+
ilg_list
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
def source_cardinality_for_layer(layer1, layer2)
|
|
316
|
+
inter_layer_graph_list[[layer1,layer2]][:sink_map].values.collect{|m| m.size}.max
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
def sink_cardinality_for_layer(layer1, layer2)
|
|
320
|
+
inter_layer_graph_list[[layer1,layer2]][:source_map].values.collect{|m| m.size}.max
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
# Cardinality of source elements: how many links are connected to the source nodes?
|
|
325
|
+
def inter_layer_source_cardinality
|
|
326
|
+
card = 0
|
|
327
|
+
inter_layer_graph_list.each do |k,v|
|
|
328
|
+
graph_card = v[:sink_map].values.collect{|m| m.size}.max
|
|
329
|
+
card = [card,graph_card].max
|
|
330
|
+
end
|
|
331
|
+
card
|
|
332
|
+
end
|
|
333
|
+
|
|
334
|
+
# Cardinality of source elements: how many links are connected to the source nodes?
|
|
335
|
+
def inter_layer_sink_cardinality
|
|
336
|
+
card = 0
|
|
337
|
+
inter_layer_graph_list.each do |k,v|
|
|
338
|
+
graph_card = v[:source_map].values.collect{|m| m.size}.max
|
|
339
|
+
card = [card,graph_card].max
|
|
340
|
+
end
|
|
341
|
+
card
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
end
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# This file is part of the MExiCo gem.
|
|
2
|
+
# Copyright (c) 2012-2014 Peter Menke, SFB 673, Universität Bielefeld
|
|
3
|
+
# http://www.sfb673.org
|
|
4
|
+
#
|
|
5
|
+
# MExiCo is free software: you can redistribute it and/or modify
|
|
6
|
+
# it under the terms of the GNU Lesser General Public License as
|
|
7
|
+
# published by the Free Software Foundation, either version 3 of
|
|
8
|
+
# the License, or (at your option) any later version.
|
|
9
|
+
#
|
|
10
|
+
# MExiCo is distributed in the hope that it will be useful,
|
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
# GNU Lesser General Public License for more details.
|
|
14
|
+
#
|
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
|
16
|
+
# License along with MExiCo. If not, see
|
|
17
|
+
# <http://www.gnu.org/licenses/>.
|
|
18
|
+
|
|
19
|
+
# This class models a data container for map (or attribute value) structures.
|
|
20
|
+
|
|
21
|
+
class Mexico::FileSystem::FiestaMap
|
|
22
|
+
|
|
23
|
+
include ::ROXML
|
|
24
|
+
|
|
25
|
+
attr_reader :map_items
|
|
26
|
+
|
|
27
|
+
# Creates a new map instance. If initial_vals is defined and contains values,
|
|
28
|
+
# those will be used to populate the map.
|
|
29
|
+
# @param initial_vals [Hash] Initial values for the new map object.
|
|
30
|
+
def initialize(initial_vals={})
|
|
31
|
+
@map = Hash.new
|
|
32
|
+
@map.merge!(initial_vals)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Adds or modifies an entry with the key +k+ in the map.
|
|
36
|
+
# @param k [Object] The key to be used.
|
|
37
|
+
# @param v [Object] The value to be used.
|
|
38
|
+
# @return [void]
|
|
39
|
+
def []=(k,v)
|
|
40
|
+
@map[k]=v
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Retrieves the value for the given key +k+ from the map.
|
|
44
|
+
# @param k [Object] The key to be used.
|
|
45
|
+
# @return [Object,nil] The corresponding value object, or +nil+
|
|
46
|
+
# if there was no entry for the given key.
|
|
47
|
+
def [](k)
|
|
48
|
+
@map[k]
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Returns the number of entries in this map.
|
|
52
|
+
# @return [Integer] The number of entries.
|
|
53
|
+
def size
|
|
54
|
+
@map.size
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Returns +true+ iff this map is empty.
|
|
58
|
+
# @return [Boolean] Returns +true+ iff this map is empty, +false+ otherwise.
|
|
59
|
+
def empty?
|
|
60
|
+
@map.empty?
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Returns +true+ iff this map contains an entry with the given key.
|
|
64
|
+
# @param k [Object] The key to be found.
|
|
65
|
+
# @return [Boolean] Returns +true+ iff the given key is used in this map, +false+ otherwise.
|
|
66
|
+
def has_key?(k)
|
|
67
|
+
@map.has_key?(k)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Auxiliary method that reads a +FiestaMap+ object
|
|
71
|
+
# from the standard XML representation of FiESTA.
|
|
72
|
+
# @param node [XML::Node] The XML node to read from
|
|
73
|
+
# @return [FiestaMap] The map object represented in that XML node.
|
|
74
|
+
def self.from_xml(node)
|
|
75
|
+
#puts "SOMEONE CALLED FiestaMap.from_xml"
|
|
76
|
+
#puts node.name
|
|
77
|
+
# @map = Hash.new
|
|
78
|
+
|
|
79
|
+
map = self.new
|
|
80
|
+
|
|
81
|
+
node.xpath('./MapItem').each do |mi|
|
|
82
|
+
#puts mi.name
|
|
83
|
+
#puts mi['key']
|
|
84
|
+
#puts mi.text
|
|
85
|
+
map[mi['key']]=mi.text
|
|
86
|
+
end
|
|
87
|
+
#puts map.size
|
|
88
|
+
map
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Creates a human-readable string representation of this map.
|
|
92
|
+
# @return [String] A string describing this map object.
|
|
93
|
+
def to_s
|
|
94
|
+
@map.to_a.collect{|k,v| "#{k} => #{v}"}.join(", ")
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Converts this map object to its standard XML representation
|
|
98
|
+
# @todo what does the variable +x+ do?
|
|
99
|
+
# @return [XML::Node] the node containing the XML representation
|
|
100
|
+
def to_xml(x)
|
|
101
|
+
n = XML::new_node("Map")
|
|
102
|
+
@map.each_pair do |k,v|
|
|
103
|
+
i_node = XML::new_node("MapItem")
|
|
104
|
+
i_node['key'] = k
|
|
105
|
+
i_node.content = v
|
|
106
|
+
n.add_child(i_node)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
n
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# This file is part of the MExiCo gem.
|
|
2
|
+
# Copyright (c) 2012-2014 Peter Menke, SFB 673, Universität Bielefeld
|
|
3
|
+
# http://www.sfb673.org
|
|
4
|
+
#
|
|
5
|
+
# MExiCo is free software: you can redistribute it and/or modify
|
|
6
|
+
# it under the terms of the GNU Lesser General Public License as
|
|
7
|
+
# published by the Free Software Foundation, either version 3 of
|
|
8
|
+
# the License, or (at your option) any later version.
|
|
9
|
+
#
|
|
10
|
+
# MExiCo is distributed in the hope that it will be useful,
|
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
# GNU Lesser General Public License for more details.
|
|
14
|
+
#
|
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
|
16
|
+
# License along with MExiCo. If not, see
|
|
17
|
+
# <http://www.gnu.org/licenses/>.
|
|
18
|
+
|
|
19
|
+
# This class provides a corpus representation that is backed up by the filesystem.
|
|
20
|
+
# A central Corpus definition file in the top-level folder contains an
|
|
21
|
+
# XML representation of the corpus structure, and all actual resources are found
|
|
22
|
+
# as files on a file system reachable from the top-level folder.
|
|
23
|
+
|
|
24
|
+
# Add class documentation here
|
|
25
|
+
class Mexico::FileSystem::Head
|
|
26
|
+
|
|
27
|
+
include ::ROXML
|
|
28
|
+
xml_name 'Head'
|
|
29
|
+
|
|
30
|
+
# many HeadSections with keys
|
|
31
|
+
xml_accessor :sections, :as => [::Mexico::FileSystem::Section], :from => "Section"
|
|
32
|
+
|
|
33
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# This file is part of the MExiCo gem.
|
|
2
|
+
# Copyright (c) 2012-2014 Peter Menke, SFB 673, Universität Bielefeld
|
|
3
|
+
# http://www.sfb673.org
|
|
4
|
+
#
|
|
5
|
+
# MExiCo is free software: you can redistribute it and/or modify
|
|
6
|
+
# it under the terms of the GNU Lesser General Public License as
|
|
7
|
+
# published by the Free Software Foundation, either version 3 of
|
|
8
|
+
# the License, or (at your option) any later version.
|
|
9
|
+
#
|
|
10
|
+
# MExiCo is distributed in the hope that it will be useful,
|
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
# GNU Lesser General Public License for more details.
|
|
14
|
+
#
|
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
|
16
|
+
# License along with MExiCo. If not, see
|
|
17
|
+
# <http://www.gnu.org/licenses/>.
|
|
18
|
+
|
|
19
|
+
# The +IdRef+ module provides a simple mechanism to map IDREF attributes
|
|
20
|
+
# in an XML document to Ruby objects that are stored elsewhere in the
|
|
21
|
+
# object tree. They are retrieved and accessed via the central corpus
|
|
22
|
+
# object.
|
|
23
|
+
module Mexico::FileSystem::IdRef
|
|
24
|
+
|
|
25
|
+
# Defines a foreign key reference for an object. By default, it will
|
|
26
|
+
# refer to the corresponding collection in the top-level corpus, and
|
|
27
|
+
# it will retrieve the object via its +identifier+ field.
|
|
28
|
+
def id_ref(field_name)
|
|
29
|
+
|
|
30
|
+
pluralized_field_name = "#{field_name}s"
|
|
31
|
+
field_name_id = "#{field_name}_id"
|
|
32
|
+
|
|
33
|
+
define_method field_name do
|
|
34
|
+
inst_var = instance_variable_get("@#{field_name}")
|
|
35
|
+
inst_var = instance_variable_set("@#{field_name}", @corpus.send(pluralized_field_name).find{|x| x.identifier==instance_variable_get("@#{field_name_id}") }) if inst_var.nil?
|
|
36
|
+
return inst_var
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
define_method "#{field_name}=" do |param|
|
|
40
|
+
instance_variable_set("@#{field_name_id}", param.identifier)
|
|
41
|
+
instance_variable_set("@#{field_name}", param)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
class Mexico::FileSystem::ImplicitItemLink
|
|
4
|
+
|
|
5
|
+
attr_accessor :role
|
|
6
|
+
attr_accessor :target_object
|
|
7
|
+
attr_accessor :item
|
|
8
|
+
|
|
9
|
+
def initialize(args={})
|
|
10
|
+
args.each do |k,v|
|
|
11
|
+
if self.respond_to?("#{k}=")
|
|
12
|
+
send("#{k}=", v)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
alias_method :target_item, :target_object
|
|
18
|
+
|
|
19
|
+
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# This file is part of the MExiCo gem.
|
|
2
|
+
# Copyright (c) 2012-2014 Peter Menke, SFB 673, Universität Bielefeld
|
|
3
|
+
# http://www.sfb673.org
|
|
4
|
+
#
|
|
5
|
+
# MExiCo is free software: you can redistribute it and/or modify
|
|
6
|
+
# it under the terms of the GNU Lesser General Public License as
|
|
7
|
+
# published by the Free Software Foundation, either version 3 of
|
|
8
|
+
# the License, or (at your option) any later version.
|
|
9
|
+
#
|
|
10
|
+
# MExiCo is distributed in the hope that it will be useful,
|
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
# GNU Lesser General Public License for more details.
|
|
14
|
+
#
|
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
|
16
|
+
# License along with MExiCo. If not, see
|
|
17
|
+
# <http://www.gnu.org/licenses/>.
|
|
18
|
+
|
|
19
|
+
# a link that targets an interval out of a scale object.
|
|
20
|
+
class Mexico::FileSystem::IntervalLink
|
|
21
|
+
include ROXML
|
|
22
|
+
|
|
23
|
+
xml_name "IntervalLink"
|
|
24
|
+
|
|
25
|
+
# identifier
|
|
26
|
+
xml_accessor :identifier, :from => '@id'
|
|
27
|
+
|
|
28
|
+
# type Float
|
|
29
|
+
xml_accessor :min, :as => Float, :from => "@min"
|
|
30
|
+
|
|
31
|
+
# type Float
|
|
32
|
+
xml_accessor :max, :as => Float, :from => "@max"
|
|
33
|
+
|
|
34
|
+
# type String
|
|
35
|
+
xml_accessor :role, :from => '@role'
|
|
36
|
+
|
|
37
|
+
# type String
|
|
38
|
+
xml_accessor :target, :from => "@target"
|
|
39
|
+
|
|
40
|
+
attr_accessor :item
|
|
41
|
+
attr_accessor :document
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# POSEIdON-based RDF augmentation
|
|
45
|
+
include Poseidon
|
|
46
|
+
self_uri %q(http://cats.sfb673.org/PointLink)
|
|
47
|
+
instance_uri_scheme %q(#{document.self_uri}##{identifier})
|
|
48
|
+
rdf_property :identifier, %q(http://cats.sfb673.org/identifier)
|
|
49
|
+
rdf_property :role, %q(http://cats.sfb673.org/role)
|
|
50
|
+
rdf_property :min, %q(http://cats.sfb673.org/min)
|
|
51
|
+
rdf_property :max, %q(http://cats.sfb673.org/max)
|
|
52
|
+
rdf_property :target, %q(http://cats.sfb673.org/target), :value_expression => 'RDF::URI(target_object.self_uri)'
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def initialize(args={})
|
|
56
|
+
args.each do |k,v|
|
|
57
|
+
if self.respond_to?("#{k}=")
|
|
58
|
+
send("#{k}=", v)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# returns the target object, in this case, a Scale.
|
|
64
|
+
# @return (Mexico::FileSystem::Scale) the scale this interval link points to.
|
|
65
|
+
def target_object
|
|
66
|
+
@target_object
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Sets a new target object (and updates the corresponding identifier)
|
|
70
|
+
# @param (Mexico::FileSystem::Scale) new_target The new target object to set
|
|
71
|
+
# @return (void)
|
|
72
|
+
def target_object=(new_target)
|
|
73
|
+
@target_object=new_target
|
|
74
|
+
@target=target_object.identifier
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# This method attempts to link objects from other locations of the XML/object tree
|
|
78
|
+
# into position inside this object, by following the xml ids given in the
|
|
79
|
+
# appropriate fields of this class.
|
|
80
|
+
def after_parse
|
|
81
|
+
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
end
|