machine_setup 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -10,230 +10,333 @@ module SetupConfiguration
10
10
  Range.new(description_ranges().first().first(), description_ranges().last().last())
11
11
  end
12
12
 
13
- end
14
13
 
15
- class SetupConfiguration::Suite
16
- include Singleton
14
+ class Suite
15
+ include Singleton
17
16
 
18
- attr_accessor :categories
19
- attr_accessor :settings
20
- attr_accessor :name
21
- attr_accessor :abbreviation
17
+ attr_accessor :categories
18
+ attr_accessor :settings
19
+ attr_accessor :name
20
+ attr_accessor :abbreviation
21
+ attr_accessor :next_category_number
22
22
 
23
- def initialize
24
- self.categories= Hash.new { |hash, key| hash[key] = [] }
25
- self.settings= SetupConfiguration::Setting.new()
26
- end
23
+ def initialize
24
+ self.categories= Hash.new { |hash, key| hash[key] = [] }
25
+ self.settings= Setting.new()
26
+ self.next_category_number = 0
27
+ end
27
28
 
28
- def category(category, &category_params)
29
- if category_params then
30
- # puts "executes category in Suite: #{category}"
29
+ def category(category, &category_params)
30
+ if category_params then
31
31
 
32
- #this code calls instance_eval and delivers the context object
33
- parameter_factory = SetupConfiguration::ParameterFactory.new()
34
- parameter_factory.instance_eval(&category_params)
35
- categories[category] << parameter_factory.params()
32
+ #this code calls instance_eval and delivers the context object
33
+ parameter_factory = ParameterFactory.new()
34
+ parameter_factory.instance_eval(&category_params)
35
+ cat = category_by_name(category)
36
+ categories[cat] << parameter_factory.params()
36
37
 
37
- # this .instance_eval call returns the last value of the last executed code (an array from method param in Parameters)
38
- #categories[category] << SetupConfiguration::Parameters.new().instance_eval(&category_params)
38
+ # this .instance_eval call returns the last value of the last executed code (an array from method param in Parameters)
39
+ #categories[category] << SetupConfiguration::Parameters.new().instance_eval(&category_params)
39
40
 
40
- # flatten is needed: Parameters#param returns an array which is inserted in an array...
41
- categories[category].flatten!
42
- else
43
- puts "WARNING: Empty category '#{category}' will be ignored. "
41
+ # flatten is needed: Parameters#param returns an array which is inserted in an array...
42
+ categories[cat].flatten!
43
+ else
44
+ puts "WARNING: Empty category '#{category}' will be ignored. "
45
+ end
44
46
  end
45
- end
46
47
 
47
- def setting(&setting_params)
48
- settings.instance_eval(&setting_params) if setting_params
49
- end
48
+ def category_by_name(name)
49
+ cat = self.categories.keys.select(){|c| c.name.eql?(name)}.first
50
+ unless cat then
51
+ cat = Category.new
52
+ cat.number = self.next_category_number!
53
+ cat.name = name
54
+ end
55
+ cat
56
+ end
50
57
 
51
- # Gets all known parameters.
52
- def parameters()
53
- # cache parameters so sorting is necessary only once - this saves a lot of time...
54
- @parameters ||= categories.values.flatten.sort
55
- end
58
+ def next_category_number!
59
+ number = next_category_number
60
+ self.next_category_number+=1
61
+ number
62
+ end
56
63
 
57
- #
58
- # Finds a Parameter with the given key.
59
- # If there is no such parameter the method returns nil.
60
- #
61
- def find_param(key)
62
- find_param_by_key(key)
63
- end
64
+ def setting(&setting_params)
65
+ settings.instance_eval(&setting_params) if setting_params
66
+ end
64
67
 
65
- #
66
- # Finds a Parameter with the given key.
67
- # If there is no such parameter the method returns nil.
68
- #
69
- def find_param_by_key(key)
70
- self.parameters().select(){|p| p.key.eql?(key)}.first
71
- end
68
+ # Gets all known parameters.
69
+ def parameters()
70
+ # cache parameters so sorting is necessary only once - this saves a lot of time...
71
+ @parameters ||= categories.values.flatten.sort
72
+ end
72
73
 
73
- #
74
- # Finds a Parameter with the given number.
75
- # If there is no such parameter the method returns nil.
76
- #
77
- def find_param_by_number(number)
78
- self.parameters().select(){|p| p.number.eql?(number)}.first
79
- end
74
+ #
75
+ # Finds a Parameter with the given key.
76
+ # If there is no such parameter the method returns nil.
77
+ #
78
+ def find_param(key)
79
+ find_param_by_key(key)
80
+ end
80
81
 
81
- #
82
- # Validates the uniqueness of parameter keys and numbers.
83
- #
84
- def validate_params()
82
+ #
83
+ # Finds a Parameter with the given key.
84
+ # If there is no such parameter the method returns nil.
85
+ #
86
+ def find_param_by_key(key)
87
+ self.parameters().select(){|p| p.key.eql?(key)}.first
88
+ end
85
89
 
86
- categories.each() do |key, value|
87
- throw RuntimeError.new("ERROR: category '#{key}' contains more than 150 parameters. Reduce parameter count.") if value.size >150
90
+ #
91
+ # Finds a Parameter with the given number.
92
+ # If there is no such parameter the method returns nil.
93
+ #
94
+ def find_param_by_number(number)
95
+ self.parameters().select(){|p| p.number.eql?(number)}.first
88
96
  end
89
-
90
- keys=[]
91
- numbers=[]
92
- # slicer contains parameter with number 0... therefore valid parameter numbers starts at 0
93
- valid_param_numbers=SetupConfiguration.parameter_range()
94
97
 
95
- self.parameters().each() do |p|
98
+ #
99
+ # Validates the uniqueness of parameter keys and numbers.
100
+ #
101
+ def validate_params()
96
102
 
97
- puts "WARNING: parameter number 404 is reserved for machine type. you are using it for '#{p.key}'." if p.number.eql?(404)
98
- throw RuntimeError.new("ERROR: parameter number '#{p.number}' not supported. Number must be in range #{valid_param_numbers}.") unless valid_param_numbers.member?(p.number)
103
+ categories.each() do |key, value|
104
+ throw RuntimeError.new("ERROR: category '#{key}' contains more than 150 parameters. Reduce parameter count.") if value.size >150
105
+ end
106
+
107
+ keys=[]
108
+ numbers=[]
109
+ # slicer contains parameter with number 0... therefore valid parameter numbers starts at 0
110
+ valid_param_numbers=SetupConfiguration.parameter_range()
111
+
112
+ self.parameters().each() do |p|
113
+
114
+ puts "WARNING: parameter number 404 is reserved for machine type. you are using it for '#{p.key}'." if p.number.eql?(404)
115
+ throw RuntimeError.new("ERROR: parameter number '#{p.number}' not supported. Number must be in range #{valid_param_numbers}.") unless valid_param_numbers.member?(p.number)
116
+
117
+ if p.param?
118
+ if keys.include? p.key
119
+ raise RuntimeError.new("ERROR: parameter key '#{p.key}' defined more than once")
120
+ else
121
+ keys << p.key
122
+ end
123
+
124
+
125
+ if numbers.include? p.number
126
+ raise RuntimeError.new("ERROR: parameter number '#{p.number}' defined more than once")
127
+ else
128
+ numbers << p.number
129
+ end
130
+ else
131
+ assign_param_ref(p)
132
+ end#p.param?
99
133
 
100
- if keys.include? p.key
101
- throw RuntimeError.new("ERROR: parameter key '#{p.key}' defined more than once")
102
- else
103
- keys << p.key
104
134
  end
135
+ #force fresh sort of parameters
136
+ @parameters = nil
137
+ end#validate_params
105
138
 
106
-
107
- if numbers.include? p.number
108
- throw RuntimeError.new("ERROR: parameter number '#{p.number}' defined more than once")
109
- else
110
- numbers << p.number
139
+ def assign_param_ref(ref)
140
+ param = self.parameters().select(){|p| p.key.eql?(ref.key) && p.param?}.first
141
+
142
+ if param
143
+ ref.assign(param)
144
+ else
145
+ raise RuntimeError.new("ERROR: reference to unknown parameter with key '#{ref.key}'")
146
+ end
147
+ end#assign_param_ref
148
+
149
+ end
150
+
151
+
152
+ class Setting
153
+
154
+ attr_reader :minimum
155
+ attr_reader :maximum
156
+ attr_reader :balance_minimum
157
+ attr_reader :balance_maximum
158
+
159
+ def initialize
160
+ @minimum=0..0
161
+ @maximum=0..0
162
+ @balance_minimum=0..0
163
+ @balance_maximum=0..0
164
+ @machine_types=[]
165
+ end
166
+
167
+ def min(range)
168
+ @minimum=range
169
+ end
170
+
171
+ def max(range)
172
+ @maximum=range
173
+ end
174
+
175
+ def balance_min(range)
176
+ @balance_minimum=range
177
+ end
178
+
179
+ def balance_max(range)
180
+ @balance_maximum=range
181
+ end
182
+
183
+ def machine_type(name, number, range)
184
+ machine_type = MachineType.new(name, number, range)
185
+ @machine_types << machine_type
186
+ # generates a method with given machine type name in a module
187
+ # this module is included in Parameter class so machine type dependencies can be
188
+ # given with machine type names (in DSL) instead of binary numbers
189
+ ParameterMachineTypeBridge.send(:define_method, name) do
190
+ machine_type.binary_number
111
191
  end
112
192
  end
193
+
194
+ def machine_types
195
+ @machine_types.sort {|a, b| a.sequence_number <=> b.sequence_number}
196
+ end
197
+
113
198
  end
114
199
 
115
- end
200
+ class Category
201
+ include Enumerable
116
202
 
203
+ attr_accessor :number
204
+ attr_accessor :name
205
+ attr_accessor :parameter
117
206
 
118
- class SetupConfiguration::Setting
207
+ def initialize()
208
+ @parameter = []
209
+ end
119
210
 
120
- attr_reader :minimum
121
- attr_reader :maximum
122
- attr_reader :balance_minimum
123
- attr_reader :balance_maximum
211
+ def <=>(parameter)
212
+ self.number <=> parameter.number
213
+ end
124
214
 
125
- def initialize
126
- @minimum=0..0
127
- @maximum=0..0
128
- @balance_minimum=0..0
129
- @balance_maximum=0..0
130
- @machine_types=[]
131
215
  end
132
216
 
133
- def min(range)
134
- @minimum=range
135
- end
136
217
 
137
- def max(range)
138
- @maximum=range
139
- end
218
+ class ParameterFactory
140
219
 
141
- def balance_min(range)
142
- @balance_minimum=range
143
- end
220
+ attr_accessor :params
144
221
 
145
- def balance_max(range)
146
- @balance_maximum=range
147
- end
148
-
149
- def machine_type(name, number, range)
150
- machine_type = SetupConfiguration::MachineType.new(name, number, range)
151
- @machine_types << machine_type
152
- # generates a method with given machine type name in a module
153
- # this module is included in Parameter class so machine type dependencies can be
154
- # given with machine type names (in DSL) instead of binary numbers
155
- SetupConfiguration::ParameterMachineTypeBridge.send(:define_method, name) do
156
- machine_type.binary_number
222
+ def initialize
223
+ self.params= []
157
224
  end
158
- end
159
-
160
- def machine_types
161
- @machine_types.sort {|a, b| a.sequence_number <=> b.sequence_number}
162
- end
163
-
164
- end
165
225
 
166
- class SetupConfiguration::ParameterFactory
226
+ def param(parameter, number, &parameter_def)
227
+ # evaluate given block in Parameter context and return new parameter
228
+ p = Parameter.new(parameter, number)
229
+ p.instance_eval(&parameter_def) if parameter_def
230
+ params << p
231
+ end
167
232
 
168
- attr_accessor :params
233
+ def param_ref(parameter)
234
+ p = ParameterReference.new(parameter)
235
+ params << p
236
+ end
169
237
 
170
- def initialize
171
- self.params= []
172
238
  end
173
239
 
174
- def param(parameter, number, &parameter_def)
175
- # puts "executed param in Parameters: #{parameter}"
176
- # evaluate given block in Parameter context and return new parameter
177
- p = SetupConfiguration::Parameter.new(parameter, number)
178
- p.instance_eval(&parameter_def) if parameter_def
179
- params << p
180
- end
240
+ class Parameter
241
+ include Enumerable
242
+ include ParameterMachineTypeBridge
243
+
244
+ attr_accessor :key
245
+ attr_accessor :number
246
+ attr_reader :dependency
247
+ attr_reader :machine_type
248
+
249
+ def initialize(name, number)
250
+ # depends upon no other parameter
251
+ @dependency=:none
252
+ # valid on all machines
253
+ @machine_type=0
254
+ @key= name
255
+ @number=number
256
+ end
181
257
 
182
- end
258
+ def depends_on(dependency)
259
+ @dependency=dependency
260
+ end
183
261
 
184
- class SetupConfiguration::Parameter
185
- include Enumerable
186
- include SetupConfiguration::ParameterMachineTypeBridge
187
-
188
- attr_accessor :key
189
- attr_accessor :number
190
- attr_reader :dependency
191
- attr_reader :machine_type
192
-
193
- def initialize(name, number)
194
- # depends upon no other parameter
195
- @dependency=:none
196
- # valid on all machines
197
- @machine_type=0
198
- @key= name
199
- @number=number
200
- end
262
+ def for_machine_type(machine_type)
263
+ @machine_type=machine_type
264
+ end
201
265
 
202
- def depends_on(dependency)
203
- @dependency=dependency
204
- end
266
+ def <=>(parameter)
267
+ self.number <=> parameter.number
268
+ end
205
269
 
206
- def for_machine_type(machine_type)
207
- @machine_type=machine_type
208
- end
270
+ def param?
271
+ true
272
+ end
209
273
 
210
- def <=>(parameter)
211
- self.number <=> parameter.number
212
274
  end
213
-
214
- end
215
275
 
216
- class SetupConfiguration::MachineType
217
- include Enumerable
218
-
219
- attr_reader :name
220
- attr_reader :range
221
- attr_reader :sequence_number
222
- attr_reader :binary_number
223
-
224
- def initialize(name, sequence_number, range)
225
- @name=name
226
- @range=range
227
- @sequence_number=sequence_number
228
- if @sequence_number <= 0
229
- @binary_number=0
230
- else
231
- @binary_number=2**(@sequence_number-1)
276
+ class ParameterReference
277
+ include Enumerable
278
+
279
+ attr_reader :key
280
+
281
+ def initialize(key)
282
+ @key = key
283
+ @param=nil
232
284
  end
285
+
286
+ def assign(parameter)
287
+ @param = parameter
288
+ end
289
+
290
+ def assigned?
291
+ @param
292
+ end
293
+
294
+ def number
295
+ assigned? ? @param.number : 1
296
+ end
297
+
298
+ def machine_type
299
+ assigned? ? @param.machine_type : 0
300
+ end
301
+
302
+ def dependency
303
+ assigned? ? @param.dependency : :none
304
+ end
305
+
306
+ def <=>(parameter)
307
+ self.number <=> parameter.number
308
+ end
309
+
310
+ def param?
311
+ false
312
+ end
313
+
233
314
  end
234
315
 
235
- def <=>(machine_type)
236
- self.range.first <=> machine_type.range.first
316
+ class MachineType
317
+ include Enumerable
318
+
319
+ attr_reader :name
320
+ attr_reader :range
321
+ attr_reader :sequence_number
322
+ attr_reader :binary_number
323
+
324
+ def initialize(name, sequence_number, range)
325
+ @name=name
326
+ @range=range
327
+ @sequence_number=sequence_number
328
+ if @sequence_number <= 0
329
+ @binary_number=0
330
+ else
331
+ @binary_number=2**(@sequence_number-1)
332
+ end
333
+ end
334
+
335
+ def <=>(machine_type)
336
+ self.range.first <=> machine_type.range.first
337
+ end
338
+
237
339
  end
238
-
340
+
239
341
  end
342
+
@@ -17,7 +17,8 @@ module SetupConfiguration::Generator
17
17
  attr_accessor :output
18
18
 
19
19
  def categories
20
- suite.categories.keys()
20
+ #TODO maybe cache these values for better performance...?
21
+ suite.categories.keys().sort()
21
22
  end
22
23
 
23
24
  # Support templating of member data.
@@ -43,8 +44,8 @@ module SetupConfiguration::Generator
43
44
  end
44
45
 
45
46
 
46
- def cat_name(key)
47
- name, desc=@translator.translate(key, @lang)
47
+ def cat_name(cat)
48
+ name, desc=@translator.translate(cat.name, @lang)
48
49
  name
49
50
  end
50
51
 
@@ -78,9 +79,10 @@ module SetupConfiguration::Generator
78
79
 
79
80
  #
80
81
  # Zeilenumbr�che werden mit '��' dargestellt
82
+ # \302\247 - oktale Darstellung von �
81
83
  #
82
84
  def escape(message)
83
- message.gsub(/\n\s?/, '��')
85
+ message.gsub(/\n\s?/, '��' )
84
86
  end
85
87
 
86
88
  end
@@ -105,7 +107,7 @@ module SetupConfiguration::Generator
105
107
  end
106
108
  #TODO compute value for max_number_parameters_per_tab of value maximum_numbers_per_category
107
109
  max_number_parameters_per_tab=50
108
- [depends, machine_type, number].collect(){ |arr| (arr%(max_number_parameters_per_tab)).collect(){|a| prepare(a)}}
110
+ [depends, machine_type, number].collect(){ |arr| (arr.in_groups_of(max_number_parameters_per_tab, false)).collect(){|a| prepare(a)}}
109
111
  end
110
112
 
111
113
  :private
@@ -201,7 +203,8 @@ class SetupConfiguration::SetupCodeBinding < SetupConfiguration::Generator::Temp
201
203
  end
202
204
 
203
205
  def parameters
204
- suite.parameters
206
+ #TODO use set or something similar
207
+ suite.parameters.select(){|p| p.param? }
205
208
  end
206
209
 
207
210
  #
@@ -28,7 +28,7 @@ MENU10=Da&ta
28
28
  MENU11=Se&nd
29
29
  MENU12=&Receive
30
30
  MENU13=&Clean
31
- MENU14=Set &hide values to zero
31
+ MENU14=Set &hidden values to zero
32
32
  MENU15=&Interface
33
33
  MENU16=COM&1
34
34
  MENU17=COM&2
@@ -18,7 +18,7 @@ require 'singleton'
18
18
  require 'erubis'
19
19
  require 'fileutils'
20
20
  require 'i18n'
21
- require File.expand_path(File.dirname(__FILE__) + '/setup_configuration/array')
21
+ require File.expand_path(File.dirname(__FILE__) + '/setup_configuration/core_ext')
22
22
  require File.expand_path(File.dirname(__FILE__) + '/setup_configuration/parameter_machinetype_bridge')
23
23
  require File.expand_path(File.dirname(__FILE__) + '/setup_configuration/setup_config')
24
24
  require File.expand_path(File.dirname(__FILE__) + '/setup_configuration/suite_generator')