machine_setup 0.1.0 → 0.2.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.
@@ -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')