ctioga 1.11.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. data/COPYING +340 -0
  2. data/ctioga/bin/ctable +28 -0
  3. data/ctioga/bin/ctioga +37 -0
  4. data/ctioga/doc/ctable.1 +156 -0
  5. data/ctioga/doc/ctioga.1 +2363 -0
  6. data/ctioga/examples/README +46 -0
  7. data/ctioga/examples/ctioga.gnuplot +4 -0
  8. data/ctioga/examples/ctioga_within_tioga.rb +53 -0
  9. data/ctioga/examples/ctiogarc.rb +24 -0
  10. data/ctioga/examples/include_1.rb +15 -0
  11. data/ctioga/examples/noise.dat +100 -0
  12. data/ctioga/examples/noise.rb +13 -0
  13. data/ctioga/examples/trig.csv +100 -0
  14. data/ctioga/examples/trig.dat +100 -0
  15. data/ctioga/examples/trig.rb +14 -0
  16. data/ctioga/examples/trigh.dat +100 -0
  17. data/ctioga/examples/trigh.rb +10 -0
  18. data/ctioga/examples/tutorial +763 -0
  19. data/ctioga/examples/tutorial.sh +269 -0
  20. data/ctioga/tests/README +14 -0
  21. data/ctioga/tests/axes.sh +40 -0
  22. data/ctioga/tests/basic.sh +11 -0
  23. data/ctioga/tests/draw.sh +24 -0
  24. data/ctioga/tests/histograms.sh +14 -0
  25. data/ctioga/tests/insets.sh +41 -0
  26. data/ctioga/tests/layouts.sh +29 -0
  27. data/ctioga/tests/legends.sh +113 -0
  28. data/ctioga/tests/styles.sh +43 -0
  29. data/ctioga/tests/test_style.sh +8 -0
  30. data/ctioga/tests/tests.sh +24 -0
  31. data/ctioga/tests/text_backend.sh +83 -0
  32. data/ctioga/tests/tioga_defaults.rb +18 -0
  33. data/lib/CTioga/axes.rb +904 -0
  34. data/lib/CTioga/backends.rb +88 -0
  35. data/lib/CTioga/boundaries.rb +224 -0
  36. data/lib/CTioga/ctable.rb +134 -0
  37. data/lib/CTioga/curve_style.rb +246 -0
  38. data/lib/CTioga/debug.rb +199 -0
  39. data/lib/CTioga/dimension.rb +133 -0
  40. data/lib/CTioga/elements.rb +17 -0
  41. data/lib/CTioga/elements/base.rb +84 -0
  42. data/lib/CTioga/elements/containers.rb +578 -0
  43. data/lib/CTioga/elements/curves.rb +368 -0
  44. data/lib/CTioga/elements/tioga_primitives.rb +440 -0
  45. data/lib/CTioga/layout.rb +595 -0
  46. data/lib/CTioga/legends.rb +29 -0
  47. data/lib/CTioga/legends/cmdline.rb +187 -0
  48. data/lib/CTioga/legends/item.rb +164 -0
  49. data/lib/CTioga/legends/style.rb +257 -0
  50. data/lib/CTioga/log.rb +73 -0
  51. data/lib/CTioga/movingarrays.rb +131 -0
  52. data/lib/CTioga/partition.rb +271 -0
  53. data/lib/CTioga/plot_style.rb +230 -0
  54. data/lib/CTioga/plotmaker.rb +1677 -0
  55. data/lib/CTioga/shortcuts.rb +69 -0
  56. data/lib/CTioga/structures.rb +82 -0
  57. data/lib/CTioga/styles.rb +140 -0
  58. data/lib/CTioga/themes.rb +581 -0
  59. data/lib/CTioga/themes/classical.rb +82 -0
  60. data/lib/CTioga/themes/demo.rb +63 -0
  61. data/lib/CTioga/themes/fits.rb +91 -0
  62. data/lib/CTioga/themes/mono.rb +33 -0
  63. data/lib/CTioga/tioga.rb +32 -0
  64. data/lib/CTioga/utils.rb +173 -0
  65. data/lib/MetaBuilder/Parameters/dates.rb +38 -0
  66. data/lib/MetaBuilder/Parameters/lists.rb +132 -0
  67. data/lib/MetaBuilder/Parameters/numbers.rb +69 -0
  68. data/lib/MetaBuilder/Parameters/strings.rb +86 -0
  69. data/lib/MetaBuilder/Parameters/styles.rb +75 -0
  70. data/lib/MetaBuilder/Qt4/Parameters/dates.rb +51 -0
  71. data/lib/MetaBuilder/Qt4/Parameters/numbers.rb +65 -0
  72. data/lib/MetaBuilder/Qt4/Parameters/strings.rb +106 -0
  73. data/lib/MetaBuilder/Qt4/parameter.rb +172 -0
  74. data/lib/MetaBuilder/Qt4/parameters.rb +9 -0
  75. data/lib/MetaBuilder/descriptions.rb +603 -0
  76. data/lib/MetaBuilder/factory.rb +101 -0
  77. data/lib/MetaBuilder/group.rb +57 -0
  78. data/lib/MetaBuilder/metabuilder.rb +10 -0
  79. data/lib/MetaBuilder/parameter.rb +374 -0
  80. data/lib/MetaBuilder/parameters.rb +11 -0
  81. data/lib/MetaBuilder/qt4.rb +8 -0
  82. data/lib/SciYAG/Backends/backend.rb +379 -0
  83. data/lib/SciYAG/Backends/binner.rb +168 -0
  84. data/lib/SciYAG/Backends/cache.rb +102 -0
  85. data/lib/SciYAG/Backends/dataset.rb +158 -0
  86. data/lib/SciYAG/Backends/descriptions.rb +469 -0
  87. data/lib/SciYAG/Backends/filters.rb +25 -0
  88. data/lib/SciYAG/Backends/filters/average.rb +134 -0
  89. data/lib/SciYAG/Backends/filters/cumulate.rb +37 -0
  90. data/lib/SciYAG/Backends/filters/filter.rb +70 -0
  91. data/lib/SciYAG/Backends/filters/norm.rb +39 -0
  92. data/lib/SciYAG/Backends/filters/smooth.rb +63 -0
  93. data/lib/SciYAG/Backends/filters/sort.rb +43 -0
  94. data/lib/SciYAG/Backends/filters/strip.rb +34 -0
  95. data/lib/SciYAG/Backends/filters/trim.rb +64 -0
  96. data/lib/SciYAG/Backends/gnuplot.rb +131 -0
  97. data/lib/SciYAG/Backends/math.rb +108 -0
  98. data/lib/SciYAG/Backends/mdb.rb +462 -0
  99. data/lib/SciYAG/Backends/multitext.rb +96 -0
  100. data/lib/SciYAG/Backends/source.rb +64 -0
  101. data/lib/SciYAG/Backends/text.rb +339 -0
  102. data/lib/SciYAG/backends.rb +16 -0
  103. metadata +191 -0
@@ -0,0 +1,101 @@
1
+ # factory.rb : few classes to handle factories
2
+ # Copyright (C) 2006 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
+ # The MetaBuilder module contains the classes necessary to create classes
19
+ # with a simple meta-information system that lets you save/export the
20
+ # state of an object (under certain assumptions), query parameters in
21
+ # different ways (command-line, Qt widgets, and others if necessary).
22
+ module MetaBuilder
23
+
24
+ # The Factories module contains several classes useful for dealing
25
+ # with Description factories:
26
+ #
27
+ # * UniqueFactory: only one instance of each class described, and
28
+ # the user can choose which one is the current.
29
+ module Factories
30
+
31
+ # A factory for which there is only one instance of each
32
+ # class described, and only one selected instance at any moment.
33
+ # User can switch freely from one instance to another.
34
+ class UniqueFactory
35
+
36
+ attr_reader :current, :current_name
37
+
38
+ # Creates a UniqueFactory using the factory in _base_class_.
39
+ # The selected description is named by _default_, or is
40
+ # the first one in the list in case _default_ is missing.
41
+ def initialize(base_class, default = nil)
42
+ @base_class = base_class
43
+ @instances = {}
44
+ for name, desc in @base_class.factory_description_hash
45
+ @instances[name] = desc.instantiate
46
+ end
47
+ if default.nil?
48
+ default = @base_class.factory_description_list.first.name
49
+ end
50
+ self.current=default
51
+ end
52
+
53
+ # Sets the current class to the named class.
54
+ def current=(str)
55
+ if @instances.has_key?(str)
56
+ @current_name = str
57
+ @current = @instances[str]
58
+ else
59
+ raise "Incorrect name given: #{str}"
60
+ end
61
+ end
62
+
63
+ def instance_list
64
+ return @instances.values
65
+ end
66
+
67
+ def instances
68
+ return @instances
69
+ end
70
+
71
+ # Returns the instance of the named class _name_, and sets
72
+ # the current class as a side effect.
73
+ def instance(name)
74
+ self.current = name
75
+ return @current
76
+ end
77
+
78
+ # Fills the Optionparser _parser_ with all the options necessary to
79
+ # select a class among others and set options to it. Note that
80
+ # options don't need to apply to the current class; they are set
81
+ # but the factory doesn't change the current class in this case.
82
+ #
83
+ # The options will be preceded by _banner_. If _uniquify_ is true, the
84
+ # names of the options will be made as unique as possible.
85
+ def option_parser_factory(parser, banner = "", uniquify = true)
86
+ parser.separator banner
87
+ # A for loop won't work here as name would be overwritten
88
+ # for every iteration.
89
+ @instances.each do |name, instance|
90
+ name
91
+ parser.on("--#{name}", instance.description.banner(instance)) do
92
+ self.current = name
93
+ end
94
+ instance.option_parser_options(parser, uniquify)
95
+ parser.separator ""
96
+ end
97
+ end
98
+ end
99
+ end
100
+
101
+ end
@@ -0,0 +1,57 @@
1
+ # group.rb : A class to describe a group of parameters
2
+ # Copyright (C) 2006 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
+ # The MetaBuilder module contains the classes necessary to create classes
19
+ # with a simple meta-information system that lets you save/export the
20
+ # state of an object (under certain assumptions), query paramters in
21
+ # different ways (command-line, Qt widgets, and others if necessary).
22
+ module MetaBuilder
23
+
24
+ # The ParameterGroup class provides an easy way to group parameters
25
+ # of a described class. The group should have a #name, a #long_name,
26
+ # more descriptive and a description.
27
+
28
+ class ParameterGroup
29
+ # The short name of the group
30
+ attr_accessor :name
31
+
32
+ # The long name of the group
33
+ attr_accessor :long_name
34
+
35
+ # The (text) description of the group
36
+ attr_accessor :description
37
+
38
+ # The list of parameters in that group, in the order they were
39
+ # declared.
40
+
41
+ attr_accessor :parameter_list
42
+
43
+ def initialize(name, long_name = name,
44
+ description = nil)
45
+ @name = name
46
+ @description = description
47
+ @long_name = long_name
48
+ @parameter_list = []
49
+ end
50
+
51
+ def add_parameter(param)
52
+ @parameter_list << param
53
+ end
54
+
55
+ end
56
+
57
+ end
@@ -0,0 +1,10 @@
1
+ # metabuilder.rb: The one include file for MetaBuilder. Doesn't include Qt
2
+ # stuff or other specific ones.
3
+
4
+ # This file is copyright 2006 by Vincent Fourmond, but you can do whatever
5
+ # you want with it.
6
+
7
+ require 'MetaBuilder/descriptions'
8
+ require 'MetaBuilder/group'
9
+ require 'MetaBuilder/parameters'
10
+
@@ -0,0 +1,374 @@
1
+ # parameter.rb : A class to describe a parameter
2
+ # Copyright (C) 2006 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 'forwardable'
19
+
20
+ # The MetaBuilder module contains the classes necessary to create classes
21
+ # with a simple meta-information system that lets you save/export the
22
+ # state of an object (under certain assumptions), query parameters in
23
+ # different ways (command-line, Qt, Tk and Gtk widgets, and so on...).
24
+ module MetaBuilder
25
+
26
+ # A class that handles a parameter type. It has to be subclassed to
27
+ # actually provide a parameter. The subclasses must provide the
28
+ # following:
29
+ #
30
+ # * a #string_to_type function to convert from string to the type;
31
+ # * a #type_to_string to convert back from type to string
32
+ # * an instance #type_name that returns a really small description
33
+ # of the type, to be used for instance to name command-line parameters.
34
+ # * a #type_name statement that registers the current class to the
35
+ # ParameterType system.
36
+ #
37
+ # Moerover, it is a good idea to reimplement the
38
+ # #qt4_create_input_widget method; the default implementation works,
39
+ # but you probably wish it would look better.
40
+ #
41
+ # Types are implemented using hashes: this way, additionnal
42
+ # parameters can easily be added. The hash *must* have a :type key
43
+ # that will be interpreted by the children of ParameterType. Examples:
44
+ #
45
+ # { :type => :integer}
46
+ # { :type => :file, :filter => "Text Files (*.txt)}
47
+ #
48
+ # And so on. You definitely should document your type and it's
49
+ # attributes properly, if you ever want that someone uses it.
50
+ #
51
+ # The list of currently recognised types is here:
52
+ #
53
+ # <tt>:integer</tt> :: ParameterTypes::IntegerParameter
54
+ # <tt>:float</tt> :: ParameterTypes::FloatParameter
55
+ # <tt>:string</tt> :: ParameterTypes::StringParameter
56
+ # <tt>:file</tt> :: ParameterTypes::FileParameter
57
+ # <tt>:boolean</tt> :: ParameterTypes::BooleanParameter
58
+ # <tt>:list</tt> :: ParameterTypes::ListParameter
59
+ #
60
+ # Additionally to the parameters the given type is requiring, you can
61
+ # pass some other kind of information using this hash, such as option
62
+ # parser short argument, aliases, and so on. This has nothing to do
63
+ # with type conversion, but it is the best place where to put this kind
64
+ # of things, in my humble opinion. The currently recognized such additional
65
+ # parameters are:
66
+ # * :option_parser_short: a short option name for option_parser.
67
+ # * :namespace: a ruby module that will be searched by #string_to_type
68
+ # for a constant. If one of the given name is found, its value is
69
+ # returned.
70
+ # * :shortctus: a hash specifiying strings shortcuts for given values.
71
+ class ParameterType
72
+
73
+ # A hash that makes the :type value of the _type_ argument correspond
74
+ # to a ParameterType child
75
+ @@parameter_types = { }
76
+
77
+ # A default constructor. It should be safe to use it directly for
78
+ # children, unless something more specific is needed. Any descendent
79
+ # should *always* register _type_ as @type - or, even better, call
80
+ # super.
81
+ def initialize(type)
82
+ if type.is_a?(Symbol)
83
+ type = {:type => type}
84
+ end
85
+ @type = type
86
+ end
87
+
88
+ # This class function actually registers the current type
89
+ # to the ParameterType ancestor. _name_ should be a symbol.
90
+ # Moreover, if the second argument is provided, it automatically
91
+ # creates a #type_name instance method returning this value.
92
+ def self.type_name(name, public_name = nil, default_value = nil)
93
+ if @@parameter_types.has_key?(name)
94
+ warn "Redefining type #{name} " +
95
+ "from #{@@parameter_types[name]} to #{self}"
96
+ end
97
+ @@parameter_types[name] = self
98
+ self.send(:define_method,:type_name) do
99
+ public_name
100
+ end
101
+ self.send(:define_method,:default_value) do
102
+ default_value
103
+ end
104
+ end
105
+
106
+ # This function converts a 'description' of the type wanted
107
+ # into a ParameterType child. Used by the Parameter system.
108
+ # As a special treat, a lone symbol is converted into
109
+ # {:type => :symbol}
110
+ def self.get_param_type(type)
111
+ if type.is_a?(Symbol)
112
+ type = {:type => type}
113
+ end
114
+ raise "The type argument must be a Hash" unless type.is_a?(Hash)
115
+ begin
116
+ return @@parameter_types.fetch(type[:type])
117
+ rescue
118
+ raise "Type #{type[:type]} unknown to the parameter system"
119
+ end
120
+ end
121
+
122
+ # Shortcut to convert directly a string to the given type specification.
123
+ # Handy shortcut.
124
+ def self.from_string(type, string)
125
+ return get_type(type).string_to_type(string)
126
+ end
127
+
128
+ # Returns a ParameterType child instance suitable for conversion
129
+ # of the given type specification
130
+ def self.get_type(type)
131
+ return get_param_type(type).new(type)
132
+ end
133
+
134
+
135
+ # Runs the string_to_type conversion hook
136
+ def stt_run_hook(val)
137
+ if @type.key?(:stt_hook)
138
+ return @type[:stt_hook].call(val)
139
+ else
140
+ val
141
+ end
142
+ end
143
+
144
+ # This function converts the given string to the appropriate type. It is a
145
+ # wrapper around the #string_to_type_internal function
146
+ # that can take advantage of a few general features. It is recommanded
147
+ # to define a #string_to_type_internal function rather to redefine
148
+ # #string_to_type
149
+ def string_to_type(string)
150
+ # First, shortcuts:
151
+ if @type.key?(:shortcuts) and @type[:shortcuts].key? string
152
+ return stt_run_hook(@type[:shortcuts][string])
153
+ end
154
+ # Then, constants lookup.
155
+ if @type.key?(:namespace)
156
+ begin
157
+ return stt_run_hook(lookup_const(string))
158
+ rescue Exception
159
+ end
160
+ end
161
+ return stt_run_hook(string_to_type_internal(string))
162
+ end
163
+
164
+ # This function does the exact opposite of the #string_to_type one.
165
+ # It defaults to using the to_s methods of the parameter. Be careful:
166
+ # it is absolutely important that for any valid type,
167
+ #
168
+ # string_to_type(type_to_string(type)) == type
169
+ def type_to_string(type)
170
+ return type_to_string_internal(type)
171
+ end
172
+
173
+ # The internal function for converting type to a string. Used by
174
+ # #type_to_string, children should only reimplement this function
175
+ # and leave #type_to_string
176
+ def type_to_string_internal(type)
177
+ return type.to_s
178
+ end
179
+
180
+ # Returns a default value for the given type. This is reimplemented
181
+ # systematically from children, with the ParameterType::type_name
182
+ # statement.
183
+ def default_value
184
+ end
185
+
186
+ # Looks for the value as a constant specified in the :namespace
187
+ # modules. Raises IncorrectInput if not found.
188
+ def lookup_const(str)
189
+ for mod in [@type[:namespace]].flatten
190
+ begin
191
+ return mod.const_get(str)
192
+ rescue
193
+ # Nothing, we still look up
194
+ end
195
+ end
196
+ raise IncorrectInput, "Constant #{str} not found"
197
+ end
198
+
199
+ # Returns a type name suitable for displaying, for instance, in
200
+ # an option parser, or inside a dialog box, and so on. Has to
201
+ # be one word (not to confuse the option parser, for instance);
202
+ # it is better if it is lowercase.
203
+ def type_name
204
+ return 'notype'
205
+ end
206
+
207
+ # Creates on option for the OptionParser _parser_. The _args_
208
+ # will be fed directly to OptionParser#on. The _block_ is called with
209
+ # the value in the target type.
210
+ def option_parser_raw(parser, *args, &block)
211
+ b = block # For safe-keeping.
212
+ c = proc do |str|
213
+ b.call(string_to_type(str))
214
+ end
215
+ parser.on(*args, &c)
216
+ end
217
+
218
+ # Creates an option for the OptionParser _parser_. The block is fed
219
+ # with the converted value. The default implementation should be
220
+ # fine for most classes, but this still leaves the room for
221
+ # reimplementation if necessary. The parameters are:
222
+ #
223
+ # * _parser_: the OptionParser;
224
+ # * _name_: the name of the option;
225
+ # * _desc_: it description,
226
+ # * _block_: the block used to set the data.
227
+ def option_parser_option(parser, name, desc, &block)
228
+ args = [option_parser_long_option(name), desc]
229
+ if @type.has_key?(:option_parser_short)
230
+ args.unshift(@type[:option_parser_short])
231
+ end
232
+ option_parser_raw(parser, *args, &block)
233
+ end
234
+
235
+ # Returns a value to be fed to OptionParser#on as a 'long' option.
236
+ # It is separated from the rest to allow easy redefinition
237
+ # (in special cases). _name_ is the name of the option.
238
+ def option_parser_long_option(name)
239
+ return "--#{name} #{type_name.upcase}"
240
+ end
241
+
242
+ # An exception that must be raised when ParamterType#string_to_type
243
+ # is given incorrect input.
244
+ class IncorrectInput < Exception
245
+ end
246
+ end
247
+
248
+ # A parameter describes a way of storing some information into an
249
+ # instance of an object. No type checking is done on the target object
250
+ # when the actual reading/writing is done. However, the type checking
251
+ # is done upstream by the Description system.
252
+ #
253
+ # A Parameter consists of several things:
254
+ #
255
+ # * a #name, to identify it in a unique fashion;
256
+ # * a #type, used to convert to and from String and for user
257
+ # interaction in general;
258
+ # * some explanative text, used to inform the user: #long_name and
259
+ # #description
260
+ # * two symbols that are used to gain read and write access of the
261
+ # parameter on the target object.
262
+ #
263
+ # The Parameter class can be used to maintain a set of
264
+ # meta-informations about types in a given object.
265
+ class Parameter
266
+
267
+ # To forward string_to_type and type_to_string to the @param_type
268
+ extend Forwardable
269
+
270
+ # The short name of the parameter
271
+ attr_accessor :name
272
+
273
+ # The long name of the parameter, to be translated
274
+ attr_accessor :long_name
275
+
276
+ # The function names that should be used to set the symbol and
277
+ # retrieve it's current value. The corresponding functions should
278
+ # read or return a string, and writer(reader) should be a noop.
279
+ attr_accessor :reader_symbol, :writer_symbol
280
+
281
+ # The (text) description of the parameter
282
+ attr_accessor :description
283
+
284
+ # The way the type was specified to the system
285
+ attr_accessor :type_spec
286
+
287
+ # The actual ParameterType subclass instance in charge of handling
288
+ # the conversion from string.
289
+ attr_accessor :param_type
290
+
291
+
292
+ # (Vincent Fourmond 5/12/2006): this will be moved to ParameterType, as
293
+ # I think it has nothing to do here.
294
+
295
+ # The attributes hash is meant to hold various convenient
296
+ # information which are not directly linked to type conversion,
297
+ # such as an alternative for labels, shortcuts for command-line options
298
+ # and the like. Not compulsory. The currently understood values are:
299
+ # * :option_parser_short: a short option for option_parser.
300
+
301
+ # attr_accessor :attributes
302
+
303
+ # Creates a new Parameter with the given symbols. Remember that
304
+ # if you don't intend to use #get, #get_raw, #set and #set_raw,
305
+ # you don't need to pass meaningful values to _writer_symbol_ and
306
+ # _reader_symbol_.
307
+ def initialize(name, writer_symbol,
308
+ reader_symbol,
309
+ long_name,
310
+ type,
311
+ description, attributes = {})
312
+ @name = name
313
+ @writer_symbol = writer_symbol
314
+ @reader_symbol = reader_symbol
315
+ @description = description
316
+ @long_name = long_name
317
+ @type_spec = type
318
+ type_class = ParameterType.get_param_type(@type_spec)
319
+ raise "Parameter type not recognized: #{@type_spec}" unless type_class
320
+
321
+ @param_type = type_class.new(@type_spec)
322
+ @attributes = attributes
323
+ end
324
+
325
+
326
+ # Two methods forwarded to the ParameterType object.
327
+ def_delegators :@param_type, :string_to_type, :type_to_string
328
+
329
+
330
+ # Sets directly the target parameter, without type conversion
331
+ def set_raw(target, val)
332
+ target.send(@writer_symbol, val)
333
+ end
334
+
335
+ # Uses the #writer_symbol of the _target_ to set the value of the
336
+ # parameter to the one converted from the String _str_
337
+ def set(target, str)
338
+ set_raw(target, string_to_type(str))
339
+ end
340
+
341
+
342
+ # Aquires the value from the backend, and returns it in the
343
+ # form of a string
344
+ def get(target)
345
+ return type_to_string(get_raw(target))
346
+ end
347
+
348
+ # Aquires the value from the backend, and returns it.
349
+ def get_raw(target)
350
+ target.send(@reader_symbol)
351
+ end
352
+
353
+ # Creates an option in the OptionParser _parser_, with the name
354
+ # _name_, that will change the settings of the object _instance_
355
+ def option_parser_option(parser, name, instance)
356
+ obj = instance # copy needed to avoid problems with
357
+ # overwritten local variables
358
+ block = proc do |value|
359
+ set_raw(obj, value)
360
+ end
361
+
362
+ # The use of #attributes is already deprecated. Don't use !!!
363
+ # if attributes.has_key?(:option_parser_short)
364
+ # @param_type.option_parser_raw(parser, attributes[:option_parser_short],
365
+ # @param_type.option_parser_long_option(name),
366
+ # description, &block)
367
+ # else
368
+ @param_type.option_parser_option(parser, name, description, &block)
369
+ # end
370
+ end
371
+
372
+ end
373
+
374
+ end