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