ctioga2 0.0

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 (82) hide show
  1. data/COPYING +339 -0
  2. data/Changelog +6 -0
  3. data/bin/ctioga2 +26 -0
  4. data/lib/ctioga2/commands/arguments.rb +58 -0
  5. data/lib/ctioga2/commands/commands.rb +258 -0
  6. data/lib/ctioga2/commands/doc/doc.rb +118 -0
  7. data/lib/ctioga2/commands/doc/documentation-commands.rb +119 -0
  8. data/lib/ctioga2/commands/doc/help.rb +95 -0
  9. data/lib/ctioga2/commands/doc/html.rb +230 -0
  10. data/lib/ctioga2/commands/doc/introspection.rb +211 -0
  11. data/lib/ctioga2/commands/doc/man.rb +279 -0
  12. data/lib/ctioga2/commands/doc/markup.rb +359 -0
  13. data/lib/ctioga2/commands/general-commands.rb +119 -0
  14. data/lib/ctioga2/commands/general-types.rb +118 -0
  15. data/lib/ctioga2/commands/groups.rb +73 -0
  16. data/lib/ctioga2/commands/interpreter.rb +257 -0
  17. data/lib/ctioga2/commands/parsers/command-line.rb +187 -0
  18. data/lib/ctioga2/commands/parsers/file.rb +186 -0
  19. data/lib/ctioga2/commands/strings.rb +303 -0
  20. data/lib/ctioga2/commands/type.rb +100 -0
  21. data/lib/ctioga2/commands/variables.rb +101 -0
  22. data/lib/ctioga2/data/backends/backend.rb +260 -0
  23. data/lib/ctioga2/data/backends/backends.rb +39 -0
  24. data/lib/ctioga2/data/backends/backends/gnuplot.rb +140 -0
  25. data/lib/ctioga2/data/backends/backends/math.rb +121 -0
  26. data/lib/ctioga2/data/backends/backends/text.rb +335 -0
  27. data/lib/ctioga2/data/backends/description.rb +405 -0
  28. data/lib/ctioga2/data/backends/factory.rb +73 -0
  29. data/lib/ctioga2/data/backends/parameter.rb +109 -0
  30. data/lib/ctioga2/data/datacolumn.rb +245 -0
  31. data/lib/ctioga2/data/dataset.rb +233 -0
  32. data/lib/ctioga2/data/filters.rb +131 -0
  33. data/lib/ctioga2/data/merge.rb +43 -0
  34. data/lib/ctioga2/data/point.rb +72 -0
  35. data/lib/ctioga2/data/stack.rb +294 -0
  36. data/lib/ctioga2/graphics/coordinates.rb +73 -0
  37. data/lib/ctioga2/graphics/elements.rb +111 -0
  38. data/lib/ctioga2/graphics/elements/containers.rb +111 -0
  39. data/lib/ctioga2/graphics/elements/curve2d.rb +155 -0
  40. data/lib/ctioga2/graphics/elements/element.rb +90 -0
  41. data/lib/ctioga2/graphics/elements/primitive.rb +256 -0
  42. data/lib/ctioga2/graphics/elements/subplot.rb +140 -0
  43. data/lib/ctioga2/graphics/generator.rb +68 -0
  44. data/lib/ctioga2/graphics/legends.rb +108 -0
  45. data/lib/ctioga2/graphics/legends/area.rb +199 -0
  46. data/lib/ctioga2/graphics/legends/items.rb +183 -0
  47. data/lib/ctioga2/graphics/legends/provider.rb +58 -0
  48. data/lib/ctioga2/graphics/legends/storage.rb +65 -0
  49. data/lib/ctioga2/graphics/root.rb +209 -0
  50. data/lib/ctioga2/graphics/styles.rb +30 -0
  51. data/lib/ctioga2/graphics/styles/axes.rb +247 -0
  52. data/lib/ctioga2/graphics/styles/background.rb +122 -0
  53. data/lib/ctioga2/graphics/styles/base.rb +115 -0
  54. data/lib/ctioga2/graphics/styles/carrays.rb +53 -0
  55. data/lib/ctioga2/graphics/styles/curve.rb +101 -0
  56. data/lib/ctioga2/graphics/styles/drawable.rb +87 -0
  57. data/lib/ctioga2/graphics/styles/factory.rb +351 -0
  58. data/lib/ctioga2/graphics/styles/legend.rb +63 -0
  59. data/lib/ctioga2/graphics/styles/plot.rb +410 -0
  60. data/lib/ctioga2/graphics/styles/sets.rb +64 -0
  61. data/lib/ctioga2/graphics/styles/texts.rb +277 -0
  62. data/lib/ctioga2/graphics/subplot-commands.rb +141 -0
  63. data/lib/ctioga2/graphics/types.rb +188 -0
  64. data/lib/ctioga2/graphics/types/bijection.rb +79 -0
  65. data/lib/ctioga2/graphics/types/boundaries.rb +170 -0
  66. data/lib/ctioga2/graphics/types/boxes.rb +157 -0
  67. data/lib/ctioga2/graphics/types/dimensions.rb +157 -0
  68. data/lib/ctioga2/graphics/types/point.rb +247 -0
  69. data/lib/ctioga2/log.rb +97 -0
  70. data/lib/ctioga2/metabuilder/type.rb +316 -0
  71. data/lib/ctioga2/metabuilder/types.rb +39 -0
  72. data/lib/ctioga2/metabuilder/types/coordinates.rb +124 -0
  73. data/lib/ctioga2/metabuilder/types/dates.rb +43 -0
  74. data/lib/ctioga2/metabuilder/types/lists.rb +188 -0
  75. data/lib/ctioga2/metabuilder/types/numbers.rb +97 -0
  76. data/lib/ctioga2/metabuilder/types/strings.rb +93 -0
  77. data/lib/ctioga2/metabuilder/types/styles.rb +178 -0
  78. data/lib/ctioga2/plotmaker.rb +677 -0
  79. data/lib/ctioga2/postprocess.rb +115 -0
  80. data/lib/ctioga2/utils.rb +120 -0
  81. data/setup.rb +1586 -0
  82. metadata +144 -0
@@ -0,0 +1,405 @@
1
+ # description.rb : a system for
2
+ # Copyright (C) 2006, 2009 Vincent Fourmond
3
+
4
+ # This program is free software; you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation; either version 2 of the License, or
7
+ # (at your option) any later version.
8
+
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program; if not, write to the Free Software
16
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
+
18
+ require 'ctioga2/utils'
19
+ require 'ctioga2/data/backends/parameter'
20
+ require 'ctioga2/commands/commands'
21
+ require 'ctioga2/commands/groups'
22
+
23
+ module CTioga2
24
+
25
+ Version::register_svn_info('$Revision: 59 $', '$Date: 2009-05-28 23:15:50 +0200 (Thu, 28 May 2009) $')
26
+
27
+
28
+ module Data
29
+
30
+ module Backends
31
+
32
+ # The Description class is a meta-information class that records several
33
+ # informations about the class:
34
+ #
35
+ # * a basic name, code-like, which is used mainly for internal
36
+ # purposes;
37
+ # * a long name, more explanatory, in proper English (or any
38
+ # other language. By the way, it should definitely be
39
+ # translated in a production environment);
40
+ # * a description itself, some small text describing the nature
41
+ # of the class;
42
+ # * a list of all the Parameters that are important for the class,
43
+ # and enough to recreate the state of an object.
44
+ #
45
+ # This class is fairly general, and can be subclassed to fit specific
46
+ # needs. An example is in the SciYAG/Backend system, where the description
47
+ # of a backend is derived from Description.
48
+ #
49
+ # To make use of the Description system for a class, use the following:
50
+ #
51
+ # class SomeClass
52
+ # extend MetaBuilder::DescriptionExtend
53
+ # include MetaBuilder::DescriptionInclude
54
+ #
55
+ # describe 'someclass', 'Some nice class', <<EOD
56
+ # The description of a nice class
57
+ # EOD
58
+ #
59
+ # end
60
+ #
61
+ # Descriptions can be used in two completely different manners:
62
+ #
63
+ # * you can use a single Description to facilitate the interface
64
+ # with the user to query|save parameters;
65
+ # * you can use the Description system to describe a whole set of
66
+ # classes providing similar functions and sharing a base ancestor,
67
+ # such as series of input|output plugins, database formats,
68
+ # themes... In this case, the Description system can act as a real
69
+ # plugin factory, recording every new subclass of the base one
70
+ # and providing facilities to prompt the user.
71
+ #
72
+ # Please note that if you want to use the facilities to dynamically
73
+ # create objects at run-time, the classes used by describe
74
+ # *should not need any parameter for #initialize*.
75
+ #
76
+ # TODO: add functions to prepare commands to set the various
77
+ # parameters
78
+ #
79
+ # TODO: write the parameters stuff again...
80
+ class BackendDescription
81
+ # The Class to instantiate.
82
+ attr_accessor :object_class
83
+
84
+ # The name of the class (short, code-like)
85
+ attr_accessor :name
86
+
87
+ # (text) description !
88
+ attr_accessor :description
89
+
90
+ # Long name, the one for public display
91
+ attr_accessor :long_name
92
+
93
+ # The parameter list. The parameters are added when they are found
94
+ # in the class description, and will be used in the order found
95
+ # in this list to recreate the state; beware if one parameter is
96
+ # depending on another one.
97
+ attr_reader :param_list
98
+
99
+ # A hash index on the (short) name and the symbols of the parameters,
100
+ # for quick access. None of those should overlap.
101
+ attr_reader :param_hash
102
+
103
+ # The priority of the CmdGroup
104
+ DefaultBackendGroupPriority = 20
105
+
106
+
107
+ # Initializes a Description
108
+ def initialize(cls, name, long_name, description = "", register = true)
109
+ @object_class = cls
110
+ @name = name
111
+ @long_name = long_name
112
+ @description = description
113
+ @param_list = []
114
+ @param_hash = {}
115
+ @init_param_list = []
116
+
117
+ if register
118
+ Backend.register_class(self)
119
+ end
120
+ end
121
+
122
+ # Adds a new parameter to the description
123
+ def add_param(param)
124
+ @param_list << param
125
+
126
+ # Update the parameter hash, for easy access.
127
+ @param_hash[param.reader_symbol] = param
128
+ @param_hash[param.writer_symbol] = param
129
+ @param_hash[param.name] = param
130
+
131
+ # Update the current group, if necessary
132
+ @current_group.add_parameter(param) unless @current_group.nil?
133
+ end
134
+
135
+ # Creates an instance of the Backend described by this
136
+ # BackendDescription. It takes parameters that are fed
137
+ # to the new function, but don't use them.
138
+ def instantiate(*a)
139
+ return @object_class.new(*a)
140
+ end
141
+
142
+ # Creates a set of Cmd to interact with a given
143
+ # Backend. Commands created are:
144
+ # * one for each parameter to allow modification of its type
145
+ # * one for the selection of the Backend, allowing the use of
146
+ # optional arguments to change (permanently) the behaviour
147
+ # of the Backend.
148
+ #
149
+ # In addition, this function creates a group to store Backend
150
+ # commands.
151
+ #
152
+ # TODO: finish this !!!
153
+ def create_backend_commands
154
+ group = CmdGroup.
155
+ new("backend-#{@name}",
156
+ "The '#{@name}' backend: #{@long_name}",
157
+ "The commands in this group drive the "+
158
+ "behaviour of the #{@long_name} backend.\n" +
159
+ @description,
160
+ DefaultBackendGroupPriority)
161
+
162
+ backend_options = {}
163
+
164
+ # Again, each is needed for scoping problems.
165
+ @param_list.each do |param|
166
+ arg = CmdArg.new(param.type, param.name)
167
+ a = Cmd.new("#{@name}-#{param.name}",
168
+ nil, "--#{@name}-#{param.name}",
169
+ [arg], {},
170
+ "Set the #{param.long_name} parameter of backend '#{@name}'",
171
+ param.description, group) do |plotmaker, value|
172
+ plotmaker.data_stack.backend_factory.
173
+ set_backend_parameter_value(@name, param.name, value)
174
+ end
175
+ backend_options[param.name] = arg.dup
176
+ end
177
+
178
+ # TODO: add option parsing
179
+ Cmd.new("#{@name}", nil, "--#{@name}", [],
180
+ backend_options, "Selects the '#{@name}' backend",
181
+ nil, group) do |plotmaker, options|
182
+ plotmaker.data_stack.backend_factory.set_current_backend(@name)
183
+ for k,v in options
184
+ plotmaker.data_stack.backend_factory.
185
+ set_backend_parameter_value(@name, k, v)
186
+ end
187
+ end
188
+ end
189
+
190
+ end
191
+
192
+ # This module should be used with +extend+ to provide the class
193
+ # with descriptions functionnalities. Please not that all the
194
+ # *instance* methods defined here will become *class* methods in
195
+ # the class you extend.
196
+ #
197
+ # This module defines several methods to add a description
198
+ # (#describe) to a class, to add parameters (#param,
199
+ # #param_noaccess) and to import parameters from parents
200
+ # (#inherit_parameters).
201
+ #
202
+ # Factories can be created using the #craete_factory statement.
203
+ # This makes the current class the factory repository for all
204
+ # the subclasses. It creates a factory class method returning
205
+ # the base factory. You can use #register_class to register the
206
+ # current class into the base factory class.
207
+ module BackendDescriptionExtend
208
+
209
+ # The functions for factory handling.
210
+
211
+ # Makes this class the factory class for all subclasses. It
212
+ # creates four class methods: base_factory, that always points
213
+ # to the closest factory in the hierarchy and three methods
214
+ # used internally.
215
+ #
216
+ # If _auto_ is true, the subclasses are all automatically
217
+ # registered to the factory. If _register_self_ is true the
218
+ # class itself is registered. It is probably not a good idea,
219
+ # so it is off by default.
220
+ def create_factory(auto = true, register_self = false)
221
+ cls = self
222
+ # we create a temporary module so that we can use
223
+ # define_method with a block and extend this class with it
224
+ mod = Module.new
225
+ mod.send(:define_method, :factory) do
226
+ return cls
227
+ end
228
+ mod.send(:define_method, :private_description_list) do
229
+ return @registered_descriptions
230
+ end
231
+ mod.send(:define_method, :private_description_hash) do
232
+ return @registered_descriptions_hash
233
+ end
234
+ # Creates an accessor for the factory class
235
+ mod.send(:define_method, :private_auto_register) do
236
+ @auto_register_subclasses
237
+ end
238
+ self.extend(mod)
239
+
240
+ # Creates the necessary arrays|hashes to handle the
241
+ # registered classes:
242
+ @registered_descriptions = []
243
+ @registered_descriptions_hash = {}
244
+
245
+ @auto_register_subclasses = auto
246
+ end
247
+
248
+ # Checks if the class has a factory
249
+ def has_factory?
250
+ return self.respond_to?(:factory)
251
+ end
252
+
253
+ # Returns the base description if there is one, or nil if
254
+ # there isn't
255
+ def base_description
256
+ if has_factory?
257
+ return factory.description
258
+ else
259
+ return nil
260
+ end
261
+ end
262
+
263
+ # Returns the description list of the factory. Raises an
264
+ # exception if there is no factory
265
+ def factory_description_list
266
+ raise "Must have a factory" unless has_factory?
267
+ return factory.private_description_list
268
+ end
269
+
270
+ # Returns the description hash of the factory. Raises an
271
+ # exception if there is no factory
272
+ def factory_description_hash
273
+ raise "Must have a factory" unless has_factory?
274
+ return factory.private_description_hash
275
+ end
276
+
277
+ # Returns the factory description with the given name
278
+ def factory_description(name)
279
+ raise "Must have a factory" unless has_factory?
280
+ return factory_description_hash.fetch(name)
281
+ end
282
+
283
+ # Returns the Class object associated with the given name in
284
+ # the factory
285
+ def factory_class(name)
286
+ return factory_description(name).object_class
287
+ end
288
+
289
+ # Registers the given description to the factory. If no
290
+ # description is given, the current class is registered.
291
+ def register_class(desc = nil)
292
+ raise "One of the superclasses should have a 'factory' statement" unless
293
+ has_factory?
294
+ desc = description if desc.nil?
295
+ factory_description_list << desc
296
+ factory_description_hash[desc.name] = desc
297
+ end
298
+
299
+ # Returns the Description of the class.
300
+ def description
301
+ return @description
302
+ end
303
+
304
+ # Sets the description of the class. It is probably way better
305
+ # to use #describe, or write your own class method in the base
306
+ # class in the case of a family of classes.
307
+ def set_description(desc)
308
+ @description = desc
309
+ if has_factory? and factory.private_auto_register
310
+ register_class
311
+ end
312
+ end
313
+
314
+
315
+ # Registers an new parameter, with the following properties:
316
+ # * _writer_ is the name of the method used to write that parameter;
317
+ # * _reader_ the name of the method that returns its current value;
318
+ # * _name_ is a short code-like name of the parameter (typically
319
+ # lowercase);
320
+ # * _long_name_ is a more descriptive name, properly capitalized and
321
+ # localized if possible;
322
+ # * _type_ is it's type. Please see the MetaBuilder::ParameterType
323
+ # for a better description of what is a type;
324
+ # * _desc_ is a proper (short) description of the parameter,
325
+ # something that would fit on a What's this box, for instance.
326
+ # * _attrs_ are optional parameters that may come useful, see
327
+ # Parameter#attributes documentation.
328
+ #
329
+ # You might want to use the #param_reader, #param_writer, and
330
+ # #param_accessor facilities that create the respective
331
+ # accessors in addition. A typical example would be:
332
+ #
333
+ # param :set_size, :size, 'size', "Size", {:type => :integer},
334
+ # "The size !!"
335
+ def param(writer, reader, name, long_name, type,
336
+ desc = "")
337
+ raise "Use describe first" if description.nil?
338
+ param = nil
339
+ param = Parameter.new(name, writer, reader,
340
+ long_name, type, desc)
341
+ description.add_param(param)
342
+ return param
343
+ end
344
+
345
+ # The same as #param, but creates a attr_reader in addition
346
+ def param_reader(writer, reader, name, long_name, type,
347
+ desc = "")
348
+ attr_reader reader
349
+ return param(writer, reader, name, long_name, type, desc)
350
+ end
351
+
352
+ # The same as #param, except that _writer_ is made from
353
+ # _symbol_ by appending a = at the end. An attr_writer is
354
+ # created for the _symbol_.
355
+ def param_writer(symbol, name, long_name, type,
356
+ desc = "")
357
+ writer = (symbol.to_s + '=').to_sym
358
+ attr_writer symbol
359
+ return param(writer, symbol, name, long_name, type, desc)
360
+ end
361
+
362
+ # The same as #param_writer, except that an attr_writer is
363
+ # created for the _symbol_ instead of only a attr_writer. The
364
+ # most useful of the four methods. Typical use:
365
+ #
366
+ # param_accessor :name, 'name', "Object name", {:type => :string},
367
+ # "The name of the object"
368
+ def param_accessor(symbol, name, long_name, type,
369
+ desc = "")
370
+ writer = (symbol.to_s + '=').to_sym
371
+ attr_accessor symbol
372
+ return param(writer, symbol, name, long_name, type, desc)
373
+ end
374
+
375
+ # Creates a description attached to the current class. It
376
+ # needs to be used before anything else.
377
+ def describe(name, longname = name, desc = "")
378
+ d = Description.new(self, name, longname, desc)
379
+ set_description(d)
380
+ end
381
+
382
+
383
+ # Imports the given parameters directly from the parent class.
384
+ # This function is quite naive and will not look further than
385
+ # the direct #superclass.
386
+ def inherit_parameters(*names)
387
+ if self.superclass.respond_to?(:description)
388
+ parents_params = self.superclass.description.param_hash
389
+ for n in names
390
+ if parents_params.key?(n)
391
+ description.add_param(parents_params[n])
392
+ else
393
+ warn "Param #{n} not found"
394
+ end
395
+ end
396
+ else
397
+ warn "The parent class has no description"
398
+ end
399
+ end
400
+
401
+ end
402
+
403
+ end
404
+ end
405
+ end
@@ -0,0 +1,73 @@
1
+ # factory.rb : a class holdling a set of Backends
2
+ # Copyright (C) 2009 Vincent Fourmond
3
+
4
+ # This program is free software; you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation; either version 2 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program; if not, write to the Free Software
16
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
+
18
+ require 'ctioga2/utils'
19
+ require 'ctioga2/data/backends/backend'
20
+
21
+ module CTioga2
22
+
23
+ Version::register_svn_info('$Revision: 2 $', '$Date: 2009-04-25 14:03:30 +0200 (Sat, 25 Apr 2009) $')
24
+
25
+ module Data
26
+
27
+ module Backends
28
+
29
+ # This class holds an instance of all the different Backend
30
+ # available, and features a 'current backend'.
31
+ class BackendFactory
32
+
33
+ # A hash name (as in Description#name) -> Backend
34
+ attr_accessor :backends
35
+
36
+ # The current Backend
37
+ attr_accessor :current
38
+
39
+ # Creates a new BackendFactory
40
+ def initialize(default)
41
+ @backends = {}
42
+ @backend_descriptions = Backend.list_backends
43
+ for backend in @backend_descriptions.keys
44
+ reset_backend(backend)
45
+ # Add commands
46
+ @backend_descriptions[backend].create_backend_commands
47
+ end
48
+ @current = @backends[default]
49
+ end
50
+
51
+ # Resets the given backend to its default values.
52
+ def reset_backend(backend)
53
+ @backends[backend] = @backend_descriptions[backend].instantiate
54
+ end
55
+
56
+ # Selects the current backend
57
+ def set_current_backend(backend)
58
+ @current = @backends[backend]
59
+ end
60
+
61
+
62
+ # Sets the (raw) value of the parameter of the given backend
63
+ def set_backend_parameter_value(backend, param, value)
64
+ b = @backends[backend]
65
+ # This is way too complicated !
66
+ b.description.param_hash[param].set_value(b, value)
67
+ end
68
+
69
+ end
70
+
71
+ end
72
+ end
73
+ end