@@ -3,7 +3,7 @@ const deasync = require('deasync-promise');
33const  glob  =  require ( 'glob-all' ) ; 
44const  JSZip  =  require ( 'jszip' ) ; 
55const  tape  =  require ( 'tape' ) ; 
6- const  {  removeSync,  readFileSync }  =  require ( 'fs-extra' ) ; 
6+ const  {  removeSync,  readFileSync,  copySync  }  =  require ( 'fs-extra' ) ; 
77const  {  sep }  =  require ( 'path' ) ; 
88
99const  {  getUserCachePath }  =  require ( './lib/shared' ) ; 
@@ -63,8 +63,8 @@ const teardown = () => {
6363  removeSync ( 'tests/base with a space' ) ; 
6464} ; 
6565
66- const  test  =  ( desc ,  func )  => 
67-   tape . test ( desc ,  t  =>  { 
66+ const  test  =  ( desc ,  func ,   opts   =   { } )  => 
67+   tape . test ( desc ,  opts ,   t  =>  { 
6868    setup ( ) ; 
6969    try  { 
7070      func ( t ) ; 
@@ -86,7 +86,17 @@ const listRequirementsZipFiles = filename => {
8686  const  zip  =  deasync ( new  JSZip ( ) . loadAsync ( readFileSync ( filename ) ) ) ; 
8787  const  reqsBuffer  =  deasync ( zip . file ( '.requirements.zip' ) . async ( 'nodebuffer' ) ) ; 
8888  const  reqsZip  =  deasync ( new  JSZip ( ) . loadAsync ( reqsBuffer ) ) ; 
89-   return  Object . keys ( reqsZip . files ) 
89+   return  Object . keys ( reqsZip . files ) ; 
90+ } ; 
91+ 
92+ const  canUseDocker  =  ( )  =>  { 
93+   let  result ; 
94+   try  { 
95+     result  =  crossSpawn . sync ( 'docker' ,  [ 'ps' ] ) ; 
96+   }  catch  ( e )  { 
97+     return  false ; 
98+   } 
99+   return  result . status  ===  0 ; 
90100} ; 
91101
92102test ( 'default pythonBin can package flask with default options' ,  t  =>  { 
@@ -142,7 +152,6 @@ test('py3.6 can package flask with slim option', t => {
142152  t . end ( ) ; 
143153} ) ; 
144154
145- 
146155/* 
147156 * News tests not in test.bats 
148157 */ 
@@ -151,10 +160,18 @@ test("py3.6 doesn't package bottle with zip option", t => {
151160  process . chdir ( 'tests/base' ) ; 
152161  const  path  =  npm ( [ 'pack' ,  '../..' ] ) ; 
153162  npm ( [ 'i' ,  path ] ) ; 
154-   perl ( [ '-p' ,  "-i'.bak'" ,  '-e' ,  's/(pythonRequirements:$)/\\1\\n    noDeploy: [bottle]/' ,  'serverless.yml' ] ) 
163+   perl ( [ 
164+     '-p' , 
165+     "-i'.bak'" , 
166+     '-e' , 
167+     's/(pythonRequirements:$)/\\1\\n    noDeploy: [bottle]/' , 
168+     'serverless.yml' 
169+   ] ) ; 
155170  sls ( [ `--pythonBin=${ getPythonBin ( 3 ) }  ` ,  '--zip=true' ,  'package' ] ) ; 
156171  const  zipfiles  =  listZipFiles ( '.serverless/sls-py-req-test.zip' ) ; 
157-   const  zippedReqs  =  listRequirementsZipFiles ( '.serverless/sls-py-req-test.zip' ) ; 
172+   const  zippedReqs  =  listRequirementsZipFiles ( 
173+     '.serverless/sls-py-req-test.zip' 
174+   ) ; 
158175  t . true ( 
159176    zipfiles . includes ( '.requirements.zip' ) , 
160177    'zipped requirements are packaged' 
@@ -164,7 +181,141 @@ test("py3.6 doesn't package bottle with zip option", t => {
164181    zipfiles . includes ( `flask${ sep }  __init__.py` ) , 
165182    "flask isn't packaged on its own" 
166183  ) ; 
167-   t . true ( zippedReqs . includes ( `flask/__init__.py` ) ,  'flask is packaged in the .requirements.zip file' ) ; 
168-   t . false ( zippedReqs . includes ( `bottle.py` ) ,  'bottle is not packaged in the .requirements.zip file' ) ; 
184+   t . true ( 
185+     zippedReqs . includes ( `flask/__init__.py` ) , 
186+     'flask is packaged in the .requirements.zip file' 
187+   ) ; 
188+   t . false ( 
189+     zippedReqs . includes ( `bottle.py` ) , 
190+     'bottle is not packaged in the .requirements.zip file' 
191+   ) ; 
192+   t . end ( ) ; 
193+ } ) ; 
194+ 
195+ test ( 'py3.6 can package flask with slim, slimPatterns & slimPatternsAppendDefaults=false options' ,  t  =>  { 
196+   process . chdir ( 'tests/base' ) ; 
197+   copySync ( '_slimPatterns.yml' ,  'slimPatterns.yml' ) ; 
198+   const  path  =  npm ( [ 'pack' ,  '../..' ] ) ; 
199+   npm ( [ 'i' ,  path ] ) ; 
200+   sls ( [ '--slim=true' ,  '--slimPatternsAppendDefaults=false' ,  'package' ] ) ; 
201+ 
202+   const  zipfiles  =  listZipFiles ( '.serverless/sls-py-req-test.zip' ) ; 
203+   t . true ( zipfiles . includes ( `flask${ sep }  __init__.py` ) ,  'flask is packaged' ) ; 
204+   t . true ( 
205+     zipfiles . filter ( filename  =>  filename . endsWith ( '.pyc' ) ) . length  >=  1 , 
206+     'pyc files are packaged' 
207+   ) ; 
208+   t . deepEqual ( 
209+     zipfiles . filter ( filename  =>  filename . includes ( '.egg-info' ) ) , 
210+     [ ] , 
211+     '.egg-info folders are not packaged' 
212+   ) ; 
213+   t . end ( ) ; 
214+ } ) ; 
215+ 
216+ test ( 
217+   'py3.6 can package flask with slim & dockerizePip & slimPatterns & slimPatternsAppendDefaults=false options' , 
218+   t  =>  { 
219+     process . chdir ( 'tests/base' ) ; 
220+     copySync ( '_slimPatterns.yml' ,  'slimPatterns.yml' ) ; 
221+     const  path  =  npm ( [ 'pack' ,  '../..' ] ) ; 
222+     npm ( [ 'i' ,  path ] ) ; 
223+     sls ( [ 
224+       '--dockerizePip=true' , 
225+       '--slim=true' , 
226+       '--slimPatternsAppendDefaults=false' , 
227+       'package' 
228+     ] ) ; 
229+ 
230+     const  zipfiles  =  listZipFiles ( '.serverless/sls-py-req-test.zip' ) ; 
231+     t . true ( zipfiles . includes ( `flask${ sep }  __init__.py` ) ,  'flask is packaged' ) ; 
232+     t . true ( 
233+       zipfiles . filter ( filename  =>  filename . endsWith ( '.pyc' ) ) . length  >=  1 , 
234+       'pyc files are packaged' 
235+     ) ; 
236+     t . deepEqual ( 
237+       zipfiles . filter ( filename  =>  filename . includes ( '.egg-infooo' ) ) , 
238+       [ ] , 
239+       '.egg-info folders are not packaged' 
240+     ) ; 
241+     t . end ( ) ; 
242+   } , 
243+   {  skip : ! canUseDocker ( )  } 
244+ ) ; 
245+ 
246+ test ( 'py2.7 can package flask with slim & slimPatterns & slimPatternsAppendDefaults=false options' ,  t  =>  { 
247+   process . chdir ( 'tests/base' ) ; 
248+   copySync ( '_slimPatterns.yml' ,  'slimPatterns.yml' ) ; 
249+   const  path  =  npm ( [ 'pack' ,  '../..' ] ) ; 
250+   npm ( [ 'i' ,  path ] ) ; 
251+   sls ( [ 
252+     '--runtime=python2.7' , 
253+     '--slim=true' , 
254+     '--slimPatternsAppendDefaults=false' , 
255+     'package' 
256+   ] ) ; 
257+ 
258+   const  zipfiles  =  listZipFiles ( '.serverless/sls-py-req-test.zip' ) ; 
259+   t . true ( zipfiles . includes ( `flask${ sep }  __init__.py` ) ,  'flask is packaged' ) ; 
260+   t . true ( 
261+     zipfiles . filter ( filename  =>  filename . endsWith ( '.pyc' ) ) . length  >=  1 , 
262+     'pyc files are packaged' 
263+   ) ; 
264+   t . deepEqual ( 
265+     zipfiles . filter ( filename  =>  filename . includes ( '.egg-info' ) ) , 
266+     [ ] , 
267+     '.egg-info folders are not packaged' 
268+   ) ; 
269+   t . end ( ) ; 
270+ } ) ; 
271+ 
272+ test ( 
273+   'py2.7 can package flask with slim & dockerizePip & slimPatterns & slimPatternsAppendDefaults=false options' , 
274+   t  =>  { 
275+     process . chdir ( 'tests/base' ) ; 
276+     copySync ( '_slimPatterns.yml' ,  'slimPatterns.yml' ) ; 
277+     const  path  =  npm ( [ 'pack' ,  '../..' ] ) ; 
278+     npm ( [ 'i' ,  path ] ) ; 
279+     sls ( [ 
280+       '--dockerizePip=true' , 
281+       '--runtime=python2.7' , 
282+       '--slim=true' , 
283+       '--slimPatternsAppendDefaults=false' , 
284+       'package' 
285+     ] ) ; 
286+     const  zipfiles  =  listZipFiles ( '.serverless/sls-py-req-test.zip' ) ; 
287+     t . true ( zipfiles . includes ( `flask${ sep }  __init__.py` ) ,  'flask is packaged' ) ; 
288+     t . true ( 
289+       zipfiles . filter ( filename  =>  filename . endsWith ( '.pyc' ) ) . length  >=  1 , 
290+       'pyc files are packaged' 
291+     ) ; 
292+     t . deepEqual ( 
293+       zipfiles . filter ( filename  =>  filename . includes ( '.egg-info' ) ) , 
294+       [ ] , 
295+       '.egg-info folders are not packaged' 
296+     ) ; 
297+     t . end ( ) ; 
298+   } , 
299+   {  skip : ! canUseDocker ( )  } 
300+ ) ; 
301+ 
302+ test ( 'pipenv py3.6 can package flask with slim & slimPatterns & slimPatternsAppendDefaults=false  option' ,  t  =>  { 
303+   process . chdir ( 'tests/pipenv' ) ; 
304+   copySync ( '_slimPatterns.yml' ,  'slimPatterns.yml' ) ; 
305+   const  path  =  npm ( [ 'pack' ,  '../..' ] ) ; 
306+   npm ( [ 'i' ,  path ] ) ; 
307+ 
308+   sls ( [ '--slim=true' ,  '--slimPatternsAppendDefaults=false' ,  'package' ] ) ; 
309+   const  zipfiles  =  listZipFiles ( '.serverless/sls-py-req-test.zip' ) ; 
310+   t . true ( zipfiles . includes ( `flask${ sep }  __init__.py` ) ,  'flask is packaged' ) ; 
311+   t . true ( 
312+     zipfiles . filter ( filename  =>  filename . endsWith ( '.pyc' ) ) . length  >=  1 , 
313+     'pyc files are packaged' 
314+   ) ; 
315+   t . deepEqual ( 
316+     zipfiles . filter ( filename  =>  filename . includes ( '.egg-info' ) ) , 
317+     [ ] , 
318+     '.egg-info folders are not packaged' 
319+   ) ; 
169320  t . end ( ) ; 
170321} ) ; 
0 commit comments