mexico 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. checksums.yaml +15 -0
  2. data/.document +5 -0
  3. data/.gitmodules +3 -0
  4. data/.project +14 -0
  5. data/.rspec +2 -0
  6. data/Gemfile +31 -0
  7. data/LICENSE.txt +165 -0
  8. data/README.md +116 -0
  9. data/Rakefile +66 -0
  10. data/VERSION +1 -0
  11. data/assets/TESTCORPUS/Corpus.xml +26 -0
  12. data/assets/fiesta/b6/layer_connectors.fst +16 -0
  13. data/assets/fiesta/b6/match_jones_161_CM_neu_checked.parsed.xml +1225 -0
  14. data/assets/fiesta/elan/ElanFileFormat.eaf +76 -0
  15. data/assets/fiesta/elan/ElanFileFormat.pfsx +8 -0
  16. data/assets/fiesta/elan/ElanFileFormatComplexInterLayerLinks.eaf +107 -0
  17. data/assets/fiesta/elan/reflinks_example.eaf +270 -0
  18. data/assets/fiesta/elan/test_all_interlayerrelations.fst +43 -0
  19. data/assets/fiesta/head/head.fst +24 -0
  20. data/assets/fiesta/praat/mexico.ShortTextGrid +81 -0
  21. data/assets/fiesta/praat/mexico.TextGrid +104 -0
  22. data/assets/helpers/collection_ref_handler.rb +29 -0
  23. data/assets/helpers/id_ref_handler.rb +29 -0
  24. data/assets/helpers/roxml_attribute_handler.rb +57 -0
  25. data/assets/out_only/construct_and_write_spec.toe +99 -0
  26. data/assets/spec.html +554 -0
  27. data/bin/mexico +5 -0
  28. data/features/mexico.feature +9 -0
  29. data/features/step_definitions/mexico_steps.rb +0 -0
  30. data/features/support/env.rb +15 -0
  31. data/info/releasenotes/0.0.1.md +5 -0
  32. data/info/releasenotes/0.0.2.md +5 -0
  33. data/info/releasenotes/0.0.3.md +5 -0
  34. data/info/releasenotes/0.0.4.md +5 -0
  35. data/info/releasenotes/0.0.5.md +8 -0
  36. data/info/releasenotes/0.0.6.md +3 -0
  37. data/info/releasenotes/0.0.7.md +4 -0
  38. data/info/releasenotes/0.0.8.md +9 -0
  39. data/info/releasenotes/0.0.9.md +7 -0
  40. data/lib/mexico/cmd.rb +210 -0
  41. data/lib/mexico/constants.rb +82 -0
  42. data/lib/mexico/constraints/constraint.rb +85 -0
  43. data/lib/mexico/constraints/fiesta_constraints.rb +209 -0
  44. data/lib/mexico/constraints.rb +27 -0
  45. data/lib/mexico/core/corpus_core.rb +39 -0
  46. data/lib/mexico/core/design_core.rb +31 -0
  47. data/lib/mexico/core/media_type.rb +61 -0
  48. data/lib/mexico/core.rb +36 -0
  49. data/lib/mexico/fiesta/interfaces/b6_chat_game_interface.rb +222 -0
  50. data/lib/mexico/fiesta/interfaces/elan_interface.rb +143 -0
  51. data/lib/mexico/fiesta/interfaces/short_text_grid_interface.rb +99 -0
  52. data/lib/mexico/fiesta/interfaces/text_grid_interface.rb +103 -0
  53. data/lib/mexico/fiesta/interfaces.rb +31 -0
  54. data/lib/mexico/fiesta.rb +27 -0
  55. data/lib/mexico/file_system/bound_to_corpus.rb +37 -0
  56. data/lib/mexico/file_system/corpus.rb +207 -0
  57. data/lib/mexico/file_system/data.rb +96 -0
  58. data/lib/mexico/file_system/design.rb +75 -0
  59. data/lib/mexico/file_system/design_component.rb +78 -0
  60. data/lib/mexico/file_system/entry.rb +59 -0
  61. data/lib/mexico/file_system/fiesta_document.rb +344 -0
  62. data/lib/mexico/file_system/fiesta_map.rb +112 -0
  63. data/lib/mexico/file_system/head.rb +33 -0
  64. data/lib/mexico/file_system/id_ref.rb +46 -0
  65. data/lib/mexico/file_system/implicit_item_link.rb +19 -0
  66. data/lib/mexico/file_system/interval_link.rb +84 -0
  67. data/lib/mexico/file_system/item.rb +166 -0
  68. data/lib/mexico/file_system/item_link.rb +98 -0
  69. data/lib/mexico/file_system/item_links_proxy.rb +13 -0
  70. data/lib/mexico/file_system/layer.rb +89 -0
  71. data/lib/mexico/file_system/layer_connector.rb +74 -0
  72. data/lib/mexico/file_system/layer_link.rb +75 -0
  73. data/lib/mexico/file_system/local_file.rb +101 -0
  74. data/lib/mexico/file_system/participant.rb +69 -0
  75. data/lib/mexico/file_system/participant_role.rb +43 -0
  76. data/lib/mexico/file_system/point_link.rb +79 -0
  77. data/lib/mexico/file_system/property.rb +35 -0
  78. data/lib/mexico/file_system/property_map.rb +37 -0
  79. data/lib/mexico/file_system/resource.rb +174 -0
  80. data/lib/mexico/file_system/scale.rb +125 -0
  81. data/lib/mexico/file_system/section.rb +41 -0
  82. data/lib/mexico/file_system/static_collection_ref.rb +64 -0
  83. data/lib/mexico/file_system/template.rb +23 -0
  84. data/lib/mexico/file_system/trial.rb +87 -0
  85. data/lib/mexico/file_system/url.rb +65 -0
  86. data/lib/mexico/file_system.rb +62 -0
  87. data/lib/mexico/not_yet_implemented_error.rb +28 -0
  88. data/lib/mexico/util/fancy_container.rb +57 -0
  89. data/lib/mexico/util.rb +51 -0
  90. data/lib/mexico.rb +36 -0
  91. data/spec/constraints/constraints_spec.rb +306 -0
  92. data/spec/core/media_type_spec.rb +50 -0
  93. data/spec/fiesta/b6_spec.rb +43 -0
  94. data/spec/fiesta/elan_spec.rb +43 -0
  95. data/spec/fiesta/head_spec.rb +54 -0
  96. data/spec/fiesta/praat_spec.rb +54 -0
  97. data/spec/fiesta/read_spec.rb +76 -0
  98. data/spec/file_system_based/better_collection_spec.rb +142 -0
  99. data/spec/file_system_based/corpus_spec.rb +194 -0
  100. data/spec/file_system_based/design_spec.rb +100 -0
  101. data/spec/file_system_based/inter_links_spec.rb +100 -0
  102. data/spec/file_system_based/item_links_spec.rb +76 -0
  103. data/spec/file_system_based/rdf_spec.rb +177 -0
  104. data/spec/file_system_based/resource_spec.rb +111 -0
  105. data/spec/file_system_based/trial_spec.rb +129 -0
  106. data/spec/spec_helper.rb +14 -0
  107. data/spec/toe/construct_and_write_spec.rb +82 -0
  108. data/spec/toe/construction_spec.rb +110 -0
  109. data/spec/toe/item_spec.rb +58 -0
  110. data/spec/toe/layer_spec.rb +63 -0
  111. data/spec/toe/scale_spec.rb +89 -0
  112. data/spec/toe/toe_document_spec.rb +39 -0
  113. data/test/helper.rb +19 -0
  114. data/test/test_mexico.rb +7 -0
  115. metadata +357 -0
@@ -0,0 +1,7 @@
1
+ ## Release notes for version 0.0.9
2
+
3
+ + **#94**: Added implementation of constraints, and specs and assets for testing or debugging constraints.
4
+ + **#150**: Created a first version of the import and export interface.
5
+ + **#152**: Importers for Praat TextGrid and ShortTextGrid formats are now integrated.
6
+ + **#153**: Completed first implementation of ELAN EAF import (still incomplete).
7
+ + **#215**: The library now has flexible accessors for scales, layers, and items.
data/lib/mexico/cmd.rb ADDED
@@ -0,0 +1,210 @@
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
+ require 'optparse'
20
+ require 'colorize'
21
+
22
+ # This class serves as the interface for the MExiCo executable. All subcommands
23
+ # of the MExiCo executable are bound to class methods of the +Cmd+ class.
24
+ class Mexico::Cmd
25
+
26
+ # Array of names of currently supported subcommands.
27
+ SUBCOMMANDS = %w(help info init status)
28
+
29
+ # Hash of descriptions for the currently supported subcommands.
30
+ SUBCOMMAND_DESCRIPTIONS = {}
31
+
32
+ SUBCOMMAND_DESCRIPTIONS["help"] = "Display helpful information and exit."
33
+ SUBCOMMAND_DESCRIPTIONS["info"] = "Display information about the corpus the current folder belongs to."
34
+ SUBCOMMAND_DESCRIPTIONS["init"] = "Create corpus structure files in an existing or new folder."
35
+ SUBCOMMAND_DESCRIPTIONS["status"] = "Show status info of file linkage and format conversion."
36
+
37
+ # the default banner to be displayed on the console when asked for how to use the executable.
38
+ DEFAULT_BANNER = "Usage: mexico [subcommand] [options]"
39
+
40
+ # Hash of option parser objects for the currently supported subcommand.s
41
+ OPTION_PARSERS = {}
42
+
43
+ OPTION_PARSERS["help"] = OptionParser.new do |opts|
44
+ end
45
+
46
+ OPTION_PARSERS["info"] = OptionParser.new do |opts|
47
+ opts.banner = "Usage: mexico info [options]"
48
+ opts.on("-p", "--path PATH", "Look for corpus manifest at PATH") do |p|
49
+ @@options[:path] = p
50
+ end
51
+ end
52
+
53
+ OPTION_PARSERS["init"] = OptionParser.new do |opts|
54
+ opts.banner = "Usage: mexico init [options]"
55
+ opts.on("-p", "--path PATH", "Create corpus folder and manifest at PATH") do |p|
56
+ @@options[:path] = p
57
+ end
58
+ end
59
+
60
+ OPTION_PARSERS.values.each do |p|
61
+ p.on("-v", "--[no-]verbose", "Run verbosely") do |v|
62
+ @@options[:verbose] = v
63
+ end
64
+ p.on("-d", "--[no-]debug", "Turn on debugging output") do |d|
65
+ @@options[:debug] = d
66
+ end
67
+ p.separator ""
68
+ p.separator "Available subcommands are"
69
+ p.separator "-------------------------"
70
+ SUBCOMMANDS.each do |sc|
71
+ p.separator "%8s - %s" % [sc, SUBCOMMAND_DESCRIPTIONS[sc]]
72
+ end
73
+ end
74
+
75
+ @@options = {}
76
+
77
+ # Helper method that writes an informative verbose message to the console
78
+ # if the +verbose+ parameter was given on the command line.
79
+ # @param (String) message A verbose message to be sent to stdout.
80
+ # @return (void)
81
+ def self.verbose(message)
82
+ puts "VERBOSE: #{message}".cyan if @@options[:verbose]
83
+ end
84
+
85
+ # Helper method that writes debugging information (typically in critical
86
+ # and error cases) to the console
87
+ # if the +debug+ parameter was given on the command line.
88
+ # @param (String) message A debugging message to be sent to stdout.
89
+ # @return (void)
90
+ def self.debug(message)
91
+ puts "DEBUG: #{message}".magenta if @@options[:debug]
92
+ end
93
+
94
+ # helper method that creates a human-readable file size representation
95
+ # (suffixed with "KB", "MB", "GB", etc.).
96
+ # @param (Number) number the number to be formatted
97
+ # @return (String) a human-readable file size representation of that number
98
+ def self.humanize(number)
99
+ prefs = %w(T G M K)
100
+ display_number = number.to_f
101
+ unit = ""
102
+ while(display_number>1000 && !prefs.empty?)
103
+ display_number = display_number / 1024.0
104
+ unit = prefs.pop()
105
+ end
106
+ return "%.1f %sB" % [display_number, unit]
107
+ end
108
+
109
+ # The core method that is called when the executable runs.
110
+ # @param (Collection) arx a list of the command line parameters.
111
+ # @return (void) Should not return anything since {System::exit}
112
+ # is usually called at some point in this method.
113
+ def self.run!(arx)
114
+ argsize = ARGV.size
115
+ if argsize>0
116
+ subcommand = ARGV.shift
117
+
118
+ if SUBCOMMANDS.include?(subcommand)
119
+ # ok, command is known
120
+ if argsize>1
121
+ OPTION_PARSERS[subcommand].parse!
122
+ else
123
+ # no more commands.
124
+ end
125
+ self.verbose "Verbose mode. MExiCo displays more info on what it does in cyan."
126
+ self.debug "Debug mode. MExiCo displays lots of internal information in magenta."
127
+ self.verbose "MExiCo #{subcommand}"
128
+ Mexico::Cmd.send(subcommand, @@options)
129
+ else
130
+ # break: command not known
131
+ OPTION_PARSERS['help'].parse!
132
+ self.help(@@options)
133
+ end
134
+ self.debug("Detected arguments: %s" % @@options)
135
+ unless ARGV.empty?
136
+ self.debug("Leftover arguments: %s" % ARGV)
137
+ end
138
+ self.debug("Subcommand: %s" % subcommand)
139
+ else
140
+ puts option_parser
141
+ exit(1)
142
+ end
143
+ exit(0)
144
+ end
145
+
146
+ # This method handles the *help* subcommand.
147
+ # @param (Hash) options a hash of raw options from the command line.
148
+ # It does nothing but output usage information to the console and quit.
149
+ # @return nil
150
+ def self.help(options)
151
+ puts "Help".magenta
152
+ puts OPTION_PARSERS['help']
153
+ exit(0)
154
+ end
155
+
156
+ # This method handles the *info* subcommand. It prints out basic information
157
+ # about an existing corpus.
158
+ # @param (Hash) options a hash of raw options from the command line.
159
+ # @return nil
160
+ def self.info(options)
161
+ # check if current folder is corpus folder
162
+ current_folder = File.dirname(__FILE__)
163
+ if options.has_key?(:path)
164
+ current_folder = options[:path]
165
+ end
166
+ corpus_manifest = File.join(current_folder,"Corpus.xml")
167
+ if File.exists?(corpus_manifest)
168
+ self.verbose "Current Directory '#{current_folder}' is a corpus folder, opening."
169
+ # open corpus manifest, analyse
170
+ corpus = Mexico::FileSystem::Corpus.open(current_folder)
171
+ puts ""
172
+ puts "-"*72
173
+ puts "%15s : %-50s" % ["Identifier", corpus.identifier]
174
+ puts "%15s : %-50s" % ["Name", corpus.name]
175
+ displ_description = ""
176
+ displ_description = corpus.description.split("\n").first unless corpus.description.blank?
177
+ displ_description = displ_description.slice(0,47)+" ..." unless displ_description.length<47
178
+ puts "%15s : %-50s" % ["Description", displ_description]
179
+ puts "-"*72
180
+ puts "%15s : %-50s" % ["Designs", corpus.designs.size]
181
+ puts "%15s : %-50s" % ["Trials", corpus.trials.size]
182
+ puts "%15s : %-50s" % ["Resources", corpus.resources.size]
183
+ puts "%15s : %-50s" % ["Local Files", corpus.resources.collect{|i| i.local_files}.flatten.size]
184
+ puts "%15s : %-50s" % ["Used Disk Space", humanize(corpus.complete_file_size)]
185
+ puts "-"*72
186
+ puts ""
187
+ else
188
+ puts "Error: No corpus manifest folder found in '#{current_folder}'.".red
189
+ puts "Seems like no corpus has been initialized here.".red
190
+ exit(1)
191
+ end
192
+ end
193
+
194
+ # This method handles the *init* subcommand. It can create the necessary structures and files
195
+ # for a new corpus folder.
196
+ # @param (Hash) options a hash of raw options from the command line.
197
+ # @return nil
198
+ def self.init(options)
199
+ puts "The 'init' subcommand is not yet implemented."
200
+ exit(0)
201
+ end
202
+
203
+ # This method handles the *status* subcommand. It outputs various pieces of information about
204
+ # the corpus, its linkage to a remote repository, untracked files, etc.
205
+ def self.status(options)
206
+ puts "The 'status' subcommand is not yet implemented."
207
+ exit(0)
208
+ end
209
+
210
+ end
@@ -0,0 +1,82 @@
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 module aggregates all constant (type-level) objects that
20
+ # are needed for corpus management.
21
+ module Mexico::Constants
22
+
23
+ # This module lists all participant roles
24
+ # that are part of the current MExiCo model.
25
+ module ParticipantRoles
26
+
27
+ # A naive participant who does not have additional
28
+ # background information about the experiment
29
+ NAIVE = Mexico::FileSystem::ParticipantRole.new :identifier =>'naive', :name => 'Naive Participant'
30
+
31
+ # A participant who has been instructed and informed
32
+ # about the experiment in at least one aspect, and
33
+ # who pretends to be naive to other participants
34
+ CONFEDERATE = Mexico::FileSystem::ParticipantRole.new :identifier =>'confederate', :name => 'Confederate'
35
+
36
+ # container for all other roles
37
+ OTHER = Mexico::FileSystem::ParticipantRole.new :identifier =>'other-participant-role', :name => 'Other'
38
+
39
+ # A collection of all participant roles currently predefined.
40
+ ALL = Array.new
41
+ ALL << ::Mexico::Constants::ParticipantRoles::NAIVE
42
+ ALL << ::Mexico::Constants::ParticipantRoles::CONFEDERATE
43
+
44
+ # retrieves a participant role object by its key.
45
+ # @param [String] key The key of the needed participant role.
46
+ # @return [Mexico::FileSystem::ParticipantRole,nil] the participant role object, or nil, if no object was found.
47
+ def self.get(key)
48
+ ::Mexico::Constants::ParticipantRoles::ALL.first{ |x| x.identifier==key}
49
+ end
50
+
51
+ # checks for the existence of a predefined participant role object.
52
+ # @param [String] key The key of the needed participant role.
53
+ # @return [true,false] true iff such a participant role object exists, false otherwise.
54
+ def self.has?(key)
55
+ ::Mexico::Constants::ParticipantRoles::ALL.select{ |x| x.identifier==key}.size>0
56
+ end
57
+
58
+ end
59
+
60
+ # Scale modes are categories of scales based on the publication by S. S. Stevens
61
+ # (Stevens, S. S. (1946). On the Theory of Scales of Measurement. Science, 103(2684), pp.677-680).
62
+ # scales have different properties and allow different operations depending on their
63
+ # level.
64
+ module ScaleModes
65
+
66
+ # The nominal scale is the simplest scale mode. It makes equality / inequality operations available.
67
+ NOMINAL = "nominal"
68
+
69
+ # The ordinal scale mode is the next mode after the nominal mode. Besides all operations of the
70
+ # nominal mode, it makes an ordering operations and comparisons available.
71
+ ORDINAL = "ordinal"
72
+
73
+ # The cardinal scale mode is the next mode after the ordinal mode. Besides all operations of the
74
+ # ordinal mode, it makes operations and comparisons based on distances or metrics available.
75
+ CARDINAL = "cardinal"
76
+
77
+ # The ratio scale mode is the next mode after the cardinal mode. Besides all operations of the
78
+ # cardinal mode, it makes operations and comparisons based on a zero point available.
79
+ RATIO = "ratio"
80
+ end
81
+
82
+ end
@@ -0,0 +1,85 @@
1
+ # encoding: utf-8
2
+ # This file is part of the MExiCo gem.
3
+ # Copyright (c) 2012-2014 Peter Menke, SFB 673, Universität Bielefeld
4
+ # http://www.sfb673.org
5
+ #
6
+ # MExiCo is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Lesser General Public License as
8
+ # published by the Free Software Foundation, either version 3 of
9
+ # the License, or (at your option) any later version.
10
+ #
11
+ # MExiCo is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Lesser General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Lesser General Public
17
+ # License along with MExiCo. If not, see
18
+ # <http://www.gnu.org/licenses/>.
19
+
20
+ # This class defines a constraint used for type-validating an object.
21
+
22
+ class Mexico::Constraints::Constraint
23
+
24
+
25
+ def self.create(key, config={}, &evaluator)
26
+ constraint = self.new(key, evaluator)
27
+ constraint.add_parent(config[:parent]) if config.has_key?(:parent)
28
+ config[:parents].each{ |p| constraint.add_parent(p) } if config.has_key?(:parents)
29
+
30
+ @@REGISTERED_CONSTRAINTS = {} unless defined?(@@REGISTERED_CONSTRAINTS)
31
+ @@REGISTERED_CONSTRAINTS[key] = constraint
32
+
33
+ return constraint
34
+ end
35
+
36
+ def self.knows?(key)
37
+ defined?(@@REGISTERED_CONSTRAINTS) && @@REGISTERED_CONSTRAINTS.has_key?(key)
38
+ end
39
+
40
+ def self.get(key)
41
+ defined?(@@REGISTERED_CONSTRAINTS) && @@REGISTERED_CONSTRAINTS[key]
42
+ end
43
+
44
+ def evaluate(document)
45
+ self.evaluator.call(document)
46
+ end
47
+
48
+ def initialize(key, evaluator)
49
+ @key = key
50
+ @evaluator = evaluator
51
+ @parents = []
52
+ @children = []
53
+ end
54
+
55
+ def add_parent(parent)
56
+ internal_add_parent(parent)
57
+ parent.internal_add_child(self)
58
+ end
59
+
60
+ def add_child(child)
61
+ internal_add_child(child)
62
+ child.internal_add_parent(self)
63
+ end
64
+
65
+
66
+ attr_reader :evaluator
67
+ attr_accessor :key
68
+ attr_accessor :parents
69
+ attr_accessor :children
70
+
71
+ private
72
+
73
+ attr_writer :evaluator
74
+
75
+ protected
76
+
77
+ def internal_add_parent(parent)
78
+ @parents << parent
79
+ end
80
+
81
+ def internal_add_child(child)
82
+ @children << child
83
+ end
84
+
85
+ end
@@ -0,0 +1,209 @@
1
+ # encoding: utf-8
2
+ # This file is part of the MExiCo gem.
3
+ # Copyright (c) 2012-2014 Peter Menke, SFB 673, Universität Bielefeld
4
+ # http://www.sfb673.org
5
+ #
6
+ # MExiCo is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Lesser General Public License as
8
+ # published by the Free Software Foundation, either version 3 of
9
+ # the License, or (at your option) any later version.
10
+ #
11
+ # MExiCo is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Lesser General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Lesser General Public
17
+ # License along with MExiCo. If not, see
18
+ # <http://www.gnu.org/licenses/>.
19
+
20
+
21
+ module Mexico::Constraints::FiestaConstraints
22
+
23
+ include Mexico::Constraints
24
+
25
+ TOP = Constraint.create('TOP') do |doc|
26
+ true
27
+ end
28
+
29
+ # # # # # # # # # # # # # # # # # # # # # # # # # # #
30
+ # Scale-related constraints
31
+ # # # # # # # # # # # # # # # # # # # # # # # # # # #
32
+
33
+ SCALES_TOP = Constraint.create('SCALES_TOP', parent: TOP) do |doc|
34
+ true
35
+ end
36
+
37
+ SCALES_LTE_3 = Constraint.create('SCALES_LTE_3', parent: SCALES_TOP) do |doc|
38
+ doc.scales.size <= 3
39
+ end
40
+
41
+ SCALES_LTE_2 = Constraint.create('SCALES_LTE_2', parent: SCALES_LTE_3) do |doc|
42
+ doc.scales.size <= 2
43
+ end
44
+
45
+ SCALES_LTE_1 = Constraint.create('SCALES_LTE_1', parent: SCALES_LTE_2) do |doc|
46
+ doc.scales.size <= 1
47
+ end
48
+
49
+ SCALES_GTE_1 = Constraint.create('SCALES_GTE_1', parent: SCALES_TOP) do |doc|
50
+ doc.scales.size >= 1
51
+ end
52
+
53
+ SCALES_GTE_2 = Constraint.create('SCALES_GTE_2', parent: SCALES_GTE_1) do |doc|
54
+ doc.scales.size >= 2
55
+ end
56
+
57
+ SCALES_GTE_3 = Constraint.create('SCALES_GTE_3', parent: SCALES_GTE_2) do |doc|
58
+ doc.scales.size >= 3
59
+ end
60
+
61
+ SCALES_GTE_4 = Constraint.create('SCALES_GTE_4', parent: SCALES_GTE_3) do |doc|
62
+ doc.scales.size >= 4
63
+ end
64
+
65
+ SCALES_HAS_1_TIMELINE = Constraint.create('SCALES_HAS_1_TIMELINE', parent: SCALES_GTE_1) do |doc|
66
+ SCALES_GTE_1.evaluate(doc) && doc.scales[0].is_timeline?
67
+ end
68
+
69
+ SCALES_HAS_2_TIMELINES = Constraint.create('SCALES_HAS_2_TIMELINES', parent: SCALES_GTE_2) do |doc|
70
+ SCALES_GTE_2.evaluate(doc) && doc.scales[0].is_timeline? && doc.scales[1].is_timeline?
71
+ end
72
+
73
+ SCALES_EX_1_TIMELINE = Constraint.create('SCALES_EX_1_TIMELINE', parents: [SCALES_HAS_1_TIMELINE,SCALES_LTE_1]) do |doc|
74
+ SCALES_HAS_1_TIMELINE.evaluate(doc) && SCALES_LTE_1.evaluate(doc)
75
+ end
76
+
77
+
78
+ # # # # # # # # # # # # # # # # # # # # # # # # # # #
79
+ # Constraints related to layer structures
80
+ # # # # # # # # # # # # # # # # # # # # # # # # # # #
81
+
82
+ LAYERS_TOP = Constraint.create('LAYERS_TOP', parent: TOP) do |doc|
83
+ true
84
+ end
85
+
86
+ LAYERS_GRAPH = Constraint.create('LAYERS_GRAPH', parent: LAYERS_TOP) do |doc|
87
+ true
88
+ end
89
+
90
+ LAYERS_DAG = Constraint.create('LAYERS_DAG', parent: LAYERS_GRAPH) do |doc|
91
+ doc.layers_form_a_dag?
92
+ end
93
+
94
+ LAYERS_CDAG = Constraint.create('LAYERS_CDAG', parent: LAYERS_DAG) do |doc|
95
+ doc.layers_form_a_cdag?
96
+ end
97
+
98
+ LAYERS_FOREST = Constraint.create('LAYERS_FOREST', parent: LAYERS_DAG) do |doc|
99
+ doc.layers_form_a_forest?
100
+ end
101
+
102
+ LAYERS_TREE = Constraint.create('LAYERS_TREE', parents: [LAYERS_CDAG,LAYERS_FOREST]) do |doc|
103
+ doc.layers_form_a_tree?
104
+ end
105
+
106
+ LAYERS_EDGELESS = Constraint.create('LAYERS_EDGELESS', parent: LAYERS_FOREST) do |doc|
107
+ doc.layers_form_an_edgeless_graph?
108
+ end
109
+
110
+ LAYERS_EMPTY = Constraint.create('LAYERS_EMPTY', parent: LAYERS_GRAPH) do |doc|
111
+ doc.layers_form_an_empty_graph?
112
+ end
113
+
114
+
115
+ # # # # # # # # # # # # # # # # # # # # # # # # # # #
116
+ # Constraints related to intra-layer structures
117
+ # # # # # # # # # # # # # # # # # # # # # # # # # # #
118
+
119
+ INTRALAYER_TOP = Constraint.create('INTRALAYER_TOP', parent: TOP) do |doc|
120
+ true
121
+ end
122
+
123
+ INTRALAYER_GRAPH_ALL = Constraint.create('INTRALAYER_GRAPH', parent: INTRALAYER_TOP) do |doc|
124
+ true
125
+ end
126
+
127
+ INTRALAYER_FOREST_ALL = Constraint.create('INTRALAYER_FOREST_ALL', parent: INTRALAYER_GRAPH_ALL) do |doc|
128
+ boolean_result = true
129
+ doc.layers.each do |layer|
130
+ boolean_result = boolean_result && layer.items_form_a_forest?
131
+ end
132
+ boolean_result
133
+ end
134
+
135
+ # This one is actually used.
136
+ INTRALAYER_EDGELESS_ALL = Constraint.create('INTRALAYER_EDGELESS_ALL', parent: INTRALAYER_FOREST_ALL) do |doc|
137
+ boolean_result = true
138
+ doc.layers.each do |layer|
139
+ boolean_result = boolean_result && layer.items_form_an_edgeless_graph?
140
+ end
141
+ boolean_result
142
+ end
143
+
144
+ # # # # # # # # # # # # # # # # # # # # # # # # # # #
145
+ # Constraints related to inter-layer structures
146
+ # # # # # # # # # # # # # # # # # # # # # # # # # # #
147
+
148
+ # needed: calculation of the inter-layer-graph
149
+ # take all nodes from layer 1, all nodes from layer 2
150
+ # find all item links that have a l1 node as source and an l2 node as target
151
+
152
+ INTERLAYER_TOP = Constraint.create('INTERLAYER_TOP', parent: TOP) do |doc|
153
+ true
154
+ end
155
+
156
+ INTERLAYER_SOURCE_LTE_1 = Constraint.create('INTERLAYER_SOURCE_LTE_1', parent: INTERLAYER_TOP) do |doc|
157
+ puts doc.inter_layer_source_cardinality
158
+ doc.inter_layer_source_cardinality <= 1
159
+ end
160
+
161
+ INTERLAYER_SOURCE_0 = Constraint.create('INTERLAYER_SOURCE_0', parent: INTERLAYER_SOURCE_LTE_1) do |doc|
162
+ puts doc.inter_layer_source_cardinality
163
+ doc.inter_layer_source_cardinality == 0
164
+ end
165
+
166
+ INTERLAYER_SINK_LTE_1 = Constraint.create('INTERLAYER_SINK_LTE_1', parent: INTERLAYER_TOP) do |doc|
167
+ puts doc.inter_layer_sink_cardinality
168
+ doc.inter_layer_sink_cardinality <= 1
169
+ end
170
+
171
+ INTERLAYER_SINK_0 = Constraint.create('INTERLAYER_SINK_0', parent: INTERLAYER_SINK_LTE_1) do |doc|
172
+ puts doc.inter_layer_sink_cardinality
173
+ oc.inter_layer_sink_cardinality == 0
174
+ end
175
+
176
+ INTERLAYER_1_TO_N = Constraint.create('INTERLAYER_1_TO_N', parents: [INTERLAYER_SOURCE_LTE_1]) do |doc|
177
+ INTERLAYER_SOURCE_LTE_1.evaluate(doc)
178
+ end
179
+
180
+ INTERLAYER_N_TO_1 = Constraint.create('INTERLAYER_N_TO_1', parents: [INTERLAYER_SINK_LTE_1]) do |doc|
181
+ INTERLAYER_SINK_LTE_1.evaluate(doc)
182
+ end
183
+
184
+ INTERLAYER_1_TO_1 = Constraint.create('INTERLAYER_1_TO_1', parents: [INTERLAYER_1_TO_N, INTERLAYER_N_TO_1]) do |doc|
185
+ INTERLAYER_1_TO_N.evaluate(doc) && INTERLAYER_N_TO_1.evaluate(doc)
186
+ end
187
+
188
+ INTERLAYER_EDGELESS = Constraint.create('INTERLAYER_EDGELESS', parents: [INTERLAYER_SOURCE_0,INTERLAYER_SINK_0]) do |doc|
189
+ INTERLAYER_SOURCE_0.evaluate(doc) && INTERLAYER_SINK_0.evaluate(doc)
190
+ end
191
+
192
+
193
+ # # # # # # # # # # # # # # # # # # # # # # # # # # #
194
+ # Constraints related values
195
+ # # # # # # # # # # # # # # # # # # # # # # # # # # #
196
+
197
+ VALUES_TOP = Constraint.create('VALUES_TOP', parent: TOP) do |doc|
198
+ true
199
+ end
200
+
201
+ VALUES_STRINGS_ONLY = Constraint.create('VALUES_STRINGS_ONLY', parent: VALUES_TOP) do |doc|
202
+ doc.items.collect{|i| i.data }.all?{|d| d.is_string?}
203
+ end
204
+
205
+ VALUES_MAPS_ONLY = Constraint.create('VALUES_MAPS_ONLY', parent: VALUES_TOP) do |doc|
206
+ doc.items.collect{|i| i.data }.all?{|d| d.is_map?}
207
+ end
208
+
209
+ end
@@ -0,0 +1,27 @@
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 module aggregates all constant (type-level) objects that
20
+ # are needed for corpus management.
21
+
22
+ module Mexico::Constraints
23
+
24
+ end
25
+
26
+ require 'mexico/constraints/constraint.rb'
27
+ require 'mexico/constraints/fiesta_constraints.rb'
@@ -0,0 +1,39 @@
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 Corpus core module contains methods for implementations of the
20
+ # corpus class that are independent of the implementation.
21
+ module Mexico::Core::CorpusCore
22
+
23
+ #def included(x)
24
+ # puts "CorpusCore is now included in #{x}."
25
+ #end
26
+
27
+ #def extended(x)
28
+ # puts "CorpusCore now extends #{x}."
29
+ #end
30
+
31
+ # simple test method that can be called to see whether the module
32
+ # was included successfully
33
+ def core_included?
34
+ true
35
+ end
36
+
37
+ end
38
+
39
+
@@ -0,0 +1,31 @@
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 Design core module contains methods for implementations of the
20
+ # design class that are independent of the implementation.
21
+ module Mexico::Core::DesignCore
22
+
23
+ # simple test method that can be called to see whether the module
24
+ # was included successfully
25
+ def core_included?
26
+ true
27
+ end
28
+
29
+ end
30
+
31
+