stats_package_syntax_file_generator 1.1.3 → 1.1.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 979787a0351769e1f7ba25a38e169a8f8a13ae0091e7b5faad0a858b8d501cb7
4
- data.tar.gz: 79ba66410caaed9dec8d450ae28137a8328405987985cf9d472ecff8b6929873
3
+ metadata.gz: d70e7b804a5ab33d5c760f9bdf3e78952698635f52696434090e0e9b253a940a
4
+ data.tar.gz: f34831874237c55bba2be89b67ad6c474ebf10d6c30198f11d514db97b3761e2
5
5
  SHA512:
6
- metadata.gz: 07c600f733ed4bef35d689d3486f51dbac9e914a774ae0e442b1c900a3e74cc8b82afe49bba534a655671d12a217dd9393c0a9611430f4b0ad9da1687ffe425e
7
- data.tar.gz: 5f5c54efe960a92abe98f808e2c8829efca9e03eddef54705a5d04c9e339246653a628e5b1bed059cc3153ebd53fee438d14be50866d8543ecef180c47bc5c14
6
+ metadata.gz: 7681d6c9dad0c9b13fb6a7111b40e1812d1f1498d542f14b602d8e32cda3ed0255f53b9186bc2fe842aa13937c149963a1a3a25782652f616eda83707489f182
7
+ data.tar.gz: 0f6a2791585490994d5c199a7664cf8210f9b4872bbbb788755d5485625b77f3e3e51aaa38eb84c861aeab4d4a81fee759f41679a00e47f1d3fd276fb0a75a62
@@ -4,276 +4,284 @@
4
4
  # https://github.com/mnpopcenter/stats_package_syntax_file_generator
5
5
 
6
6
  module SyntaxFile
7
- class Controller
8
-
9
- VERSION = "1.1.3"
10
-
11
- ATTR = {
12
- :project => { :req => false, :rw => 'rw', :def => '', :yaml => true },
13
- :caller => { :req => false, :rw => 'rw', :def => '', :yaml => true },
14
- :data_dir_name => { :req => false, :rw => 'rw', :def => '.', :yaml => true },
15
- :data_file_name => { :req => false, :rw => 'rw', :def => 'DATA_FILE', :yaml => true },
16
- :output_formats => { :req => false, :rw => 'rw', :def => nil, :yaml => true },
17
- :output_dir_name => { :req => false, :rw => 'rw', :def => '.', :yaml => true },
18
- :output_file_stem => { :req => false, :rw => 'rw', :def => '%s', :yaml => true },
19
- :output_file_ext => { :req => false, :rw => 'rw', :def => nil, :yaml => true },
20
- :output_overwrite => { :req => false, :rw => 'rw', :def => false, :yaml => true },
21
- :data_structure => { :req => false, :rw => 'rw', :def => 'rect', :yaml => true },
22
- :record_types => { :req => false, :rw => 'rw', :def => nil, :yaml => true },
23
- :record_type_var_name => { :req => false, :rw => 'rw', :def => '', :yaml => true },
24
- :rectangularize => { :req => false, :rw => 'rw', :def => false, :yaml => true },
25
- :all_vars_as_string => { :req => false, :rw => 'rw', :def => false, :yaml => true },
26
- :select_vars_by_record_type => { :req => false, :rw => 'rw', :def => false, :yaml => true },
27
- :variables => { :req => false, :rw => 'r', :def => nil, :yaml => false },
28
- :yaml_files => { :req => false, :rw => 'r', :def => nil, :yaml => false },
29
- :output_encoding => { :req => false, :rw => 'r', :def => "iso-8859-1",:yaml => true },
30
- }
31
-
32
- ATTR.each_key do |k|
33
- attr_reader k if ATTR[k][:rw].include? 'r'
34
- attr_writer k if ATTR[k][:rw].include? 'w'
35
- end
7
+ class Controller
8
+
9
+ VERSION = "1.1.6"
10
+
11
+ ATTR = {
12
+ :project => { :req => false, :rw => 'rw', :def => '', :yaml => true },
13
+ :caller => { :req => false, :rw => 'rw', :def => '', :yaml => true },
14
+ :data_dir_name => { :req => false, :rw => 'rw', :def => '.', :yaml => true },
15
+ :data_file_name => { :req => false, :rw => 'rw', :def => 'DATA_FILE', :yaml => true },
16
+ :output_formats => { :req => false, :rw => 'rw', :def => nil, :yaml => true },
17
+ :output_dir_name => { :req => false, :rw => 'rw', :def => '.', :yaml => true },
18
+ :output_file_stem => { :req => false, :rw => 'rw', :def => '%s', :yaml => true },
19
+ :output_file_ext => { :req => false, :rw => 'rw', :def => nil, :yaml => true },
20
+ :output_overwrite => { :req => false, :rw => 'rw', :def => false, :yaml => true },
21
+ :data_structure => { :req => false, :rw => 'rw', :def => 'rect', :yaml => true },
22
+ :record_types => { :req => false, :rw => 'rw', :def => nil, :yaml => true },
23
+ :record_type_var_name => { :req => false, :rw => 'rw', :def => '', :yaml => true },
24
+ :rectangularize => { :req => false, :rw => 'rw', :def => false, :yaml => true },
25
+ :all_vars_as_string => { :req => false, :rw => 'rw', :def => false, :yaml => true },
26
+ :select_vars_by_record_type => { :req => false, :rw => 'rw', :def => false, :yaml => true },
27
+ :variables => { :req => false, :rw => 'r', :def => nil, :yaml => false },
28
+ :yaml_files => { :req => false, :rw => 'r', :def => nil, :yaml => false },
29
+ :output_encoding => { :req => false, :rw => 'r', :def => "iso-8859-1",:yaml => true },
30
+ }
31
+
32
+ ATTR.each_key do |k|
33
+ attr_reader k if ATTR[k][:rw].include? 'r'
34
+ attr_writer k if ATTR[k][:rw].include? 'w'
35
+ end
36
36
 
37
- def initialize(args = {})
38
- ATTR.each_key { |k|
39
- raise(ArgumentError, "Missing required parameter: '#{k}'.") if ATTR[k][:req] and not args.has_key?(k)
37
+ def initialize (args = {})
38
+ ATTR.each_key { |k|
39
+ raise(ArgumentError, "Missing required parameter: '#{k}'.") if
40
+ ATTR[k][:req] and not args.has_key?(k)
40
41
  v = args.has_key?(k) ? args[k] : ATTR[k][:def]
41
42
  instance_variable_set("@#{k}".to_sym, v)
42
- }
43
+ }
43
44
 
44
- @output_file_ext = {
45
- 'sas' => '.sas',
46
- 'spss' => '.sps',
45
+ @output_file_ext = {
46
+ 'sas' => '.sas',
47
+ 'spss' => '.sps',
47
48
  'stata' => '.do',
48
- 'sts' => '.sts',
49
- 'rddi' => '.R'
50
- } if @output_file_ext.nil?
51
- @output_formats = [] if @output_formats.nil?
52
- @record_types = [] if @record_types.nil?
53
- @variables = [] if @variables.nil?
54
- @yaml_files = [] if @yaml_files.nil?
55
- read_metadata_from_yaml
56
- end
49
+ 'sts' => '.sts',
50
+ 'rddi' => '.R'
51
+ } if @output_file_ext.nil?
52
+ @output_formats = [] if @output_formats.nil?
53
+ @record_types = [] if @record_types.nil?
54
+ @variables = [] if @variables.nil?
55
+ @yaml_files = [] if @yaml_files.nil?
56
+ read_metadata_from_yaml
57
+ end
57
58
 
58
- # Methods to import metadata from YAML files into the Controller object.
59
59
 
60
- def yaml_files=(file_names)
61
- # Caller can supply a file name or an array of file names.
62
- @yaml_files = file_names.to_a
63
- read_metadata_from_yaml
64
- end
60
+ # Methods to import metadata from YAML files into the Controller object.
65
61
 
66
- def read_metadata_from_yaml
67
- return if @yaml_files.empty?
68
- md = {}
69
- @yaml_files.each { |f| md.merge! YAML.load_file(f) }
70
- md = symbolize_keys(md)
71
- load_yaml_md(md)
72
- end
62
+ def yaml_files= (file_names)
63
+ # Caller can supply a file name or an array of file names.
64
+ @yaml_files = file_names.to_a
65
+ read_metadata_from_yaml
66
+ end
67
+
68
+ def read_metadata_from_yaml
69
+ return if @yaml_files.empty?
70
+ md = {}
71
+ @yaml_files.each { |f| md.merge! YAML.load_file(f) }
72
+ md = symbolize_keys(md)
73
+ load_yaml_md(md)
74
+ end
73
75
 
74
- def load_yaml_md(md)
75
- # Uses metadata from yaml to set metadata-related instance variables.
76
- ATTR.each_key do |k|
76
+ def load_yaml_md (md)
77
+ # Uses metadata from yaml to set metadata-related instance variables.
78
+ ATTR.each_key do |k|
77
79
  next unless md.has_key?(k) and ATTR[k][:yaml]
78
80
  instance_variable_set("@#{k}".to_sym, md[k])
79
- end
80
- return unless md.has_key?(:variables)
81
- @variables = []
82
- return unless md[:variables].size > 0
83
- md[:variables].each do |md_var|
81
+ end
82
+ return unless md.has_key?(:variables)
83
+ @variables = []
84
+ return unless md[:variables].size > 0
85
+ md[:variables].each do |md_var|
84
86
  vals = md_var.delete(:values)
85
87
  var = add_variable(md_var)
86
88
  vals.each { |v| var.add_value(v) } unless vals.nil?
87
- end
88
89
  end
90
+ end
89
91
 
90
- def symbolize_keys(h)
91
- # Recursively converts hash keys from strings to symbols.
92
- if h.instance_of? Hash
93
- h.inject({}) { |return_hash, (k, v)| return_hash[k.to_sym] = symbolize_keys(v); return_hash }
94
- elsif h.instance_of? Array
92
+ def symbolize_keys (h)
93
+ # Recursively converts hash keys from strings to symbols.
94
+ if h.instance_of? Hash
95
+ h.inject({}) { |return_hash,(k,v)| return_hash[k.to_sym] = symbolize_keys(v); return_hash }
96
+ elsif h.instance_of? Array
95
97
  h.map { |v| symbolize_keys(v) }
96
- else
98
+ else
97
99
  h
98
- end
99
100
  end
101
+ end
100
102
 
101
- # Methods to add or get variables.
103
+ # Methods to add or get variables.
102
104
 
103
- def add_variable(args)
104
- @variables.push Variable.new(args)
105
- @variables[-1]
106
- end
105
+ def add_variable (args)
106
+ @variables.push Variable.new(args)
107
+ @variables[-1]
108
+ end
107
109
 
108
- def clear_variables
109
- @variables = []
110
- end
110
+ def clear_variables
111
+ @variables = []
112
+ end
111
113
 
112
- def get_var_by_name(n)
113
- @variables.find { |v| v.name == n }
114
- end
114
+ def get_var_by_name (n)
115
+ @variables.find { |v| v.name == n }
116
+ end
115
117
 
116
- def get_vars_by_record_type(rt)
117
- @variables.find_all { |v| v.record_type == rt or v.is_common_var }
118
- end
118
+ def get_vars_by_record_type (rt)
119
+ @variables.find_all { |v| v.record_type == rt or v.is_common_var }
120
+ end
119
121
 
120
- def get_vars_with_var_labels
121
- @variables.find_all { |v| v.label.length > 0 }
122
- end
122
+ def get_vars_with_var_labels
123
+ @variables.find_all { |v| v.label.length > 0 }
124
+ end
123
125
 
124
- def get_vars_with_values
125
- @variables.find_all { |var|
126
+ def get_vars_with_values
127
+ @variables.find_all { |var|
126
128
  var.values.size > 0 and
127
- not var.suppress_labels
128
- }
129
- end
129
+ not var.suppress_labels
130
+ }
131
+ end
130
132
 
131
- def get_big_nums
132
- @variables.find_all { |var|
133
+ def get_big_nums
134
+ @variables.find_all { |var|
133
135
  var.width > 8 and
134
- not var.is_string_var
135
- }
136
- end
136
+ not var.is_string_var
137
+ }
138
+ end
137
139
 
138
- def record_type_var
139
- get_var_by_name(@record_type_var_name)
140
- end
141
140
 
142
- # Methods for adding values to variables.
141
+ def record_type_var
142
+ get_var_by_name(@record_type_var_name)
143
+ end
143
144
 
144
- def add_value(args)
145
- @variables[-1].values.push Value.new(args)
146
- @variables[-1].values[-1]
147
- end
148
145
 
149
- def new_values(*vals)
150
- vals.flatten!
151
- vals.map { |v| Value.new(v) }
152
- end
146
+ # Methods for adding values to variables.
153
147
 
154
- # Methods for record types.
148
+ def add_value (args)
149
+ @variables[-1].values.push Value.new(args)
150
+ @variables[-1].values[-1]
151
+ end
155
152
 
156
- def is_last_record_type(rt)
157
- return true if @record_types.size > 0 and @record_types[-1] == rt
158
- return false
159
- end
153
+ def new_values (*vals)
154
+ vals.flatten!
155
+ vals.map { |v| Value.new(v) }
156
+ end
160
157
 
161
- def rec_types_except_last
162
- r = Array.new(@record_types)
163
- r.pop
164
- r
165
- end
166
158
 
167
- # Helper methods.
159
+ # Methods for record types.
168
160
 
169
- def max_var_name_length
170
- return 0 if @variables.empty?
171
- @variables.map { |v| v.name.length }.max
172
- end
161
+ def is_last_record_type (rt)
162
+ return true if @record_types.size > 0 and @record_types[-1] == rt
163
+ return false
164
+ end
173
165
 
174
- def max_col_loc_width
175
- return 0 if @variables.empty?
176
- @variables.map { |v| v.end_column.to_s.length }.max
177
- end
166
+ def rec_types_except_last
167
+ r = Array.new(@record_types)
168
+ r.pop
169
+ r
170
+ end
178
171
 
179
- def data_file_name_stem
180
- File.basename(@data_file_name, '.*')
181
- end
182
172
 
183
- def rec_type_lookup_hash
184
- Hash[* @record_types.map { |rt| [rt, 0] }.flatten]
185
- end
173
+ # Helper methods.
186
174
 
187
- def last_column_used
188
- return 0 if @variables.empty?
189
- @variables.map { |v| v.end_column }.max
190
- end
175
+ def max_var_name_length
176
+ return 0 if @variables.empty?
177
+ @variables.map { |v| v.name.length }.max
178
+ end
179
+
180
+ def max_col_loc_width
181
+ return 0 if @variables.empty?
182
+ @variables.map { |v| v.end_column.to_s.length }.max
183
+ end
191
184
 
192
- # Output methods.
185
+ def data_file_name_stem
186
+ File.basename(@data_file_name, '.*')
187
+ end
193
188
 
194
- def to_s
195
- YAML.dump(self)
196
- end
189
+ def rec_type_lookup_hash
190
+ Hash[ * @record_types.map { |rt| [rt, 0] }.flatten ]
191
+ end
197
192
 
198
- def generate_syntax_files
199
- bad_metadata('no output formats') if @output_formats.empty?
200
- @output_formats.each { |t| generate_syntax_file(t) }
201
- end
193
+ def last_column_used
194
+ return 0 if @variables.empty?
195
+ @variables.map { |v| v.end_column }.max
196
+ end
197
+
198
+ # Output methods.
202
199
 
203
- def generate_syntax_file(syntax_type)
204
- msg = "output directory does not exist => #{@output_dir_name}"
205
- bad_metadata(msg) unless File.directory?(@output_dir_name)
206
- file_name = File.join(
200
+ def to_s
201
+ YAML.dump(self)
202
+ end
203
+
204
+ def generate_syntax_files
205
+ bad_metadata('no output formats')if @output_formats.empty?
206
+ @output_formats.each { |t| generate_syntax_file(t) }
207
+ end
208
+
209
+ def generate_syntax_file (syntax_type)
210
+ msg = "output directory does not exist => #{@output_dir_name}"
211
+ bad_metadata(msg) unless File.directory?(@output_dir_name)
212
+ file_name = File.join(
207
213
  @output_dir_name,
208
214
  sprintf(@output_file_stem, data_file_name_stem) + @output_file_ext[syntax_type]
209
- )
210
- if File.file?(file_name) and not @output_overwrite
215
+ )
216
+ if File.file?(file_name) and not @output_overwrite
211
217
  $stderr.puts "Skipping file that aready exists => #{file_name}."
212
- else
218
+ else
213
219
  if RUBY_VERSION.start_with? "1.8"
214
220
  File.open(file_name, 'w') { |f| f.puts syntax(syntax_type) }
215
221
  else
216
222
  File.open(file_name, "w:#{self.output_encoding}") { |f|
217
223
 
218
- lines = syntax(syntax_type)
219
- lines.each do |line|
224
+ lines = syntax(syntax_type)
225
+ lines.each do |line|
220
226
  begin
221
- f.puts line.rstrip.encode(self.output_encoding, line.encoding.to_s, :invalid => :replace, :undef => :replace, :replace => '?')
222
- rescue Exception => msg
223
- puts "Failed encoding on line #{line} #{msg}"
227
+ f.puts line.rstrip.encode(self.output_encoding, line.encoding.to_s,{:invalid=>:replace, :undef=>:replace,:replace => '?'})
228
+ rescue Exception=>msg
229
+ puts "Failed encoding on line #{line} #{msg}"
224
230
  end
225
- end
231
+ end
226
232
  }
227
233
  end
228
234
 
229
- end
230
235
  end
236
+ end
231
237
 
232
- def syntax(syntax_type)
233
- validate_metadata(:minimal => true)
234
- modify_metadata
235
- validate_metadata
238
+ def syntax (syntax_type)
239
+ validate_metadata(:minimal => true)
240
+ modify_metadata
241
+ validate_metadata
242
+
243
+ maker_class = 'Maker' + syntax_type.upcase
244
+ syntax_maker = eval(maker_class).new(self, syntax_type)
245
+ syntax_maker.syntax
246
+ end
236
247
 
237
- maker_class = 'Maker' + syntax_type.upcase
238
- syntax_maker = eval(maker_class).new(self, syntax_type)
239
- syntax_maker.syntax
240
- end
241
248
 
242
- # Before generating syntax, we need to handle some controller-level
243
- # options that require global modification of the metadata.
249
+ # Before generating syntax, we need to handle some controller-level
250
+ # options that require global modification of the metadata.
244
251
 
245
- def modify_metadata
246
- # Force all variables to be strings.
247
- if @all_vars_as_string
252
+ def modify_metadata
253
+ # Force all variables to be strings.
254
+ if @all_vars_as_string
248
255
  @variables.each do |var|
249
- var.is_string_var = true
250
- var.is_double_var = false
251
- var.implied_decimals = 0
256
+ var.is_string_var = true
257
+ var.is_double_var = false
258
+ var.implied_decimals = 0
252
259
  end
253
- end
260
+ end
254
261
 
255
- # If the user wants to rectangularize hierarchical data, the
256
- # select_vars_by_record_type option is required.
257
- @select_vars_by_record_type = true if @rectangularize
262
+ # If the user wants to rectangularize hierarchical data, the
263
+ # select_vars_by_record_type option is required.
264
+ @select_vars_by_record_type = true if @rectangularize
258
265
 
259
- # Remove any variables not belonging to the declared record types.
260
- if @select_vars_by_record_type
266
+ # Remove any variables not belonging to the declared record types.
267
+ if @select_vars_by_record_type
261
268
  rt_lookup = rec_type_lookup_hash()
262
269
  @variables = @variables.find_all { |var| var.is_common_var or rt_lookup[var.record_type] }
263
- end
264
270
  end
271
+ end
272
+
265
273
 
266
- # Before generating syntax, run a sanity check on the metadata.
274
+ # Before generating syntax, run a sanity check on the metadata.
267
275
 
268
- def validate_metadata(check = {})
269
- bad_metadata('no variables') if @variables.empty?
276
+ def validate_metadata (check = {})
277
+ bad_metadata('no variables') if @variables.empty?
270
278
 
271
- if @rectangularize
279
+ if @rectangularize
272
280
  msg = 'the rectangularize option requires data_structure=hier'
273
281
  bad_metadata(msg) unless @data_structure == 'hier'
274
- end
282
+ end
275
283
 
276
- if @data_structure == 'hier' or @select_vars_by_record_type
284
+ if @data_structure == 'hier' or @select_vars_by_record_type
277
285
  bad_metadata('no record types') if @record_types.empty?
278
286
 
279
287
  msg = 'record types must be unique'
@@ -284,34 +292,34 @@ module SyntaxFile
284
292
 
285
293
  msg = 'with no common variables, every record type needs at least one variable ('
286
294
  if @variables.find { |var| var.is_common_var }.nil?
287
- @record_types.each do |rt|
288
- next if get_vars_by_record_type(rt).size > 0
289
- bad_metadata(msg + rt + ')')
290
- end
295
+ @record_types.each do |rt|
296
+ next if get_vars_by_record_type(rt).size > 0
297
+ bad_metadata(msg + rt + ')')
298
+ end
291
299
  end
292
- end
300
+ end
293
301
 
294
- if @data_structure == 'hier'
302
+ if @data_structure == 'hier'
295
303
  bad_metadata('no record type variable') if record_type_var.nil?
296
- end
304
+ end
297
305
 
298
- return if check[:minimal]
306
+ return if check[:minimal]
299
307
 
300
- @variables.each do |v|
301
- v.start_column = v.start_column.to_i
302
- v.width = v.width.to_i
308
+ @variables.each do |v|
309
+ v.start_column = v.start_column.to_i
310
+ v.width = v.width.to_i
303
311
  v.implied_decimals = v.implied_decimals.to_i
304
- bad_metadata("#{v.name}, start_column") unless v.start_column > 0
305
- bad_metadata("#{v.name}, width") unless v.width > 0
312
+ bad_metadata("#{v.name}, start_column" ) unless v.start_column > 0
313
+ bad_metadata("#{v.name}, width" ) unless v.width > 0
306
314
  bad_metadata("#{v.name}, implied_decimals") unless v.implied_decimals >= 0
307
- end
308
315
  end
316
+ end
309
317
 
310
- def bad_metadata(msg)
311
- msg = 'Invalid metadata: ' + msg
312
- abort(msg) if @caller == 'vb' or @caller == 'dcp'
313
- raise(RuntimeError, msg)
314
- end
318
+ def bad_metadata (msg)
319
+ msg = 'Invalid metadata: ' + msg
320
+ abort(msg) if @caller == 'vb' or @caller == 'dcp'
321
+ raise(RuntimeError, msg)
322
+ end
315
323
 
316
- end
324
+ end
317
325
  end