stats_package_syntax_file_generator 1.1.6 → 1.1.7

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.
@@ -4,21 +4,21 @@
4
4
  # https://github.com/mnpopcenter/stats_package_syntax_file_generator
5
5
 
6
6
  module SyntaxFile
7
- class MakerSPSS < Maker
8
-
9
- def initialize (sfc, syntax_type)
10
- super
11
- m = @sfc.max_var_name_length
12
- @var_loc_format = " %-#{m}s %s"
13
- @var_lab_format = " %-#{m}s %s %s"
14
- @cmd_end = '.'
15
- @var_label_max_leng = 120
16
- @val_label_max_leng = 120
17
- @segment_max_leng = 100
18
- end
19
-
20
- def syntax
21
- r = [
7
+ class MakerSPSS < Maker
8
+
9
+ def initialize(sfc, syntax_type)
10
+ super
11
+ m = @sfc.max_var_name_length
12
+ @var_loc_format = " %-#{m}s %s"
13
+ @var_lab_format = " %-#{m}s %s %s"
14
+ @cmd_end = '.'
15
+ @var_label_max_leng = 120
16
+ @val_label_max_leng = 120
17
+ @segment_max_leng = 100
18
+ end
19
+
20
+ def syntax
21
+ r = [
22
22
  comments_start,
23
23
  syn_cd,
24
24
  blank,
@@ -28,168 +28,167 @@ def syntax
28
28
  syn_execute,
29
29
  blank,
30
30
  comments_end,
31
- ]
32
- r.flatten
33
- end
34
-
35
- def comments_start
36
- convert_to_comments(super)
37
- end
38
-
39
- def comments_end
40
- convert_to_comments(super)
41
- end
42
-
43
- def convert_to_comments (lines)
44
- return [] if lines.empty?
45
- lines.push @cmd_end
46
- [
31
+ ]
32
+ r.flatten
33
+ end
34
+
35
+ def comments_start
36
+ convert_to_comments(super)
37
+ end
38
+
39
+ def comments_end
40
+ convert_to_comments(super)
41
+ end
42
+
43
+ def convert_to_comments(lines)
44
+ return [] if lines.empty?
45
+ lines.push @cmd_end
46
+ [
47
47
  lines.map { |ln| '* ' + ln },
48
48
  blank,
49
- ].flatten
50
- end
49
+ ].flatten
50
+ end
51
51
 
52
- def syn_cd
53
- 'cd ' + q(@sfc.data_dir_name) + @cmd_end
54
- end
52
+ def syn_cd
53
+ 'cd ' + q(@sfc.data_dir_name) + @cmd_end
54
+ end
55
55
 
56
- def syn_df
57
- @sfc.data_structure == 'hier' ? syn_dfh : syn_dfr
58
- end
56
+ def syn_df
57
+ @sfc.data_structure == 'hier' ? syn_dfh : syn_dfr
58
+ end
59
59
 
60
- def syn_dfr
61
- r = [
60
+ def syn_dfr
61
+ r = [
62
62
  syn_dfr_start,
63
63
  syn_var_locations(@sfc.variables),
64
64
  syntax_end,
65
- ]
66
- r.flatten
67
- end
65
+ ]
66
+ r.flatten
67
+ end
68
68
 
69
- def syn_dfr_start
70
- 'data list file = ' + q(@sfc.data_file_name) + ' /'
71
- end
69
+ def syn_dfr_start
70
+ 'data list file = ' + q(@sfc.data_file_name) + ' /'
71
+ end
72
72
 
73
- def syn_dfh
74
- r = [
73
+ def syn_dfh
74
+ r = [
75
75
  syn_dfh_file_type,
76
76
  syn_dfh_data_blocks,
77
77
  'end file type' + @cmd_end,
78
78
  blank,
79
- ]
80
- r.flatten
81
- end
79
+ ]
80
+ r.flatten
81
+ end
82
82
 
83
- def syn_dfh_file_type
84
- r = [
83
+ def syn_dfh_file_type
84
+ r = [
85
85
  'file type ' + nested_or_mixed(),
86
86
  ' /file = ' + q(@sfc.data_file_name),
87
87
  ' /record = ' + var_loc_with_fmt(@sfc.record_type_var).to_s,
88
88
  syntax_end,
89
- ]
90
- r.flatten
91
- end
89
+ ]
90
+ r.flatten
91
+ end
92
92
 
93
- def syn_dfh_data_blocks
94
- r = @sfc.record_types.map { |rt|
93
+ def syn_dfh_data_blocks
94
+ r = @sfc.record_types.map { |rt|
95
95
  [
96
- syn_dfh_data_block_start(rt),
97
- syn_var_locations(@sfc.get_vars_by_record_type(rt)),
98
- syntax_end,
96
+ syn_dfh_data_block_start(rt),
97
+ syn_var_locations(@sfc.get_vars_by_record_type(rt)),
98
+ syntax_end,
99
99
  ]
100
- }
101
- r.flatten
102
- end
100
+ }
101
+ r.flatten
102
+ end
103
103
 
104
- def syn_dfh_data_block_start (rt)
105
- rt_var = @sfc.record_type_var
106
- [
104
+ def syn_dfh_data_block_start(rt)
105
+ rt_var = @sfc.record_type_var
106
+ [
107
107
  'record type ' + val_q(rt_var, val_as_s(rt_var, rt)) + @cmd_end,
108
108
  'data list /',
109
- ]
110
- end
109
+ ]
110
+ end
111
111
 
112
- def syn_var_locations (var_list)
113
- var_list.map { |v| sprintf @var_loc_format, v.name, var_loc_with_fmt(v) }
114
- end
112
+ def syn_var_locations(var_list)
113
+ var_list.map { |v| sprintf @var_loc_format, v.name, var_loc_with_fmt(v) }
114
+ end
115
115
 
116
- def syn_var_labs (var_list = [])
117
- var_list = @sfc.get_vars_with_var_labels if var_list.empty?
118
- return [] if var_list.empty?
119
- r = [
116
+ def syn_var_labs(var_list = [])
117
+ var_list = @sfc.get_vars_with_var_labels if var_list.empty?
118
+ return [] if var_list.empty?
119
+ r = [
120
120
  'variable labels',
121
121
  var_list.map { |var| syn_var_lab_for_var(var) },
122
122
  syntax_end,
123
- ]
124
- r.flatten
125
- end
126
-
127
- def syn_var_lab_for_var (var)
128
- lab = label_trunc(var.label, @var_label_max_leng)
129
- lab_segments = label_segments(lab, @segment_max_leng).map { |s| q(s) }
130
- weave_label_segments(@var_lab_format, [var.name], lab_segments, ' ', '+')
131
- end
132
-
133
- def syn_val_labs
134
- var_list = @sfc.get_vars_with_values
135
- return [] if var_list.empty?
136
- r = [
123
+ ]
124
+ r.flatten
125
+ end
126
+
127
+ def syn_var_lab_for_var(var)
128
+ lab = label_trunc(var.label, @var_label_max_leng)
129
+ lab_segments = label_segments(lab, @segment_max_leng).map { |s| q(s) }
130
+ weave_label_segments(@var_lab_format, [var.name], lab_segments, ' ', '+')
131
+ end
132
+
133
+ def syn_val_labs
134
+ var_list = @sfc.get_vars_with_values
135
+ return [] if var_list.empty?
136
+ r = [
137
137
  'value labels',
138
138
  syn_val_labs_for_var_list(var_list),
139
139
  syntax_end,
140
- ]
141
- r.flatten
142
- end
143
-
144
- def syn_val_labs_for_var_list (var_list)
145
- var_list.map { |var| syn_val_labs_for_var(var) }
146
- end
147
-
148
- def syn_val_labs_for_var (var)
149
- val_list = labelable_values(var)
150
- return [] if val_list.empty?
151
- m = max_value_length(var, val_list)
152
- m = m + 2 if var.is_string_var
153
- m = @segment_max_leng + 2 if m > @segment_max_leng + 2
154
- value_format = " %-#{m}s %s %s"
155
- r = [
140
+ ]
141
+ r.flatten
142
+ end
143
+
144
+ def syn_val_labs_for_var_list(var_list)
145
+ var_list.map { |var| syn_val_labs_for_var(var) }
146
+ end
147
+
148
+ def syn_val_labs_for_var(var)
149
+ val_list = labelable_values(var)
150
+ return [] if val_list.empty?
151
+ m = max_value_length(var, val_list)
152
+ m = m + 2 if var.is_string_var
153
+ m = @segment_max_leng + 2 if m > @segment_max_leng + 2
154
+ value_format = " %-#{m}s %s %s"
155
+ r = [
156
156
  syn_val_labs_for_var_start(var),
157
157
  val_list.map { |val| syn_val_lab_for_val(var, val, value_format) },
158
- ]
159
- r.flatten
160
- end
161
-
162
- def syn_val_labs_for_var_start (var)
163
- ' /' + var.name
164
- end
165
-
166
- def syn_val_lab_for_val (var, val, fmt)
167
- lab = label_trunc(val.label, @val_label_max_leng)
168
- lab = val.value if lab.nil? || (lab.strip.length == 0)
169
- vs = val_as_s(var, val.value)
170
- val_segments = label_segments(vs, @segment_max_leng).map { |s| val_q(var, s) }
171
- lab_segments = label_segments(lab, @segment_max_leng).map { |s| q(s) }
172
- weave_label_segments(fmt, val_segments, lab_segments, ' ', '+')
173
- end
174
-
175
- def syn_execute
176
- 'execute' + @cmd_end
177
- end
178
-
179
- def nested_or_mixed
180
- @sfc.rectangularize ? 'nested' : 'mixed'
181
- end
182
-
183
- def var_loc_with_fmt (var)
184
- var.column_locations_as_s + var_fmt(var)
185
- end
186
-
187
- def var_fmt (var)
188
- return ' (a)' if var.is_string_var
189
- return ' (2) ' if var.is_double_var
190
- return '' unless var.implied_decimals > 0
191
- return ' (' + var.implied_decimals.to_s + ')'
192
- end
193
-
194
- end
158
+ ]
159
+ r.flatten
160
+ end
161
+
162
+ def syn_val_labs_for_var_start(var)
163
+ ' /' + var.name
164
+ end
165
+
166
+ def syn_val_lab_for_val(var, val, fmt)
167
+ lab = label_trunc(val.label, @val_label_max_leng)
168
+ lab = val.value if lab.nil? || (lab.strip.length == 0)
169
+ vs = val_as_s(var, val.value)
170
+ val_segments = label_segments(vs, @segment_max_leng).map { |s| val_q(var, s) }
171
+ lab_segments = label_segments(lab, @segment_max_leng).map { |s| q(s) }
172
+ weave_label_segments(fmt, val_segments, lab_segments, ' ', '+')
173
+ end
174
+
175
+ def syn_execute
176
+ 'execute' + @cmd_end
177
+ end
178
+
179
+ def nested_or_mixed
180
+ @sfc.rectangularize ? 'nested' : 'mixed'
181
+ end
182
+
183
+ def var_loc_with_fmt(var)
184
+ var.column_locations_as_s + var_fmt(var)
185
+ end
186
+
187
+ def var_fmt(var)
188
+ return ' (a)' if var.is_string_var
189
+ return '' unless var.implied_decimals > 0
190
+ return ' (' + var.implied_decimals.to_s + ')'
191
+ end
192
+
193
+ end
195
194
  end
@@ -4,32 +4,29 @@
4
4
  # https://github.com/mnpopcenter/stats_package_syntax_file_generator
5
5
 
6
6
  module SyntaxFile
7
- class MakerSTATA < Maker
8
-
9
- def initialize (sfc, syntax_type)
10
- super
11
-
12
-
13
- mx_var = @sfc.max_var_name_length
14
- mx_col = 2 * @sfc.max_col_loc_width + 1
15
- @var_loc_format = " %-7s %-#{mx_var}s %-#{mx_col}s %s"
16
- @var_lab_format = "label var %-#{mx_var}s %s"
17
- @infix_format = "%#{mx_col + mx_var + 4}s"
18
- @replace_format = "replace %-#{mx_var}s = %-#{mx_var}s / %d"
19
- @fixed_point_display_format = "format %-#{mx_var}s %%%d.%df"
20
- @general_display_format = "format %-#{mx_var}s %%%d.%dg"
21
- @integer_display_format = "format %-#{mx_var}s %%%d.%df"
22
-
23
-
24
- @cmd_end = ''
25
- @cmd_continue = ' ///'
26
- @var_label_max_leng = 80
27
- @val_label_max_leng = 244
28
- @sort_var_stem = '_line_num'
29
- end
7
+ class MakerSTATA < Maker
8
+
9
+ def initialize(sfc, syntax_type)
10
+ super
11
+
12
+ mx_var = @sfc.max_var_name_length
13
+ mx_col = 2 * @sfc.max_col_loc_width + 1
14
+ @var_loc_format = " %-7s %-#{mx_var}s %-#{mx_col}s %s"
15
+ @var_lab_format = "label var %-#{mx_var}s %s"
16
+ @infix_format = "%#{mx_col + mx_var + 4}s"
17
+ @replace_format = "replace %-#{mx_var}s = %-#{mx_var}s / %d"
18
+ @fixed_point_display_format = "format %-#{mx_var}s %%%d.%df"
19
+ @general_display_format = "format %-#{mx_var}s %%%d.%dg"
20
+
21
+ @cmd_end = ''
22
+ @cmd_continue = ' ///'
23
+ @var_label_max_leng = 80
24
+ @val_label_max_leng = 244
25
+ @sort_var_stem = '_line_num'
26
+ end
30
27
 
31
- def syntax
32
- r = [
28
+ def syntax
29
+ r = [
33
30
  comments_start,
34
31
  'set more off',
35
32
  blank,
@@ -44,275 +41,278 @@ def syntax
44
41
  syn_val_labs,
45
42
  blank,
46
43
  comments_end,
47
- ]
48
- r.flatten
49
- end
44
+ ]
45
+ r.flatten
46
+ end
50
47
 
51
- def comments_start
52
- convert_to_comments(super)
53
- end
48
+ def comments_start
49
+ convert_to_comments(super)
50
+ end
54
51
 
55
- def comments_end
56
- convert_to_comments(super)
57
- end
52
+ def comments_end
53
+ convert_to_comments(super)
54
+ end
58
55
 
59
- def convert_to_comments (lines)
60
- return [] if lines.empty?
61
- [
56
+ def convert_to_comments(lines)
57
+ return [] if lines.empty?
58
+ [
62
59
  lines.map { |ln| '* ' + ln },
63
60
  blank,
64
- ].flatten
65
- end
61
+ ].flatten
62
+ end
66
63
 
67
- def syn_df
68
- @sfc.data_structure == 'hier' ? syn_dfh : syn_dfr
69
- end
64
+ def syn_df
65
+ @sfc.data_structure == 'hier' ? syn_dfh : syn_dfr
66
+ end
70
67
 
71
- def syn_dfr
72
- syn_infix(@sfc.variables)
73
- end
68
+ def syn_dfr
69
+ syn_infix(@sfc.variables)
70
+ end
74
71
 
75
- def syn_dfh
76
- r = [
72
+ def syn_dfh
73
+ r = [
77
74
  syn_dfh_infix_blocks,
78
75
  syn_dfh_combine,
79
- ]
80
- r.flatten
81
- end
76
+ ]
77
+ r.flatten
78
+ end
82
79
 
83
- def syn_infix (var_list)
84
- r = [
80
+ def syn_infix(var_list)
81
+ r = [
85
82
  syn_infix_start,
86
83
  syn_infix_var_locs(var_list),
87
84
  syn_infix_end,
88
- ]
89
- r.flatten
90
- end
85
+ ]
86
+ r.flatten
87
+ end
91
88
 
92
- def syn_infix_start
93
- [
89
+ def syn_infix_start
90
+ [
94
91
  'clear',
95
92
  'quietly infix' + sprintf(@infix_format, @cmd_continue),
96
- ]
97
- end
93
+ ]
94
+ end
98
95
 
99
- def syn_infix_var_locs (var_list)
100
- var_list.map { |v|
96
+ def syn_infix_var_locs(var_list)
97
+ var_list.map { |v|
101
98
  sprintf @var_loc_format,
102
- var_fmt(v),
103
- v.name.downcase,
104
- v.column_locations_as_s,
105
- @cmd_continue
106
- }
107
- end
99
+ var_fmt(v),
100
+ v.name.downcase,
101
+ v.column_locations_as_s,
102
+ @cmd_continue
103
+ }
104
+ end
108
105
 
109
- def syn_infix_end
110
- ' using ' + q(@sfc.data_file_name)
111
- end
106
+ def syn_infix_end
107
+ ' using ' + q(@sfc.data_file_name)
108
+ end
112
109
 
113
- def syn_dfh_infix_blocks
114
- r = []
115
- @sfc.record_types.each { |rt|
110
+ def syn_dfh_infix_blocks
111
+ r = []
112
+ @sfc.record_types.each { |rt|
116
113
  var_list = @sfc.get_vars_by_record_type(rt)
117
114
  r.push(
118
- syn_infix(var_list),
119
- syn_dfh_infix_block_end(rt)
115
+ syn_infix(var_list),
116
+ syn_dfh_infix_block_end(rt)
120
117
  ) if var_list.size > 0
121
- }
122
- r.flatten
123
- end
118
+ }
119
+ r.flatten
120
+ end
124
121
 
125
- def syn_dfh_infix_block_end (rt)
126
- r = [
122
+ def syn_dfh_infix_block_end(rt)
123
+ r = [
127
124
  syn_dfh_infix_gen,
128
125
  'drop if ' + rt_ne_statement(rt),
129
126
  'sort ' + sort_vars.join(' '),
130
127
  'save ' + temp_file_name(rt),
131
128
  blank,
132
- ]
133
- r.flatten
134
- end
129
+ ]
130
+ r.flatten
131
+ end
135
132
 
136
- def syn_dfh_infix_gen
137
- return ["gen #{@sort_var_stem} = _n"] unless @sfc.rectangularize
138
- sv = sort_vars()
139
- r = [
133
+ def syn_dfh_infix_gen
134
+ return ["gen #{@sort_var_stem} = _n"] unless @sfc.rectangularize
135
+ sv = sort_vars()
136
+ r = [
140
137
  sv.map { |v| "gen #{v} = _n" },
141
138
  sv.zip(@sfc.record_types).map { |z|
142
- 'replace ' +
143
- z[0] +
144
- ' = ' +
145
- z[0] +
139
+ 'replace ' +
140
+ z[0] +
141
+ ' = ' +
142
+ z[0] +
146
143
  '[_n - 1] if _n > 1 & ' +
147
144
  rt_ne_statement(z[1])
148
145
  }
149
- ]
150
- r.flatten!
151
- end
146
+ ]
147
+ r.flatten!
148
+ end
152
149
 
153
- def syn_dfh_combine
154
- r = [
150
+ def syn_dfh_combine
151
+ r = [
155
152
  'clear',
156
153
  syn_dfh_combine_append,
157
154
  syn_dfh_combine_save,
158
155
  syn_dfh_combine_erase,
159
- ]
160
- r.flatten
161
- end
156
+ ]
157
+ r.flatten
158
+ end
162
159
 
163
- def syn_dfh_combine_append
164
- r = []
165
- tf = temp_file_names()
166
- if @sfc.rectangularize
160
+ def syn_dfh_combine_append
161
+ r = []
162
+ tf = temp_file_names()
163
+ if @sfc.rectangularize
167
164
  sv = sort_vars.reverse
168
165
  tf = tf.reverse
169
166
  sv.shift
170
167
  r.push 'use ' + tf.shift
171
168
  sv.zip(tf).each { |z|
172
- r.push 'merge m:1 ' + z[0] + ' using ' + z[1] + ', keep(master match)'
173
- r.push 'drop _merge'
169
+ r.push 'merge m:1 ' + z[0] + ' using ' + z[1] + ', keep(master match)'
170
+ r.push 'drop _merge'
174
171
  }
175
- else
172
+ else
176
173
  r.push 'use ' + tf.shift
177
174
  tf.each { |t| r.push 'append using ' + t }
175
+ end
176
+ r
178
177
  end
179
- r
180
- end
181
178
 
182
- def syn_dfh_combine_save
183
- [
179
+ def syn_dfh_combine_save
180
+ [
184
181
  'sort ' + sort_vars.join(' '),
185
182
  'drop ' + sort_vars.join(' '),
186
- ]
187
- end
183
+ ]
184
+ end
188
185
 
189
- def syn_dfh_combine_erase
190
- temp_file_names.map { |t| 'erase ' + t }
191
- end
186
+ def syn_dfh_combine_erase
187
+ temp_file_names.map { |t| 'erase ' + t }
188
+ end
192
189
 
193
- def syn_convert_implied_decim
194
- var_list = @sfc.variables.find_all { |var| var.implied_decimals > 0 }
195
- return [] if var_list.empty?
196
- var_list.map { |var|
190
+ def syn_convert_implied_decim
191
+ var_list = @sfc.variables.find_all { |var| var.implied_decimals > 0 }
192
+ return [] if var_list.empty?
193
+ var_list.map { |var|
197
194
  v = var.name.downcase
198
195
  sprintf @replace_format, v, v, 10 ** var.implied_decimals
199
- }
200
- end
196
+ }
197
+ end
201
198
 
202
- def syn_display_format
203
- var_list = @sfc.variables.find_all { |var|
199
+ def syn_display_format
200
+ var_list = @sfc.variables.find_all { |var|
204
201
  vf = var_fmt(var)
205
202
  vf == 'double' or vf == 'float'
206
- }
207
- return [] if var_list.empty?
208
- var_list.map { |var|
203
+ }
204
+ return [] if var_list.empty?
205
+ var_list.map { |var|
209
206
  v = var.name.downcase
210
-
211
- # If implied decimals set, it means we know exactly how much precision
212
- # to show.
213
- # Otherwise we go with the underlying value and the 'g' (general) formatting rules in Stata
214
- # when the variable is a double float in our metadata, or use .0f for formatting if the
215
- # number is a integer in our metadata: In Stata you store large integer type data in
216
- # 'double' or 'long double' type variables. It's confusing.
217
- formatting = if var.implied_decimals > 0
218
- sprintf(@fixed_point_display_format, v, var.width, var.implied_decimals)
219
- elsif var.is_double_var
220
- sprintf(@general_display_format, v, var.width, var.implied_decimals)
221
- else
222
- sprintf(@integer_display_format, v, var.width, 0)
223
- end
224
-
225
- formatting
226
- }
227
- end
228
207
 
229
- def syn_var_labs (var_list = [])
230
- var_list = @sfc.get_vars_with_var_labels if var_list.empty?
231
- return [] if var_list.empty?
232
- var_list.map { |var|
208
+ # If implied decimals set, it means we know exactly how much precision
209
+ # to show. Otherwise we go with the underlying value and the 'g' (general) formatting rules in Stata
210
+ formatting = var.implied_decimals > 0 ?
211
+ sprintf(@fixed_point_display_format, v, var.width, var.implied_decimals) :
212
+ sprintf(@general_display_format, v, var.width, var.implied_decimals)
213
+
214
+ formatting
215
+ }
216
+ end
217
+
218
+ def syn_var_labs(var_list = [])
219
+ var_list = @sfc.get_vars_with_var_labels if var_list.empty?
220
+ return [] if var_list.empty?
221
+ var_list.map { |var|
233
222
  sprintf @var_lab_format,
234
- var.name.downcase,
235
- q( label_trunc(var.label, @var_label_max_leng) )
236
- }
237
- end
223
+ var.name.downcase,
224
+ q(label_trunc(var.label, @var_label_max_leng))
225
+ }
226
+ end
238
227
 
239
- def syn_val_labs
240
- var_list = @sfc.get_vars_with_values.find_all { |var| not var.is_string_var }
241
- return [] if var_list.empty?
242
- r = var_list.map { |var|
243
- [
244
- syn_val_labs_for_var(var),
228
+ def syn_val_labs
229
+ var_list = @sfc.get_vars_with_values.find_all { |var| not var.is_string_var }
230
+ return [] if var_list.empty?
231
+ r = var_list.map { |var|
232
+ labels = syn_val_labs_for_var(var)
233
+ if labels.any?
234
+ [
235
+ labels,
245
236
  "label values " + var.name.downcase + ' ' + label_handle(var),
246
237
  blank,
247
- ]
248
- }
249
- r.flatten
250
- end
238
+ ]
239
+ else
240
+ []
241
+ end
242
+ }
243
+ r.flatten
244
+ end
251
245
 
252
- def syn_val_labs_for_var (var)
253
- val_list = labelable_values(var)
254
- return [] if val_list.empty?
255
- m = max_value_length(var, val_list)
256
- value_format = "label define %s %-#{m}s %s%s"
257
- add_cmd = ''
258
- r = []
259
- val_list.each { |val|
246
+ def syn_val_labs_for_var(var)
247
+ val_list = labelable_values(var)
248
+ return [] if val_list.empty?
249
+ m = max_value_length(var, val_list)
250
+
251
+ # A Stata value 10 digits or wider cannot be labeled.
252
+ if m >= 10
253
+ return []
254
+ end
255
+
256
+ value_format = "label define %s %-#{m}s %s%s"
257
+ add_cmd = ''
258
+ r = []
259
+ val_list.each { |val|
260
260
  label_truncated = label_trunc(val.label, @val_label_max_leng)
261
261
  # stata doesn't like blank value labels
262
262
  label_truncated = val.value if label_truncated.nil? || (label_truncated.strip.length == 0)
263
263
  r.push sprintf(
264
- value_format,
265
- label_handle(var),
266
- val.value,
267
- q( label_truncated ),
268
- add_cmd
264
+ value_format,
265
+ label_handle(var),
266
+ val.value,
267
+ q(label_truncated),
268
+ add_cmd
269
269
  )
270
270
  add_cmd = ', add'
271
- }
272
- r.flatten
273
- end
271
+ }
272
+ r.flatten
273
+ end
274
274
 
275
- def q (s)
276
- '`"' + s.to_s + '"\''
277
- end
275
+ def q(s)
276
+ '`"' + s.to_s + '"\''
277
+ end
278
278
 
279
- def var_fmt (var)
279
+ def var_fmt(var)
280
280
 
281
- return 'str' if var.is_string_var
282
- return 'double' if var.is_double_var || var.implied_decimals > 0
283
- return 'byte' if var.width <= 2
284
- return 'int' if var.width <= 4
285
- return 'long' if var.width <= 7
286
-
287
- return 'double'
288
- end
281
+ return 'str' if var.is_string_var
282
+ return 'double' if var.is_double_var || var.implied_decimals > 0
283
+ return 'byte' if var.width <= 2
284
+ return 'int' if var.width <= 4
285
+ return 'long' if var.width <= 7
286
+
287
+ return 'double'
288
+ end
289
289
 
290
- def temp_file_names
291
- tf = []
292
- @sfc.record_types.each { |rt|
290
+ def temp_file_names
291
+ tf = []
292
+ @sfc.record_types.each { |rt|
293
293
  var_list = @sfc.get_vars_by_record_type(rt)
294
294
  tf.push temp_file_name(rt) if var_list.size > 0
295
- }
296
- tf
297
- end
295
+ }
296
+ tf
297
+ end
298
298
 
299
- def temp_file_name (rt)
300
- '__temp_ipums_hier_' + rt + '.dta'
301
- end
299
+ def temp_file_name(rt)
300
+ '__temp_ipums_hier_' + rt + '.dta'
301
+ end
302
302
 
303
- def label_handle (var)
304
- var.name.downcase + '_lbl'
305
- end
303
+ def label_handle(var)
304
+ var.name.downcase + '_lbl'
305
+ end
306
306
 
307
- def sort_vars
308
- return [ @sort_var_stem ] unless @sfc.rectangularize
309
- return @sfc.record_types.map { |rt| @sort_var_stem + rt }
310
- end
307
+ def sort_vars
308
+ return [@sort_var_stem] unless @sfc.rectangularize
309
+ return @sfc.record_types.map { |rt| @sort_var_stem + rt }
310
+ end
311
311
 
312
- def rt_ne_statement (rt)
313
- rt_var = @sfc.record_type_var
314
- rt_var.name.downcase + ' != ' + val_q(rt_var, val_as_s(rt_var, rt))
315
- end
312
+ def rt_ne_statement(rt)
313
+ rt_var = @sfc.record_type_var
314
+ rt_var.name.downcase + ' != ' + val_q(rt_var, val_as_s(rt_var, rt))
315
+ end
316
316
 
317
- end
317
+ end
318
318
  end