stats_package_syntax_file_generator 1.1.3 → 1.1.6

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,168 @@ module SyntaxFile
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 ' (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
194
195
  end
@@ -4,29 +4,32 @@
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
- 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
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
27
30
 
28
- def syntax
29
- r = [
31
+ def syntax
32
+ r = [
30
33
  comments_start,
31
34
  'set more off',
32
35
  blank,
@@ -41,278 +44,275 @@ module SyntaxFile
41
44
  syn_val_labs,
42
45
  blank,
43
46
  comments_end,
44
- ]
45
- r.flatten
46
- end
47
+ ]
48
+ r.flatten
49
+ end
47
50
 
48
- def comments_start
49
- convert_to_comments(super)
50
- end
51
+ def comments_start
52
+ convert_to_comments(super)
53
+ end
51
54
 
52
- def comments_end
53
- convert_to_comments(super)
54
- end
55
+ def comments_end
56
+ convert_to_comments(super)
57
+ end
55
58
 
56
- def convert_to_comments(lines)
57
- return [] if lines.empty?
58
- [
59
+ def convert_to_comments (lines)
60
+ return [] if lines.empty?
61
+ [
59
62
  lines.map { |ln| '* ' + ln },
60
63
  blank,
61
- ].flatten
62
- end
64
+ ].flatten
65
+ end
63
66
 
64
- def syn_df
65
- @sfc.data_structure == 'hier' ? syn_dfh : syn_dfr
66
- end
67
+ def syn_df
68
+ @sfc.data_structure == 'hier' ? syn_dfh : syn_dfr
69
+ end
67
70
 
68
- def syn_dfr
69
- syn_infix(@sfc.variables)
70
- end
71
+ def syn_dfr
72
+ syn_infix(@sfc.variables)
73
+ end
71
74
 
72
- def syn_dfh
73
- r = [
75
+ def syn_dfh
76
+ r = [
74
77
  syn_dfh_infix_blocks,
75
78
  syn_dfh_combine,
76
- ]
77
- r.flatten
78
- end
79
+ ]
80
+ r.flatten
81
+ end
79
82
 
80
- def syn_infix(var_list)
81
- r = [
83
+ def syn_infix (var_list)
84
+ r = [
82
85
  syn_infix_start,
83
86
  syn_infix_var_locs(var_list),
84
87
  syn_infix_end,
85
- ]
86
- r.flatten
87
- end
88
+ ]
89
+ r.flatten
90
+ end
88
91
 
89
- def syn_infix_start
90
- [
92
+ def syn_infix_start
93
+ [
91
94
  'clear',
92
95
  'quietly infix' + sprintf(@infix_format, @cmd_continue),
93
- ]
94
- end
96
+ ]
97
+ end
95
98
 
96
- def syn_infix_var_locs(var_list)
97
- var_list.map { |v|
99
+ def syn_infix_var_locs (var_list)
100
+ var_list.map { |v|
98
101
  sprintf @var_loc_format,
99
- var_fmt(v),
100
- v.name.downcase,
101
- v.column_locations_as_s,
102
- @cmd_continue
103
- }
104
- end
102
+ var_fmt(v),
103
+ v.name.downcase,
104
+ v.column_locations_as_s,
105
+ @cmd_continue
106
+ }
107
+ end
105
108
 
106
- def syn_infix_end
107
- ' using ' + q(@sfc.data_file_name)
108
- end
109
+ def syn_infix_end
110
+ ' using ' + q(@sfc.data_file_name)
111
+ end
109
112
 
110
- def syn_dfh_infix_blocks
111
- r = []
112
- @sfc.record_types.each { |rt|
113
+ def syn_dfh_infix_blocks
114
+ r = []
115
+ @sfc.record_types.each { |rt|
113
116
  var_list = @sfc.get_vars_by_record_type(rt)
114
117
  r.push(
115
- syn_infix(var_list),
116
- syn_dfh_infix_block_end(rt)
118
+ syn_infix(var_list),
119
+ syn_dfh_infix_block_end(rt)
117
120
  ) if var_list.size > 0
118
- }
119
- r.flatten
120
- end
121
+ }
122
+ r.flatten
123
+ end
121
124
 
122
- def syn_dfh_infix_block_end(rt)
123
- r = [
125
+ def syn_dfh_infix_block_end (rt)
126
+ r = [
124
127
  syn_dfh_infix_gen,
125
128
  'drop if ' + rt_ne_statement(rt),
126
129
  'sort ' + sort_vars.join(' '),
127
130
  'save ' + temp_file_name(rt),
128
131
  blank,
129
- ]
130
- r.flatten
131
- end
132
+ ]
133
+ r.flatten
134
+ end
132
135
 
133
- def syn_dfh_infix_gen
134
- return ["gen #{@sort_var_stem} = _n"] unless @sfc.rectangularize
135
- sv = sort_vars()
136
- r = [
136
+ def syn_dfh_infix_gen
137
+ return ["gen #{@sort_var_stem} = _n"] unless @sfc.rectangularize
138
+ sv = sort_vars()
139
+ r = [
137
140
  sv.map { |v| "gen #{v} = _n" },
138
141
  sv.zip(@sfc.record_types).map { |z|
139
- 'replace ' +
140
- z[0] +
141
- ' = ' +
142
- z[0] +
142
+ 'replace ' +
143
+ z[0] +
144
+ ' = ' +
145
+ z[0] +
143
146
  '[_n - 1] if _n > 1 & ' +
144
147
  rt_ne_statement(z[1])
145
148
  }
146
- ]
147
- r.flatten!
148
- end
149
+ ]
150
+ r.flatten!
151
+ end
149
152
 
150
- def syn_dfh_combine
151
- r = [
153
+ def syn_dfh_combine
154
+ r = [
152
155
  'clear',
153
156
  syn_dfh_combine_append,
154
157
  syn_dfh_combine_save,
155
158
  syn_dfh_combine_erase,
156
- ]
157
- r.flatten
158
- end
159
+ ]
160
+ r.flatten
161
+ end
159
162
 
160
- def syn_dfh_combine_append
161
- r = []
162
- tf = temp_file_names()
163
- if @sfc.rectangularize
163
+ def syn_dfh_combine_append
164
+ r = []
165
+ tf = temp_file_names()
166
+ if @sfc.rectangularize
164
167
  sv = sort_vars.reverse
165
168
  tf = tf.reverse
166
169
  sv.shift
167
170
  r.push 'use ' + tf.shift
168
171
  sv.zip(tf).each { |z|
169
- r.push 'merge m:1 ' + z[0] + ' using ' + z[1] + ', keep(master match)'
170
- r.push 'drop _merge'
172
+ r.push 'merge m:1 ' + z[0] + ' using ' + z[1] + ', keep(master match)'
173
+ r.push 'drop _merge'
171
174
  }
172
- else
175
+ else
173
176
  r.push 'use ' + tf.shift
174
177
  tf.each { |t| r.push 'append using ' + t }
175
- end
176
- r
177
178
  end
179
+ r
180
+ end
178
181
 
179
- def syn_dfh_combine_save
180
- [
182
+ def syn_dfh_combine_save
183
+ [
181
184
  'sort ' + sort_vars.join(' '),
182
185
  'drop ' + sort_vars.join(' '),
183
- ]
184
- end
186
+ ]
187
+ end
185
188
 
186
- def syn_dfh_combine_erase
187
- temp_file_names.map { |t| 'erase ' + t }
188
- end
189
+ def syn_dfh_combine_erase
190
+ temp_file_names.map { |t| 'erase ' + t }
191
+ end
189
192
 
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|
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|
194
197
  v = var.name.downcase
195
198
  sprintf @replace_format, v, v, 10 ** var.implied_decimals
196
- }
197
- end
199
+ }
200
+ end
198
201
 
199
- def syn_display_format
200
- var_list = @sfc.variables.find_all { |var|
202
+ def syn_display_format
203
+ var_list = @sfc.variables.find_all { |var|
201
204
  vf = var_fmt(var)
202
205
  vf == 'double' or vf == 'float'
203
- }
204
- return [] if var_list.empty?
205
- var_list.map { |var|
206
+ }
207
+ return [] if var_list.empty?
208
+ var_list.map { |var|
206
209
  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
207
228
 
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|
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|
222
233
  sprintf @var_lab_format,
223
- var.name.downcase,
224
- q(label_trunc(var.label, @var_label_max_leng))
225
- }
226
- end
234
+ var.name.downcase,
235
+ q( label_trunc(var.label, @var_label_max_leng) )
236
+ }
237
+ end
227
238
 
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,
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),
236
245
  "label values " + var.name.downcase + ' ' + label_handle(var),
237
246
  blank,
238
- ]
239
- else
240
- []
241
- end
242
- }
243
- r.flatten
244
- end
245
-
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
247
+ ]
248
+ }
249
+ r.flatten
250
+ end
255
251
 
256
- value_format = "label define %s %-#{m}s %s%s"
257
- add_cmd = ''
258
- r = []
259
- val_list.each { |val|
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|
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
274
-
275
- def q(s)
276
- '`"' + s.to_s + '"\''
277
- end
271
+ }
272
+ r.flatten
273
+ end
278
274
 
279
- def var_fmt(var)
275
+ def q (s)
276
+ '`"' + s.to_s + '"\''
277
+ end
280
278
 
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
279
+ def var_fmt (var)
286
280
 
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