@@ -107,45 +107,50 @@ defmodule Mix.Tasks.Compile.App do
107
107
def run ( args ) do
108
108
{ opts , _ , _ } = OptionParser . parse ( args , switches: [ force: :boolean ] )
109
109
110
- project = Mix.Project . get!
111
- config = Mix.Project . config
110
+ project = Mix.Project . get! ( )
111
+ config = Mix.Project . config ( )
112
112
113
- app = Keyword . get ( config , :app )
113
+ app = Keyword . get ( config , :app )
114
114
version = Keyword . get ( config , :version )
115
115
116
116
validate_app ( app )
117
117
validate_version ( version )
118
118
119
- path = Mix.Project . compile_path
120
- mods = modules_from ( Path . wildcard ( "#{ path } /*.beam" ) ) |> Enum . sort
119
+ path = Mix.Project . compile_path ( )
120
+ mods = modules_from ( Path . wildcard ( "#{ path } /*.beam" ) ) |> Enum . sort ( )
121
121
122
- target = Path . join ( path , "#{ app } .app" )
123
- sources = Mix.Project . config_files
122
+ target = Path . join ( path , "#{ app } .app" )
123
+ sources = Mix.Project . config_files ( )
124
124
125
125
if opts [ :force ] || Mix.Utils . stale? ( sources , [ target ] ) || modules_changed? ( mods , target ) do
126
126
best_guess = [
127
127
description: to_charlist ( config [ :description ] || app ) ,
128
128
modules: mods ,
129
129
registered: [ ] ,
130
- vsn: to_charlist ( version ) ,
130
+ vsn: to_charlist ( version )
131
131
]
132
132
133
- properties = if function_exported? ( project , :application , 0 ) do
134
- project_application = project . application ( )
135
- unless Keyword . keyword? ( project_application ) do
136
- Mix . raise "Application configuration returned from application/0 should be a keyword list"
133
+ properties =
134
+ if function_exported? ( project , :application , 0 ) do
135
+ project_application = project . application
136
+
137
+ unless Keyword . keyword? ( project_application ) do
138
+ Mix . raise (
139
+ "Application configuration returned from application/0 should be a keyword list"
140
+ )
141
+ end
142
+
143
+ Keyword . merge ( best_guess , project_application )
144
+ else
145
+ best_guess
137
146
end
138
- Keyword . merge ( best_guess , project_application )
139
- else
140
- best_guess
141
- end
142
147
143
148
properties = ensure_correct_properties ( properties , config )
144
149
contents = :io_lib . format ( "~p.~n" , [ { :application , app , properties } ] )
145
150
146
151
Mix.Project . ensure_structure ( )
147
152
File . write! ( target , IO . chardata_to_string ( contents ) )
148
- Mix . shell . info "Generated #{ app } app"
153
+ Mix . shell ( ) . info ( "Generated #{ app } app" )
149
154
:ok
150
155
else
151
156
:noop
@@ -156,19 +161,22 @@ defmodule Mix.Tasks.Compile.App do
156
161
case :file . consult ( target ) do
157
162
{ :ok , [ { :application , _app , properties } ] } ->
158
163
properties [ :modules ] != mods
164
+
159
165
_ ->
160
166
false
161
167
end
162
168
end
163
169
164
170
defp validate_app ( app ) when is_atom ( app ) , do: :ok
171
+
165
172
defp validate_app ( app ) do
166
173
ensure_present ( :app , app )
167
174
Mix . raise ( "Expected :app to be an atom, got: #{ inspect ( app ) } " )
168
175
end
169
176
170
177
defp validate_version ( version ) do
171
178
ensure_present ( :version , version )
179
+
172
180
unless is_binary ( version ) and match? ( { :ok , _ } , Version . parse ( version ) ) do
173
181
Mix . raise ( "Expected :version to be a SemVer version, got: #{ inspect ( version ) } " )
174
182
end
@@ -177,10 +185,11 @@ defmodule Mix.Tasks.Compile.App do
177
185
defp ensure_present ( name , nil ) do
178
186
Mix . raise ( "Please ensure mix.exs file has the #{ inspect ( name ) } in the project definition" )
179
187
end
188
+
180
189
defp ensure_present ( _name , _val ) , do: :ok
181
190
182
191
defp modules_from ( beams ) do
183
- Enum . map beams , & ( & 1 |> Path . basename |> Path . rootname ( ".beam" ) |> String . to_atom )
192
+ Enum . map ( beams , & ( & 1 |> Path . basename ( ) |> Path . rootname ( ".beam" ) |> String . to_atom ( ) ) )
184
193
end
185
194
186
195
defp language_app ( config ) do
@@ -199,73 +208,115 @@ defmodule Mix.Tasks.Compile.App do
199
208
end
200
209
201
210
defp validate_properties! ( properties ) do
202
- Enum . each properties , fn
211
+ Enum . each ( properties , fn
203
212
{ :description , value } ->
204
213
unless is_list ( value ) do
205
- Mix . raise "Application description (:description) is not a character list, got: #{ inspect value } "
214
+ Mix . raise (
215
+ "Application description (:description) is not a character list, got: #{
216
+ inspect ( value )
217
+ } "
218
+ )
206
219
end
220
+
207
221
{ :id , value } ->
208
222
unless is_list ( value ) do
209
- Mix . raise "Application id (:id) is not a character list, got: #{ inspect value } "
223
+ Mix . raise ( "Application id (:id) is not a character list, got: #{ inspect ( value ) } " )
210
224
end
225
+
211
226
{ :vsn , value } ->
212
227
unless is_list ( value ) do
213
- Mix . raise "Application vsn (:vsn) is not a character list, got: #{ inspect value } "
228
+ Mix . raise ( "Application vsn (:vsn) is not a character list, got: #{ inspect ( value ) } " )
214
229
end
230
+
215
231
{ :maxT , value } ->
216
232
unless value == :infinity or is_integer ( value ) do
217
- Mix . raise "Application maximum time (:maxT) is not an integer or :infinity, got: #{ inspect value } "
233
+ Mix . raise (
234
+ "Application maximum time (:maxT) is not an integer or :infinity, got: " <>
235
+ inspect ( value )
236
+ )
218
237
end
238
+
219
239
{ :modules , value } ->
220
240
unless is_list ( value ) and Enum . all? ( value , & is_atom ( & 1 ) ) do
221
- Mix . raise "Application modules (:modules) should be a list of atoms, got: #{ inspect value } "
241
+ Mix . raise (
242
+ "Application modules (:modules) should be a list of atoms, got: #{ inspect ( value ) } "
243
+ )
222
244
end
245
+
223
246
{ :registered , value } ->
224
247
unless is_list ( value ) and Enum . all? ( value , & is_atom ( & 1 ) ) do
225
- Mix . raise "Application registered processes (:registered) should be a list of atoms, got: #{ inspect value } "
248
+ Mix . raise (
249
+ "Application registered processes (:registered) should be a list of atoms, got: " <>
250
+ inspect ( value )
251
+ )
226
252
end
253
+
227
254
{ :included_applications , value } ->
228
255
unless is_list ( value ) and Enum . all? ( value , & is_atom ( & 1 ) ) do
229
- Mix . raise "Application included applications (:included_applications) should be a list of atoms, got: #{ inspect value } "
256
+ Mix . raise (
257
+ "Application included applications (:included_applications) should be a list of atoms, got: " <>
258
+ inspect ( value )
259
+ )
230
260
end
261
+
231
262
{ :extra_applications , value } ->
232
263
unless is_list ( value ) and Enum . all? ( value , & is_atom ( & 1 ) ) do
233
- Mix . raise "Application extra applications (:extra_applications) should be a list of atoms, got: #{ inspect value } "
264
+ Mix . raise (
265
+ "Application extra applications (:extra_applications) should be a list of atoms, got: " <>
266
+ inspect ( value )
267
+ )
234
268
end
269
+
235
270
{ :applications , value } ->
236
271
unless is_list ( value ) and Enum . all? ( value , & is_atom ( & 1 ) ) do
237
- Mix . raise "Application applications (:applications) should be a list of atoms, got: #{ inspect value } "
272
+ Mix . raise (
273
+ "Application applications (:applications) should be a list of atoms, got: " <>
274
+ inspect ( value )
275
+ )
238
276
end
277
+
239
278
{ :env , value } ->
240
279
unless Keyword . keyword? ( value ) do
241
- Mix . raise "Application environment (:env) should be a keyword list, got: #{ inspect value } "
280
+ Mix . raise (
281
+ "Application environment (:env) should be a keyword list, got: #{ inspect ( value ) } "
282
+ )
242
283
end
284
+
243
285
{ :start_phases , value } ->
244
286
unless Keyword . keyword? ( value ) do
245
- Mix . raise "Application start phases (:start_phases) should be a keyword list, got: #{ inspect value } "
287
+ Mix . raise (
288
+ "Application start phases (:start_phases) should be a keyword list, got: " <>
289
+ inspect ( value )
290
+ )
246
291
end
292
+
247
293
{ :mod , [ ] } ->
248
294
:ok
295
+
249
296
{ :mod , { module , _args } } when is_atom ( module ) ->
250
297
:ok
298
+
251
299
{ :mod , value } ->
252
- Mix . raise "Application callback module (:mod) should be either [] or {module, start_args}, got: #{ inspect value } "
300
+ Mix . raise (
301
+ "Application callback module (:mod) should be either [] or {module, start_args}, got: " <>
302
+ inspect ( value )
303
+ )
304
+
253
305
_ ->
254
306
:ok
255
- end
307
+ end )
256
308
257
309
properties
258
310
end
259
311
260
312
defp apps_from_prod_non_optional_deps ( properties ) do
261
313
included_applications = Keyword . get ( properties , :included_applications , [ ] )
262
314
263
- for % { app: app , opts: opts , top_level: true } <- Mix.Dep . cached ,
315
+ for % { app: app , opts: opts , top_level: true } <- Mix.Dep . cached ( ) ,
264
316
Keyword . get ( opts , :app , true ) ,
265
317
Keyword . get ( opts , :runtime , true ) ,
266
318
not Keyword . get ( opts , :optional , false ) ,
267
- app not in included_applications ,
268
- do: app
319
+ app not in included_applications , do: app
269
320
end
270
321
271
322
defp normalize_apps ( apps , properties , config ) do
0 commit comments