@@ -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,122 @@ 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
+ } "
237
+ )
218
238
end
239
+
219
240
{ :modules , value } ->
220
241
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 } "
242
+ Mix . raise (
243
+ "Application modules (:modules) should be a list of atoms, got: #{ inspect ( value ) } "
244
+ )
222
245
end
246
+
223
247
{ :registered , value } ->
224
248
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 } "
249
+ Mix . raise (
250
+ "Application registered processes (:registered) should be a list of atoms, got: #{
251
+ inspect ( value )
252
+ } "
253
+ )
226
254
end
255
+
227
256
{ :included_applications , value } ->
228
257
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 } "
258
+ Mix . raise (
259
+ "Application included applications (:included_applications) should be a list of atoms, got: #{
260
+ inspect ( value )
261
+ } "
262
+ )
230
263
end
264
+
231
265
{ :extra_applications , value } ->
232
266
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 } "
267
+ Mix . raise (
268
+ "Application extra applications (:extra_applications) should be a list of atoms, got: #{
269
+ inspect ( value )
270
+ } "
271
+ )
234
272
end
273
+
235
274
{ :applications , value } ->
236
275
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 } "
276
+ Mix . raise (
277
+ "Application applications (:applications) should be a list of atoms, got: #{
278
+ inspect ( value )
279
+ } "
280
+ )
238
281
end
282
+
239
283
{ :env , value } ->
240
284
unless Keyword . keyword? ( value ) do
241
- Mix . raise "Application environment (:env) should be a keyword list, got: #{ inspect value } "
285
+ Mix . raise (
286
+ "Application environment (:env) should be a keyword list, got: #{ inspect ( value ) } "
287
+ )
242
288
end
289
+
243
290
{ :start_phases , value } ->
244
291
unless Keyword . keyword? ( value ) do
245
- Mix . raise "Application start phases (:start_phases) should be a keyword list, got: #{ inspect value } "
292
+ Mix . raise (
293
+ "Application start phases (:start_phases) should be a keyword list, got: #{
294
+ inspect ( value )
295
+ } "
296
+ )
246
297
end
298
+
247
299
{ :mod , [ ] } ->
248
300
:ok
301
+
249
302
{ :mod , { module , _args } } when is_atom ( module ) ->
250
303
:ok
304
+
251
305
{ :mod , value } ->
252
- Mix . raise "Application callback module (:mod) should be either [] or {module, start_args}, got: #{ inspect value } "
306
+ Mix . raise (
307
+ "Application callback module (:mod) should be either [] or {module, start_args}, got: #{
308
+ inspect ( value )
309
+ } "
310
+ )
311
+
253
312
_ ->
254
313
:ok
255
- end
314
+ end )
256
315
257
316
properties
258
317
end
259
318
260
319
defp apps_from_prod_non_optional_deps ( properties ) do
261
320
included_applications = Keyword . get ( properties , :included_applications , [ ] )
262
321
263
- for % { app: app , opts: opts , top_level: true } <- Mix.Dep . cached ,
322
+ for % { app: app , opts: opts , top_level: true } <- Mix.Dep . cached ( ) ,
264
323
Keyword . get ( opts , :app , true ) ,
265
324
Keyword . get ( opts , :runtime , true ) ,
266
325
not Keyword . get ( opts , :optional , false ) ,
267
- app not in included_applications ,
268
- do: app
326
+ app not in included_applications , do: app
269
327
end
270
328
271
329
defp normalize_apps ( apps , properties , config ) do
0 commit comments