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.
- checksums.yaml +4 -4
- data/lib/syntax_file/controller.rb +221 -213
- data/lib/syntax_file/maker.rb +96 -91
- data/lib/syntax_file/maker_rddi.rb +55 -55
- data/lib/syntax_file/maker_sas.rb +205 -204
- data/lib/syntax_file/maker_spss.rb +144 -143
- data/lib/syntax_file/maker_stata.rb +211 -211
- data/lib/syntax_file/maker_sts.rb +120 -120
- data/lib/syntax_file/value.rb +16 -15
- data/lib/syntax_file/variable.rb +41 -40
- data/tests/setup.rb +8 -8
- data/tests/tc_maker.rb +1 -1
- data/tests/tc_maker_stata.rb +1 -1
- metadata +13 -12
@@ -4,171 +4,171 @@
|
|
4
4
|
# https://github.com/mnpopcenter/stats_package_syntax_file_generator
|
5
5
|
|
6
6
|
module SyntaxFile
|
7
|
-
|
7
|
+
class MakerSTS < Maker
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
def initialize (sfc, syntax_type)
|
10
|
+
super
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
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
|
-
|
20
|
-
|
19
|
+
def syntax
|
20
|
+
r = [
|
21
21
|
syn_df,
|
22
22
|
syn_var_labs,
|
23
23
|
syn_val_labs,
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
]
|
25
|
+
r.flatten
|
26
|
+
end
|
27
27
|
|
28
|
-
|
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
|
-
|
33
|
+
].flatten
|
34
|
+
end
|
35
35
|
|
36
|
-
|
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
|
-
|
41
|
+
]
|
42
|
+
r.flatten
|
43
|
+
end
|
44
44
|
|
45
|
-
|
46
|
-
|
47
|
-
|
45
|
+
def syn_df_start
|
46
|
+
['FORMAT fixed', '', (@sfc.data_structure == 'hier') ? hier_fyi : '']
|
47
|
+
end
|
48
48
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
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
|
-
|
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
|
-
|
60
|
+
]
|
61
|
+
r.flatten
|
62
|
+
end
|
63
63
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
64
|
+
def var_val_lbl_id (var)
|
65
|
+
return '' unless @vars_with_values.include?(var)
|
66
|
+
'\\' + var.name
|
67
|
+
end
|
68
68
|
|
69
|
-
|
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
|
-
|
77
|
+
]
|
78
|
+
r.flatten
|
79
|
+
end
|
80
80
|
|
81
|
-
|
82
|
-
|
83
|
-
|
81
|
+
def syn_var_lab_for_var (var)
|
82
|
+
sprintf @var_lab_format, var.name, esc(q(var.label))
|
83
|
+
end
|
84
84
|
|
85
|
-
|
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
|
-
|
95
|
-
|
96
|
-
def syn_val_labs_for_var_list(var_list)
|
97
|
-
var_list.map { |var| syn_val_labs_for_var(var) }
|
98
|
-
end
|
92
|
+
]
|
93
|
+
r.flatten
|
94
|
+
end
|
99
95
|
|
100
|
-
|
101
|
-
|
102
|
-
|
96
|
+
def syn_val_labs_for_var_list (var_list)
|
97
|
+
var_list.map { |var| syn_val_labs_for_var(var) }
|
98
|
+
end
|
103
99
|
|
104
|
-
|
105
|
-
|
106
|
-
|
100
|
+
def syn_val_labs_for_var (var)
|
101
|
+
val_list = labelable_values(var)
|
102
|
+
return [] if val_list.empty?
|
103
|
+
|
104
|
+
m = max_value_length(var, val_list.select {|x| supported_val?(x)})
|
105
|
+
value_format = " %-#{m}s %s"
|
106
|
+
r = [
|
107
107
|
syn_val_labs_for_var_start(var),
|
108
|
-
val_list.reject
|
109
|
-
|
110
|
-
|
111
|
-
|
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
|
112
112
|
|
113
|
-
|
114
|
-
|
115
|
-
|
113
|
+
def syn_val_labs_for_var_start (var)
|
114
|
+
' \\' + var.name
|
115
|
+
end
|
116
116
|
|
117
|
-
|
118
|
-
|
119
|
-
|
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
|
120
120
|
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
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
|
125
125
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
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
|
130
130
|
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
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
|
136
136
|
|
137
|
-
|
138
|
-
|
139
|
-
|
137
|
+
def q (s)
|
138
|
+
'"' + s.to_s.gsub('"', '\'\'') + '"'
|
139
|
+
end
|
140
140
|
|
141
|
-
|
142
|
-
|
143
|
-
|
141
|
+
def esc (s)
|
142
|
+
s.gsub(/\n/, " [New line.] ")
|
143
|
+
end
|
144
144
|
|
145
|
-
|
146
|
-
|
147
|
-
|
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|
|
148
148
|
sts_supported_values(var).size > 0
|
149
|
-
end
|
150
149
|
end
|
150
|
+
end
|
151
151
|
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
152
|
+
def sts_supported_values(var)
|
153
|
+
return [] if (var.nil? || var.values.nil?)
|
154
|
+
var.values.select { |val| supported_val?(val) }
|
155
|
+
end
|
156
156
|
|
157
|
-
|
158
|
-
|
159
|
-
|
157
|
+
def supported_val?(val)
|
158
|
+
supported_val_label?(val) && supported_val_value?(val)
|
159
|
+
end
|
160
160
|
|
161
|
-
|
162
|
-
|
163
|
-
|
161
|
+
def supported_val_label?(val)
|
162
|
+
!(val.nil?) && !(val.label.nil?) && !(val.label.strip.empty?)
|
163
|
+
end
|
164
164
|
|
165
|
-
|
166
|
-
|
167
|
-
|
165
|
+
def supported_val_value?(val)
|
166
|
+
!(val.nil?) && !(val.value.nil?) && !!(val.value.to_s =~ /^[A-Za-z0-9\-\_\.]+$/)
|
167
|
+
end
|
168
168
|
|
169
|
-
|
170
|
-
|
171
|
-
|
169
|
+
def supported_var_label?(var)
|
170
|
+
!(var.nil?) && !(var.label.nil?) && !(var.label.strip.empty?)
|
171
|
+
end
|
172
172
|
|
173
|
-
|
173
|
+
end
|
174
174
|
end
|
data/lib/syntax_file/value.rb
CHANGED
@@ -4,25 +4,26 @@
|
|
4
4
|
# https://github.com/mnpopcenter/stats_package_syntax_file_generator
|
5
5
|
|
6
6
|
module SyntaxFile
|
7
|
-
|
7
|
+
class Value
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
9
|
+
ATTR = {
|
10
|
+
:value => { :req => true, :rw => 'rw', :def => nil },
|
11
|
+
:label => { :req => false, :rw => 'rw', :def => '' },
|
12
|
+
}
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
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
|
-
|
20
|
-
|
21
|
-
raise(ArgumentError, "Missing required parameter: '#{k}'.") if
|
19
|
+
def initialize (args = {})
|
20
|
+
ATTR.each_key { |k|
|
21
|
+
raise(ArgumentError, "Missing required parameter: '#{k}'.") if
|
22
|
+
ATTR[k][:req] and not args.has_key?(k)
|
22
23
|
v = args.has_key?(k) ? args[k] : ATTR[k][:def]
|
23
24
|
instance_variable_set("@#{k}".to_sym, v)
|
24
|
-
|
25
|
-
|
25
|
+
}
|
26
|
+
end
|
26
27
|
|
27
|
-
|
28
|
+
end
|
28
29
|
end
|
data/lib/syntax_file/variable.rb
CHANGED
@@ -4,52 +4,53 @@
|
|
4
4
|
# https://github.com/mnpopcenter/stats_package_syntax_file_generator
|
5
5
|
|
6
6
|
module SyntaxFile
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
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
|
-
|
29
|
-
|
30
|
-
raise(ArgumentError, "Missing required parameter: '#{k}'.") if
|
28
|
+
def initialize (args = {})
|
29
|
+
ATTR.each_key { |k|
|
30
|
+
raise(ArgumentError, "Missing required parameter: '#{k}'.") if
|
31
|
+
ATTR[k][:req] and not args.has_key?(k)
|
31
32
|
v = args.has_key?(k) ? args[k] : ATTR[k][:def]
|
32
33
|
instance_variable_set("@#{k}".to_sym, v)
|
33
|
-
|
34
|
-
|
35
|
-
|
34
|
+
}
|
35
|
+
@values = [] if @values.nil?
|
36
|
+
end
|
36
37
|
|
37
|
-
|
38
|
-
|
39
|
-
|
38
|
+
def column_locations_as_s
|
39
|
+
@start_column.to_s + '-' + end_column.to_s
|
40
|
+
end
|
40
41
|
|
41
|
-
|
42
|
-
|
43
|
-
|
42
|
+
def end_column
|
43
|
+
@start_column + @width - 1
|
44
|
+
end
|
44
45
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
46
|
+
def add_value (args)
|
47
|
+
@values.push Value.new(args)
|
48
|
+
@values[-1]
|
49
|
+
end
|
49
50
|
|
50
|
-
|
51
|
-
|
52
|
-
|
51
|
+
def clear_values
|
52
|
+
@values = []
|
53
|
+
end
|
53
54
|
|
54
|
-
|
55
|
+
end
|
55
56
|
end
|
data/tests/setup.rb
CHANGED
@@ -31,7 +31,7 @@ def new_value
|
|
31
31
|
SyntaxFile::Value.new params_value()
|
32
32
|
end
|
33
33
|
|
34
|
-
def new_maker(syntax_type = '')
|
34
|
+
def new_maker (syntax_type = '')
|
35
35
|
maker_class = 'SyntaxFile::Maker' + syntax_type.upcase
|
36
36
|
eval(maker_class).new(new_controller, syntax_type)
|
37
37
|
end
|
@@ -57,7 +57,7 @@ def params_variable
|
|
57
57
|
}
|
58
58
|
end
|
59
59
|
|
60
|
-
def params_value(val = 99, lab = 'bar')
|
60
|
+
def params_value (val = 99, lab = 'bar')
|
61
61
|
{
|
62
62
|
:value => val,
|
63
63
|
:label => 'Test value: ' + lab,
|
@@ -70,30 +70,30 @@ def params_values
|
|
70
70
|
[0,1,2,9,9999].map { |v| params_value(v, 'bar' + v.to_s) }
|
71
71
|
end
|
72
72
|
|
73
|
-
def add_new_values_to_var(var)
|
73
|
+
def add_new_values_to_var (var)
|
74
74
|
params_values.each { |pv| var.add_value(pv) }
|
75
75
|
end
|
76
76
|
|
77
77
|
# Helper functions.
|
78
78
|
|
79
|
-
def params_variable_lookup(k)
|
79
|
+
def params_variable_lookup (k)
|
80
80
|
params_variable[k]
|
81
81
|
end
|
82
82
|
|
83
|
-
def vars_to_names(var_list)
|
83
|
+
def vars_to_names (var_list)
|
84
84
|
return nil if var_list.nil?
|
85
85
|
var_list.map { |v| v.name }
|
86
86
|
end
|
87
87
|
|
88
|
-
def names_to_vars(sfc, var_list)
|
88
|
+
def names_to_vars (sfc, var_list)
|
89
89
|
var_list.map { |nm| sfc.get_var_by_name(nm) }
|
90
90
|
end
|
91
91
|
|
92
|
-
def dir_contents(dir_name)
|
92
|
+
def dir_contents (dir_name)
|
93
93
|
Dir.entries(dir_name).sort.reject { |f| f[0,1] == '.' }
|
94
94
|
end
|
95
95
|
|
96
|
-
def remove_file_from_dir(d, files)
|
96
|
+
def remove_file_from_dir (d, files)
|
97
97
|
files.each do |f|
|
98
98
|
full_path = File.join(d, f)
|
99
99
|
File.delete(full_path) if File.file?(full_path)
|