mexico 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- 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
|