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.
- data/.document +5 -5
- data/MIT-LICENSE +20 -20
- data/README.rdoc +0 -2
- data/Rakefile +4 -3
- data/TODO +16 -2
- data/VERSION +1 -1
- data/bin/setup_config_gen +2 -2
- data/examples/ssm/ssm.setup.param +81 -0
- data/examples/ssm/ssm.setup.param.de.yml +153 -0
- data/examples/ssm/ssm.setup.param.en.yml +141 -0
- data/examples/underleaver/underleaver.setup.param +25 -0
- data/examples/underleaver/underleaver.setup.param.de.yml +156 -12
- data/examples/underleaver/underleaver.setup.param.en.yml +151 -9
- data/lib/setup_configuration/core_ext/array/grouping.rb +40 -0
- data/lib/setup_configuration/core_ext/array.rb +1 -0
- data/lib/setup_configuration/core_ext.rb +5 -0
- data/lib/setup_configuration/legacy/importer.rb +1 -1
- data/lib/setup_configuration/setup_config.rb +278 -175
- data/lib/setup_configuration/suite_generator.rb +9 -6
- data/lib/setup_configuration/templates/english.lng.erb +1 -1
- data/lib/setup_configuration.rb +1 -1
- metadata +36 -36
- data/.gitignore +0 -30
- data/lib/setup_configuration/array.rb +0 -15
@@ -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
|
16
|
-
|
14
|
+
class Suite
|
15
|
+
include Singleton
|
17
16
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
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
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
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
|
-
|
29
|
-
|
30
|
-
# puts "executes category in Suite: #{category}"
|
29
|
+
def category(category, &category_params)
|
30
|
+
if category_params then
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
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
|
-
|
38
|
-
|
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
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
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
|
-
|
48
|
-
|
49
|
-
|
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
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
58
|
+
def next_category_number!
|
59
|
+
number = next_category_number
|
60
|
+
self.next_category_number+=1
|
61
|
+
number
|
62
|
+
end
|
56
63
|
|
57
|
-
|
58
|
-
|
59
|
-
|
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
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
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
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
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
|
-
|
83
|
-
|
84
|
-
|
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
|
-
|
87
|
-
|
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
|
-
|
98
|
+
#
|
99
|
+
# Validates the uniqueness of parameter keys and numbers.
|
100
|
+
#
|
101
|
+
def validate_params()
|
96
102
|
|
97
|
-
|
98
|
-
|
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
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
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
|
-
|
200
|
+
class Category
|
201
|
+
include Enumerable
|
116
202
|
|
203
|
+
attr_accessor :number
|
204
|
+
attr_accessor :name
|
205
|
+
attr_accessor :parameter
|
117
206
|
|
118
|
-
|
207
|
+
def initialize()
|
208
|
+
@parameter = []
|
209
|
+
end
|
119
210
|
|
120
|
-
|
121
|
-
|
122
|
-
|
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
|
-
|
138
|
-
@maximum=range
|
139
|
-
end
|
218
|
+
class ParameterFactory
|
140
219
|
|
141
|
-
|
142
|
-
@balance_minimum=range
|
143
|
-
end
|
220
|
+
attr_accessor :params
|
144
221
|
|
145
|
-
|
146
|
-
|
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
|
-
|
226
|
+
def param(parameter, number, ¶meter_def)
|
227
|
+
# evaluate given block in Parameter context and return new parameter
|
228
|
+
p = Parameter.new(parameter, number)
|
229
|
+
p.instance_eval(¶meter_def) if parameter_def
|
230
|
+
params << p
|
231
|
+
end
|
167
232
|
|
168
|
-
|
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
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
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
|
-
|
258
|
+
def depends_on(dependency)
|
259
|
+
@dependency=dependency
|
260
|
+
end
|
183
261
|
|
184
|
-
|
185
|
-
|
186
|
-
|
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
|
-
|
203
|
-
|
204
|
-
|
266
|
+
def <=>(parameter)
|
267
|
+
self.number <=> parameter.number
|
268
|
+
end
|
205
269
|
|
206
|
-
|
207
|
-
|
208
|
-
|
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
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
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
|
-
|
236
|
-
|
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
|
-
|
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(
|
47
|
-
name, desc=@translator.translate(
|
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
|
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
|
-
|
206
|
+
#TODO use set or something similar
|
207
|
+
suite.parameters.select(){|p| p.param? }
|
205
208
|
end
|
206
209
|
|
207
210
|
#
|
data/lib/setup_configuration.rb
CHANGED
@@ -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/
|
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')
|