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.
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
+