stats_package_syntax_file_generator 1.1.2 → 1.1.8

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d27674844d6bbb4790bdd454c6250a20ae588c429dd7343a5ec832f8aa17f004
4
- data.tar.gz: 86451a062d7dd2d5356b7bc9119f6cabc69ed5c5305bc4931e2e6dee60975982
3
+ metadata.gz: 805a94fbae05131beedbccf6c5f152bf9c591bdc4e187a8ff9f522787596d055
4
+ data.tar.gz: 1f6471c80ee20fefb38f5533c88460e819a1eb21dfdbc27f9b656b39616023df
5
5
  SHA512:
6
- metadata.gz: 912682063d30e1eb109d9449d66f4ab2c4a641105a9478664e3ef913b47d4370462a4ce87434fd77d2a3514fe07336c8457d759b66466e8e29916ae0141029b1
7
- data.tar.gz: a8f9ddc1cdc3a481753be4b613d0e09117d1cb37c15870f0ad3c16a6229b320c13c09316fded154d544da92057f4aac147e9a068afe3e04912d05c982b611a99
6
+ metadata.gz: 2d62e7924e7b628d9e12789faf7430750691114eea125802c27c1a0af002cde7b58fbc2860b41805d2b9f8621e0b0ad032663dc4a3ddca60c2ed0ba288a0340b
7
+ data.tar.gz: 508457b7708fbc5a5780141d1196d8034fbaa2d9485640d243c2c3fbf11c9623875cc090a33d3a8fc3c6f0c795adfc07f87a5c981d493074f148fb2d156f7efe
@@ -4,284 +4,276 @@
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.2"
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.8"
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
40
- 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 ATTR[k][:req] and not args.has_key?(k)
41
40
  v = args.has_key?(k) ? args[k] : ATTR[k][:def]
42
41
  instance_variable_set("@#{k}".to_sym, v)
43
- }
42
+ }
44
43
 
45
- @output_file_ext = {
46
- 'sas' => '.sas',
47
- 'spss' => '.sps',
44
+ @output_file_ext = {
45
+ 'sas' => '.sas',
46
+ 'spss' => '.sps',
48
47
  'stata' => '.do',
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
58
-
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
59
57
 
60
- # Methods to import metadata from YAML files into the Controller object.
58
+ # Methods to import metadata from YAML files into the Controller object.
61
59
 
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
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
67
65
 
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
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
75
73
 
76
- def load_yaml_md (md)
77
- # Uses metadata from yaml to set metadata-related instance variables.
78
- ATTR.each_key do |k|
74
+ def load_yaml_md(md)
75
+ # Uses metadata from yaml to set metadata-related instance variables.
76
+ ATTR.each_key do |k|
79
77
  next unless md.has_key?(k) and ATTR[k][:yaml]
80
78
  instance_variable_set("@#{k}".to_sym, md[k])
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|
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|
86
84
  vals = md_var.delete(:values)
87
85
  var = add_variable(md_var)
88
86
  vals.each { |v| var.add_value(v) } unless vals.nil?
87
+ end
89
88
  end
90
- end
91
89
 
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
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
97
95
  h.map { |v| symbolize_keys(v) }
98
- else
96
+ else
99
97
  h
98
+ end
100
99
  end
101
- end
102
100
 
103
- # Methods to add or get variables.
101
+ # Methods to add or get variables.
104
102
 
105
- def add_variable (args)
106
- @variables.push Variable.new(args)
107
- @variables[-1]
108
- end
103
+ def add_variable(args)
104
+ @variables.push Variable.new(args)
105
+ @variables[-1]
106
+ end
109
107
 
110
- def clear_variables
111
- @variables = []
112
- end
108
+ def clear_variables
109
+ @variables = []
110
+ end
113
111
 
114
- def get_var_by_name (n)
115
- @variables.find { |v| v.name == n }
116
- end
112
+ def get_var_by_name(n)
113
+ @variables.find { |v| v.name == n }
114
+ end
117
115
 
118
- def get_vars_by_record_type (rt)
119
- @variables.find_all { |v| v.record_type == rt or v.is_common_var }
120
- end
116
+ def get_vars_by_record_type(rt)
117
+ @variables.find_all { |v| v.record_type == rt or v.is_common_var }
118
+ end
121
119
 
122
- def get_vars_with_var_labels
123
- @variables.find_all { |v| v.label.length > 0 }
124
- end
120
+ def get_vars_with_var_labels
121
+ @variables.find_all { |v| v.label.length > 0 }
122
+ end
125
123
 
126
- def get_vars_with_values
127
- @variables.find_all { |var|
124
+ def get_vars_with_values
125
+ @variables.find_all { |var|
128
126
  var.values.size > 0 and
129
- not var.suppress_labels
130
- }
131
- end
127
+ not var.suppress_labels
128
+ }
129
+ end
132
130
 
133
- def get_big_nums
134
- @variables.find_all { |var|
131
+ def get_big_nums
132
+ @variables.find_all { |var|
135
133
  var.width > 8 and
136
- not var.is_string_var
137
- }
138
- end
139
-
140
-
141
- def record_type_var
142
- get_var_by_name(@record_type_var_name)
143
- end
134
+ not var.is_string_var
135
+ }
136
+ end
144
137
 
138
+ def record_type_var
139
+ get_var_by_name(@record_type_var_name)
140
+ end
145
141
 
146
- # Methods for adding values to variables.
142
+ # Methods for adding values to variables.
147
143
 
148
- def add_value (args)
149
- @variables[-1].values.push Value.new(args)
150
- @variables[-1].values[-1]
151
- end
152
-
153
- def new_values (*vals)
154
- vals.flatten!
155
- vals.map { |v| Value.new(v) }
156
- end
144
+ def add_value(args)
145
+ @variables[-1].values.push Value.new(args)
146
+ @variables[-1].values[-1]
147
+ end
157
148
 
149
+ def new_values(*vals)
150
+ vals.flatten!
151
+ vals.map { |v| Value.new(v) }
152
+ end
158
153
 
159
- # Methods for record types.
154
+ # Methods for record types.
160
155
 
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
165
-
166
- def rec_types_except_last
167
- r = Array.new(@record_types)
168
- r.pop
169
- r
170
- end
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
171
160
 
161
+ def rec_types_except_last
162
+ r = Array.new(@record_types)
163
+ r.pop
164
+ r
165
+ end
172
166
 
173
- # Helper methods.
167
+ # Helper methods.
174
168
 
175
- def max_var_name_length
176
- return 0 if @variables.empty?
177
- @variables.map { |v| v.name.length }.max
178
- end
169
+ def max_var_name_length
170
+ return 0 if @variables.empty?
171
+ @variables.map { |v| v.name.length }.max
172
+ end
179
173
 
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
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
184
178
 
185
- def data_file_name_stem
186
- File.basename(@data_file_name, '.*')
187
- end
179
+ def data_file_name_stem
180
+ File.basename(@data_file_name, '.*')
181
+ end
188
182
 
189
- def rec_type_lookup_hash
190
- Hash[ * @record_types.map { |rt| [rt, 0] }.flatten ]
191
- end
183
+ def rec_type_lookup_hash
184
+ Hash[* @record_types.map { |rt| [rt, 0] }.flatten]
185
+ end
192
186
 
193
- def last_column_used
194
- return 0 if @variables.empty?
195
- @variables.map { |v| v.end_column }.max
196
- end
187
+ def last_column_used
188
+ return 0 if @variables.empty?
189
+ @variables.map { |v| v.end_column }.max
190
+ end
197
191
 
198
- # Output methods.
192
+ # Output methods.
199
193
 
200
- def to_s
201
- YAML.dump(self)
202
- end
194
+ def to_s
195
+ YAML.dump(self)
196
+ end
203
197
 
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
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
208
202
 
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(
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(
213
207
  @output_dir_name,
214
208
  sprintf(@output_file_stem, data_file_name_stem) + @output_file_ext[syntax_type]
215
- )
216
- if File.file?(file_name) and not @output_overwrite
209
+ )
210
+ if File.file?(file_name) and not @output_overwrite
217
211
  $stderr.puts "Skipping file that aready exists => #{file_name}."
218
- else
212
+ else
219
213
  if RUBY_VERSION.start_with? "1.8"
220
214
  File.open(file_name, 'w') { |f| f.puts syntax(syntax_type) }
221
215
  else
222
216
  File.open(file_name, "w:#{self.output_encoding}") { |f|
223
217
 
224
- lines = syntax(syntax_type)
225
- lines.each do |line|
218
+ lines = syntax(syntax_type)
219
+ lines.each do |line|
226
220
  begin
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}"
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}"
230
224
  end
231
- end
225
+ end
232
226
  }
233
227
  end
234
228
 
229
+ end
235
230
  end
236
- end
237
-
238
- def syntax (syntax_type)
239
- validate_metadata(:minimal => true)
240
- modify_metadata
241
- validate_metadata
242
231
 
243
- maker_class = 'Maker' + syntax_type.upcase
244
- syntax_maker = eval(maker_class).new(self, syntax_type)
245
- syntax_maker.syntax
246
- end
232
+ def syntax(syntax_type)
233
+ validate_metadata(:minimal => true)
234
+ modify_metadata
235
+ validate_metadata
247
236
 
237
+ maker_class = 'Maker' + syntax_type.upcase
238
+ syntax_maker = eval(maker_class).new(self, syntax_type)
239
+ syntax_maker.syntax
240
+ end
248
241
 
249
- # Before generating syntax, we need to handle some controller-level
250
- # options that require global modification of the metadata.
242
+ # Before generating syntax, we need to handle some controller-level
243
+ # options that require global modification of the metadata.
251
244
 
252
- def modify_metadata
253
- # Force all variables to be strings.
254
- if @all_vars_as_string
245
+ def modify_metadata
246
+ # Force all variables to be strings.
247
+ if @all_vars_as_string
255
248
  @variables.each do |var|
256
- var.is_string_var = true
257
- var.is_double_var = false
258
- var.implied_decimals = 0
249
+ var.is_string_var = true
250
+ var.is_double_var = false
251
+ var.implied_decimals = 0
259
252
  end
260
- end
253
+ end
261
254
 
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
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
265
258
 
266
- # Remove any variables not belonging to the declared record types.
267
- if @select_vars_by_record_type
259
+ # Remove any variables not belonging to the declared record types.
260
+ if @select_vars_by_record_type
268
261
  rt_lookup = rec_type_lookup_hash()
269
262
  @variables = @variables.find_all { |var| var.is_common_var or rt_lookup[var.record_type] }
263
+ end
270
264
  end
271
- end
272
-
273
265
 
274
- # Before generating syntax, run a sanity check on the metadata.
266
+ # Before generating syntax, run a sanity check on the metadata.
275
267
 
276
- def validate_metadata (check = {})
277
- bad_metadata('no variables') if @variables.empty?
268
+ def validate_metadata(check = {})
269
+ bad_metadata('no variables') if @variables.empty?
278
270
 
279
- if @rectangularize
271
+ if @rectangularize
280
272
  msg = 'the rectangularize option requires data_structure=hier'
281
273
  bad_metadata(msg) unless @data_structure == 'hier'
282
- end
274
+ end
283
275
 
284
- if @data_structure == 'hier' or @select_vars_by_record_type
276
+ if @data_structure == 'hier' or @select_vars_by_record_type
285
277
  bad_metadata('no record types') if @record_types.empty?
286
278
 
287
279
  msg = 'record types must be unique'
@@ -292,34 +284,34 @@ def validate_metadata (check = {})
292
284
 
293
285
  msg = 'with no common variables, every record type needs at least one variable ('
294
286
  if @variables.find { |var| var.is_common_var }.nil?
295
- @record_types.each do |rt|
296
- next if get_vars_by_record_type(rt).size > 0
297
- bad_metadata(msg + rt + ')')
298
- end
287
+ @record_types.each do |rt|
288
+ next if get_vars_by_record_type(rt).size > 0
289
+ bad_metadata(msg + rt + ')')
290
+ end
299
291
  end
300
- end
292
+ end
301
293
 
302
- if @data_structure == 'hier'
294
+ if @data_structure == 'hier'
303
295
  bad_metadata('no record type variable') if record_type_var.nil?
304
- end
296
+ end
305
297
 
306
- return if check[:minimal]
298
+ return if check[:minimal]
307
299
 
308
- @variables.each do |v|
309
- v.start_column = v.start_column.to_i
310
- v.width = v.width.to_i
300
+ @variables.each do |v|
301
+ v.start_column = v.start_column.to_i
302
+ v.width = v.width.to_i
311
303
  v.implied_decimals = v.implied_decimals.to_i
312
- bad_metadata("#{v.name}, start_column" ) unless v.start_column > 0
313
- bad_metadata("#{v.name}, width" ) unless v.width > 0
304
+ bad_metadata("#{v.name}, start_column") unless v.start_column > 0
305
+ bad_metadata("#{v.name}, width") unless v.width > 0
314
306
  bad_metadata("#{v.name}, implied_decimals") unless v.implied_decimals >= 0
307
+ end
315
308
  end
316
- end
317
309
 
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
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
323
315
 
324
- end
316
+ end
325
317
  end