@@ -12,6 +12,7 @@ module Cask
12
12
#
13
13
# @api internal
14
14
class Config
15
+ ConfigHash = T . type_alias { T ::Hash [ Symbol , T . any ( LazyObject , String , Pathname , T ::Array [ String ] ) ] }
15
16
DEFAULT_DIRS = T . let (
16
17
{
17
18
appdir : "/Applications" ,
@@ -33,7 +34,8 @@ class Config
33
34
T ::Hash [ Symbol , String ] ,
34
35
)
35
36
36
- sig { returns ( T ::Hash [ Symbol , String ] ) }
37
+ # runtime recursive evaluation forces the LazyObject to be evaluated
38
+ T ::Sig ::WithoutRuntime . sig { returns ( T ::Hash [ Symbol , T . any ( LazyObject , String ) ] ) }
37
39
def self . defaults
38
40
{
39
41
languages : LazyObject . new { ::OS ::Mac . languages } ,
@@ -67,69 +69,59 @@ def self.from_args(args)
67
69
68
70
sig { params ( json : String , ignore_invalid_keys : T ::Boolean ) . returns ( T . attached_class ) }
69
71
def self . from_json ( json , ignore_invalid_keys : false )
70
- config = JSON . parse ( json )
72
+ config = JSON . parse ( json , symbolize_names : true )
71
73
72
74
new (
73
- default : config . fetch ( " default" , { } ) ,
74
- env : config . fetch ( " env" , { } ) ,
75
- explicit : config . fetch ( " explicit" , { } ) ,
75
+ default : config . fetch ( : default, { } ) ,
76
+ env : config . fetch ( : env, { } ) ,
77
+ explicit : config . fetch ( : explicit, { } ) ,
76
78
ignore_invalid_keys :,
77
79
)
78
80
end
79
81
80
- sig {
81
- params (
82
- config : T ::Enumerable [
83
- [ T . any ( String , Symbol ) , T . any ( String , Pathname , T ::Array [ String ] ) ] ,
84
- ] ,
85
- ) . returns (
86
- T ::Hash [ Symbol , T . any ( String , Pathname , T ::Array [ String ] ) ] ,
87
- )
88
- }
82
+ sig { params ( config : ConfigHash ) . returns ( ConfigHash ) }
89
83
def self . canonicalize ( config )
90
84
config . to_h do |k , v |
91
- key = k . to_sym
92
-
93
- if DEFAULT_DIRS . key? ( key )
85
+ if DEFAULT_DIRS . key? ( k )
94
86
raise TypeError , "Invalid path for default dir #{ k } : #{ v . inspect } " if v . is_a? ( Array )
95
87
96
- [ key , Pathname ( v ) . expand_path ]
88
+ [ k , Pathname ( v . to_s ) . expand_path ]
97
89
else
98
- [ key , v ]
90
+ [ k , v ]
99
91
end
100
92
end
101
93
end
102
94
103
95
# Get the explicit configuration.
104
96
#
105
97
# @api internal
106
- sig { returns ( T :: Hash [ Symbol , T . any ( String , Pathname , T :: Array [ String ] ) ] ) }
98
+ sig { returns ( ConfigHash ) }
107
99
attr_accessor :explicit
108
100
109
101
sig {
110
102
params (
111
- default : T . nilable ( T :: Hash [ Symbol , T . any ( String , Pathname , T :: Array [ String ] ) ] ) ,
112
- env : T . nilable ( T :: Hash [ Symbol , T . any ( String , Pathname , T :: Array [ String ] ) ] ) ,
113
- explicit : T :: Hash [ Symbol , T . any ( String , Pathname , T :: Array [ String ] ) ] ,
103
+ default : T . nilable ( ConfigHash ) ,
104
+ env : T . nilable ( ConfigHash ) ,
105
+ explicit : ConfigHash ,
114
106
ignore_invalid_keys : T ::Boolean ,
115
107
) . void
116
108
}
117
109
def initialize ( default : nil , env : nil , explicit : { } , ignore_invalid_keys : false )
118
110
if default
119
111
@default = T . let (
120
112
self . class . canonicalize ( self . class . defaults . merge ( default ) ) ,
121
- T . nilable ( T :: Hash [ Symbol , T . any ( String , Pathname , T :: Array [ String ] ) ] ) ,
113
+ T . nilable ( ConfigHash ) ,
122
114
)
123
115
end
124
116
if env
125
117
@env = T . let (
126
118
self . class . canonicalize ( env ) ,
127
- T . nilable ( T :: Hash [ Symbol , T . any ( String , Pathname , T :: Array [ String ] ) ] ) ,
119
+ T . nilable ( ConfigHash ) ,
128
120
)
129
121
end
130
122
@explicit = T . let (
131
123
self . class . canonicalize ( explicit ) ,
132
- T :: Hash [ Symbol , T . any ( String , Pathname , T :: Array [ String ] ) ] ,
124
+ ConfigHash ,
133
125
)
134
126
135
127
if ignore_invalid_keys
@@ -142,26 +134,26 @@ def initialize(default: nil, env: nil, explicit: {}, ignore_invalid_keys: false)
142
134
@explicit . assert_valid_keys ( *self . class . defaults . keys )
143
135
end
144
136
145
- sig { returns ( T :: Hash [ Symbol , T . any ( String , Pathname , T :: Array [ String ] ) ] ) }
137
+ sig { returns ( ConfigHash ) }
146
138
def default
147
139
@default ||= self . class . canonicalize ( self . class . defaults )
148
140
end
149
141
150
- sig { returns ( T :: Hash [ Symbol , T . any ( String , Pathname , T :: Array [ String ] ) ] ) }
142
+ sig { returns ( ConfigHash ) }
151
143
def env
152
144
@env ||= self . class . canonicalize (
153
145
Homebrew ::EnvConfig . cask_opts
154
146
. select { |arg | arg . include? ( "=" ) }
155
147
. map { |arg | T . cast ( arg . split ( "=" , 2 ) , [ String , String ] ) }
156
- . map do |( flag , value ) |
148
+ . to_h do |( flag , value ) |
157
149
key = flag . sub ( /^--/ , "" )
158
150
# converts --language flag to :languages config key
159
151
if key == "language"
160
152
key = "languages"
161
153
value = value . split ( "," )
162
154
end
163
155
164
- [ key , value ]
156
+ [ key . to_sym , value ]
165
157
end ,
166
158
)
167
159
end
0 commit comments