stats_package_syntax_file_generator 1.0.4 → 1.1.3
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 +5 -5
- data/README +2 -1
- data/lib/stats_package_syntax_file_generator.rb +1 -0
- data/lib/syntax_file/controller.rb +214 -220
- data/lib/syntax_file/maker.rb +92 -92
- data/lib/syntax_file/maker_rddi.rb +55 -0
- data/lib/syntax_file/maker_sas.rb +204 -205
- data/lib/syntax_file/maker_spss.rb +143 -143
- data/lib/syntax_file/maker_stata.rb +211 -192
- data/lib/syntax_file/maker_sts.rb +120 -127
- data/lib/syntax_file/value.rb +15 -16
- data/lib/syntax_file/variable.rb +40 -41
- data/tests/input_all_vars.yaml +1 -1
- data/tests/input_controller.yaml +1 -1
- data/tests/setup.rb +8 -8
- data/tests/tc_controller.rb +1 -1
- data/tests/tc_maker.rb +1 -1
- data/tests/tc_maker_rddi.rb +33 -0
- data/tests/tc_maker_stata.rb +1 -1
- data/tests/tc_maker_sts.rb +0 -1
- data/tests/ts_all.rb +1 -0
- metadata +5 -4
@@ -4,178 +4,171 @@
|
|
4
4
|
# https://github.com/mnpopcenter/stats_package_syntax_file_generator
|
5
5
|
|
6
6
|
module SyntaxFile
|
7
|
-
class MakerSTS < Maker
|
7
|
+
class MakerSTS < Maker
|
8
8
|
|
9
|
-
def initialize
|
10
|
-
|
9
|
+
def initialize(sfc, syntax_type)
|
10
|
+
super
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
end
|
12
|
+
m = @sfc.max_var_name_length
|
13
|
+
@var_lab_format = " %-#{m}s %s"
|
14
|
+
@var_loc_format = " %-#{m}s %s %s"
|
15
|
+
|
16
|
+
@vars_with_values = get_vars_with_sts_supported_values # cache
|
17
|
+
end
|
18
18
|
|
19
|
-
def syntax
|
20
|
-
|
19
|
+
def syntax
|
20
|
+
r = [
|
21
21
|
syn_df,
|
22
22
|
syn_var_labs,
|
23
23
|
syn_val_labs,
|
24
|
-
|
25
|
-
|
26
|
-
end
|
24
|
+
]
|
25
|
+
r.flatten
|
26
|
+
end
|
27
27
|
|
28
|
-
def convert_to_comments
|
29
|
-
|
30
|
-
|
28
|
+
def convert_to_comments(lines)
|
29
|
+
return [] if lines.empty?
|
30
|
+
[
|
31
31
|
lines.map { |ln| '// ' + ln },
|
32
32
|
blank,
|
33
|
-
|
34
|
-
end
|
33
|
+
].flatten
|
34
|
+
end
|
35
35
|
|
36
|
-
def syn_df
|
37
|
-
|
36
|
+
def syn_df
|
37
|
+
r = [
|
38
38
|
syn_df_start,
|
39
39
|
syn_var_locations(@sfc.variables),
|
40
40
|
syntax_end,
|
41
|
-
|
42
|
-
|
43
|
-
end
|
41
|
+
]
|
42
|
+
r.flatten
|
43
|
+
end
|
44
44
|
|
45
|
-
def syn_df_start
|
46
|
-
|
47
|
-
end
|
45
|
+
def syn_df_start
|
46
|
+
['FORMAT fixed', '', (@sfc.data_structure == 'hier') ? hier_fyi : '']
|
47
|
+
end
|
48
48
|
|
49
|
-
def hier_fyi
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
end
|
49
|
+
def hier_fyi
|
50
|
+
convert_to_comments(['',
|
51
|
+
'Hierarchical data structures are not directly supported by Stat/Transfer.',
|
52
|
+
'Please see the README for the stats_package_syntax_file_generator gem for more information.', ''
|
53
|
+
])
|
54
|
+
end
|
55
55
|
|
56
|
-
def syn_var_locations
|
57
|
-
|
56
|
+
def syn_var_locations(var_list)
|
57
|
+
r = [
|
58
58
|
'VARIABLES',
|
59
59
|
var_list.map { |v| sprintf @var_loc_format, v.name, var_loc_with_fmt(v), var_val_lbl_id(v) }
|
60
|
-
|
61
|
-
|
62
|
-
end
|
60
|
+
]
|
61
|
+
r.flatten
|
62
|
+
end
|
63
63
|
|
64
|
-
def var_val_lbl_id
|
65
|
-
|
66
|
-
|
67
|
-
end
|
64
|
+
def var_val_lbl_id(var)
|
65
|
+
return '' unless @vars_with_values.include?(var)
|
66
|
+
'\\' + var.name
|
67
|
+
end
|
68
68
|
|
69
|
-
def syn_var_labs
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
69
|
+
def syn_var_labs(var_list = [])
|
70
|
+
var_list = @sfc.get_vars_with_var_labels if var_list.empty?
|
71
|
+
var_list = var_list.reject { |var| !supported_var_label?(var) }
|
72
|
+
return [] if var_list.empty?
|
73
|
+
r = [
|
74
74
|
'VARIABLE LABELS',
|
75
75
|
var_list.map { |var| syn_var_lab_for_var(var) },
|
76
76
|
syntax_end,
|
77
|
-
|
78
|
-
|
79
|
-
end
|
77
|
+
]
|
78
|
+
r.flatten
|
79
|
+
end
|
80
80
|
|
81
|
-
def syn_var_lab_for_var
|
82
|
-
|
83
|
-
end
|
81
|
+
def syn_var_lab_for_var(var)
|
82
|
+
sprintf @var_lab_format, var.name, esc(q(var.label))
|
83
|
+
end
|
84
84
|
|
85
|
-
def syn_val_labs
|
86
|
-
|
87
|
-
|
88
|
-
|
85
|
+
def syn_val_labs
|
86
|
+
var_list = @vars_with_values
|
87
|
+
return [] if var_list.empty?
|
88
|
+
r = [
|
89
89
|
'VALUE LABELS',
|
90
90
|
syn_val_labs_for_var_list(var_list),
|
91
91
|
syntax_end,
|
92
|
-
|
93
|
-
|
94
|
-
end
|
92
|
+
]
|
93
|
+
r.flatten
|
94
|
+
end
|
95
95
|
|
96
|
-
def syn_val_labs_for_var_list
|
97
|
-
|
98
|
-
end
|
96
|
+
def syn_val_labs_for_var_list(var_list)
|
97
|
+
var_list.map { |var| syn_val_labs_for_var(var) }
|
98
|
+
end
|
99
99
|
|
100
|
-
def syn_val_labs_for_var
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
m = max_value_length(var, val_list.select {|x| supported_val?(x)})
|
105
|
-
value_format = " %-#{m}s %s"
|
106
|
-
r = [
|
107
|
-
syn_val_labs_for_var_start(var),
|
108
|
-
val_list.map { |val| syn_val_lab_for_val(var, val, value_format) }
|
109
|
-
]
|
110
|
-
r.flatten
|
111
|
-
end
|
100
|
+
def syn_val_labs_for_var(var)
|
101
|
+
val_list = labelable_values(var)
|
102
|
+
return [] if val_list.empty?
|
112
103
|
|
113
|
-
|
114
|
-
|
115
|
-
|
104
|
+
m = max_value_length(var, val_list.select { |x| supported_val?(x) })
|
105
|
+
value_format = " %-#{m}s %s"
|
106
|
+
r = [
|
107
|
+
syn_val_labs_for_var_start(var),
|
108
|
+
val_list.reject { |val| !supported_val?(val) }.map { |val| syn_val_lab_for_val(var, val, value_format) }
|
109
|
+
]
|
110
|
+
r.flatten
|
111
|
+
end
|
116
112
|
|
117
|
-
def
|
118
|
-
|
119
|
-
|
120
|
-
end
|
113
|
+
def syn_val_labs_for_var_start(var)
|
114
|
+
' \\' + var.name
|
115
|
+
end
|
121
116
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
end
|
117
|
+
def syn_val_lab_for_val(var, val, fmt)
|
118
|
+
sprintf fmt, sts_val_q(var, val_as_s(var, val.value.to_s)), esc(q(val.label))
|
119
|
+
end
|
126
120
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
end
|
121
|
+
# value codes (aka value values) need to be quoted with single quotes if they are strings
|
122
|
+
def sts_val_q(var, v)
|
123
|
+
var.is_string_var ? "'#{v}'" : v.to_s
|
124
|
+
end
|
131
125
|
|
132
|
-
def
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
end
|
126
|
+
def var_loc_with_fmt(var)
|
127
|
+
return var.column_locations_as_s + var_fmt(var) unless var.implied_decimals > 0
|
128
|
+
var.start_column.to_s + var_fmt(var)
|
129
|
+
end
|
137
130
|
|
138
|
-
def
|
139
|
-
|
140
|
-
|
131
|
+
def var_fmt(var)
|
132
|
+
return ' (A)' if var.is_string_var
|
133
|
+
return '' unless var.implied_decimals > 0
|
134
|
+
' (F' + var.width.to_s + '.' + var.implied_decimals.to_s + ')'
|
135
|
+
end
|
141
136
|
|
142
|
-
def
|
143
|
-
|
144
|
-
end
|
137
|
+
def q(s)
|
138
|
+
'"' + s.to_s.gsub('"', '\'\'') + '"'
|
139
|
+
end
|
145
140
|
|
146
|
-
def
|
147
|
-
|
148
|
-
|
149
|
-
"// Skipping"
|
150
|
-
end
|
141
|
+
def esc(s)
|
142
|
+
s.gsub(/\n/, " [New line.] ")
|
143
|
+
end
|
151
144
|
|
152
|
-
# Stat/Transfer does not like blank value labels
|
153
|
-
def get_vars_with_sts_supported_values()
|
154
|
-
|
145
|
+
# Stat/Transfer does not like blank value labels
|
146
|
+
def get_vars_with_sts_supported_values()
|
147
|
+
@sfc.get_vars_with_values.select do |var|
|
155
148
|
sts_supported_values(var).size > 0
|
149
|
+
end
|
156
150
|
end
|
157
|
-
end
|
158
151
|
|
159
|
-
def sts_supported_values(var)
|
160
|
-
|
161
|
-
|
162
|
-
end
|
152
|
+
def sts_supported_values(var)
|
153
|
+
return [] if (var.nil? || var.values.nil?)
|
154
|
+
var.values.select { |val| supported_val?(val) }
|
155
|
+
end
|
163
156
|
|
164
|
-
def supported_val?(val)
|
165
|
-
|
166
|
-
end
|
157
|
+
def supported_val?(val)
|
158
|
+
supported_val_label?(val) && supported_val_value?(val)
|
159
|
+
end
|
167
160
|
|
168
|
-
def supported_val_label?(val)
|
169
|
-
|
170
|
-
end
|
161
|
+
def supported_val_label?(val)
|
162
|
+
!(val.nil?) && !(val.label.nil?) && !(val.label.strip.empty?)
|
163
|
+
end
|
171
164
|
|
172
|
-
def supported_val_value?(val)
|
173
|
-
|
174
|
-
end
|
165
|
+
def supported_val_value?(val)
|
166
|
+
!(val.nil?) && !(val.value.nil?) && !!(val.value.to_s =~ /^[A-Za-z0-9\-\_\.]+$/)
|
167
|
+
end
|
175
168
|
|
176
|
-
def supported_var_label?(var)
|
177
|
-
|
178
|
-
end
|
169
|
+
def supported_var_label?(var)
|
170
|
+
!(var.nil?) && !(var.label.nil?) && !(var.label.strip.empty?)
|
171
|
+
end
|
179
172
|
|
180
|
-
end
|
173
|
+
end
|
181
174
|
end
|
data/lib/syntax_file/value.rb
CHANGED
@@ -4,26 +4,25 @@
|
|
4
4
|
# https://github.com/mnpopcenter/stats_package_syntax_file_generator
|
5
5
|
|
6
6
|
module SyntaxFile
|
7
|
-
class Value
|
7
|
+
class Value
|
8
8
|
|
9
|
-
ATTR = {
|
10
|
-
|
11
|
-
|
12
|
-
}
|
9
|
+
ATTR = {
|
10
|
+
:value => { :req => true, :rw => 'rw', :def => nil },
|
11
|
+
:label => { :req => false, :rw => 'rw', :def => '' },
|
12
|
+
}
|
13
13
|
|
14
|
-
ATTR.each_key do |k|
|
15
|
-
|
16
|
-
|
17
|
-
end
|
14
|
+
ATTR.each_key do |k|
|
15
|
+
attr_reader k if ATTR[k][:rw].include? 'r'
|
16
|
+
attr_writer k if ATTR[k][:rw].include? 'w'
|
17
|
+
end
|
18
18
|
|
19
|
-
def initialize
|
20
|
-
|
21
|
-
raise(ArgumentError, "Missing required parameter: '#{k}'.") if
|
22
|
-
ATTR[k][:req] and not args.has_key?(k)
|
19
|
+
def initialize(args = {})
|
20
|
+
ATTR.each_key { |k|
|
21
|
+
raise(ArgumentError, "Missing required parameter: '#{k}'.") if ATTR[k][:req] and not args.has_key?(k)
|
23
22
|
v = args.has_key?(k) ? args[k] : ATTR[k][:def]
|
24
23
|
instance_variable_set("@#{k}".to_sym, v)
|
25
|
-
|
26
|
-
end
|
24
|
+
}
|
25
|
+
end
|
27
26
|
|
28
|
-
end
|
27
|
+
end
|
29
28
|
end
|
data/lib/syntax_file/variable.rb
CHANGED
@@ -4,53 +4,52 @@
|
|
4
4
|
# https://github.com/mnpopcenter/stats_package_syntax_file_generator
|
5
5
|
|
6
6
|
module SyntaxFile
|
7
|
-
class Variable
|
8
|
-
|
9
|
-
ATTR = {
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
}
|
22
|
-
|
23
|
-
ATTR.each_key do |k|
|
24
|
-
|
25
|
-
|
26
|
-
end
|
7
|
+
class Variable
|
8
|
+
|
9
|
+
ATTR = {
|
10
|
+
:name => { :req => true, :rw => 'rw', :def => '' },
|
11
|
+
:label => { :req => false, :rw => 'rw', :def => '' },
|
12
|
+
:start_column => { :req => true, :rw => 'rw', :def => nil },
|
13
|
+
:width => { :req => true, :rw => 'rw', :def => nil },
|
14
|
+
:is_string_var => { :req => false, :rw => 'rw', :def => false },
|
15
|
+
:is_double_var => { :req => false, :rw => 'rw', :def => false },
|
16
|
+
:is_common_var => { :req => false, :rw => 'rw', :def => false },
|
17
|
+
:record_type => { :req => false, :rw => 'rw', :def => '' },
|
18
|
+
:implied_decimals => { :req => false, :rw => 'rw', :def => 0 },
|
19
|
+
:suppress_labels => { :req => false, :rw => 'rw', :def => false },
|
20
|
+
:values => { :req => false, :rw => 'r', :def => nil },
|
21
|
+
}
|
22
|
+
|
23
|
+
ATTR.each_key do |k|
|
24
|
+
attr_reader k if ATTR[k][:rw].include? 'r'
|
25
|
+
attr_writer k if ATTR[k][:rw].include? 'w'
|
26
|
+
end
|
27
27
|
|
28
|
-
def initialize
|
29
|
-
|
30
|
-
raise(ArgumentError, "Missing required parameter: '#{k}'.") if
|
31
|
-
ATTR[k][:req] and not args.has_key?(k)
|
28
|
+
def initialize(args = {})
|
29
|
+
ATTR.each_key { |k|
|
30
|
+
raise(ArgumentError, "Missing required parameter: '#{k}'.") if ATTR[k][:req] and not args.has_key?(k)
|
32
31
|
v = args.has_key?(k) ? args[k] : ATTR[k][:def]
|
33
32
|
instance_variable_set("@#{k}".to_sym, v)
|
34
|
-
|
35
|
-
|
36
|
-
end
|
33
|
+
}
|
34
|
+
@values = [] if @values.nil?
|
35
|
+
end
|
37
36
|
|
38
|
-
def column_locations_as_s
|
39
|
-
|
40
|
-
end
|
37
|
+
def column_locations_as_s
|
38
|
+
@start_column.to_s + '-' + end_column.to_s
|
39
|
+
end
|
41
40
|
|
42
|
-
def end_column
|
43
|
-
|
44
|
-
end
|
41
|
+
def end_column
|
42
|
+
@start_column + @width - 1
|
43
|
+
end
|
45
44
|
|
46
|
-
def add_value
|
47
|
-
|
48
|
-
|
49
|
-
end
|
45
|
+
def add_value(args)
|
46
|
+
@values.push Value.new(args)
|
47
|
+
@values[-1]
|
48
|
+
end
|
50
49
|
|
51
|
-
def clear_values
|
52
|
-
|
53
|
-
end
|
50
|
+
def clear_values
|
51
|
+
@values = []
|
52
|
+
end
|
54
53
|
|
55
|
-
end
|
54
|
+
end
|
56
55
|
end
|
data/tests/input_all_vars.yaml
CHANGED
data/tests/input_controller.yaml
CHANGED