mirror of
https://github.com/kennethreitz/heroku-buildpack-python.git
synced 2026-06-05 23:10:16 +00:00
Compare commits
1337 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a75e4fdf2d | |||
| f0201c3e38 | |||
| 877aa79e19 | |||
| 730c4b314b | |||
| d0ed320447 | |||
| 18965ac04c | |||
| 2f160c5652 | |||
| 5b64b73c0b | |||
| c732097d17 | |||
| 00947abe7a | |||
| d0c98aa577 | |||
| 894083bfe5 | |||
| ce30ca052e | |||
| f9e54dc3f6 | |||
| 7d975e74a9 | |||
| 5f8360cba8 | |||
| 091656088d | |||
| 05e3d8ccce | |||
| 2f18118cd3 | |||
| 920fefce57 | |||
| fd53d4e1b0 | |||
| 329cd6eb7b | |||
| b6f042b118 | |||
| 7cbca2f5c5 | |||
| fe302d8724 | |||
| 0f0ddd52ea | |||
| a334672a1a | |||
| 7b26f0df44 | |||
| 96df073bdf | |||
| cbf074a856 | |||
| c373e80c12 | |||
| 714826eea2 | |||
| 41b342e03b | |||
| 45ceb2f451 | |||
| 3511cae1bb | |||
| ce5ff2384f | |||
| 97ac451a80 | |||
| 06fa6d23ba | |||
| df083fd3b8 | |||
| 2e1638a1b0 | |||
| e15f68944a | |||
| 9468ec2630 | |||
| c4ec6d3370 | |||
| 1ed0a96b09 | |||
| 500daaf6fc | |||
| 4a1fcafecc | |||
| 23ee27792a | |||
| de680016c9 | |||
| 646466c4dd | |||
| a2c3aaf817 | |||
| 88d6c93955 | |||
| b261158bf2 | |||
| 009d0ddbae | |||
| 17dd42113f | |||
| f767a73515 | |||
| 2608bf43dd | |||
| 25c5762cb9 | |||
| ff223597f3 | |||
| 50950c59df | |||
| 9817eb149e | |||
| a703d2febe | |||
| e304405410 | |||
| 17f992a106 | |||
| 24895082d3 | |||
| 002780c2d9 | |||
| df7f8f3507 | |||
| 312a468cce | |||
| d4b8c2aeda | |||
| f86e8079b6 | |||
| 36c6f5e388 | |||
| 91a65b2984 | |||
| 3010070d55 | |||
| fedae5ceda | |||
| 4212e06309 | |||
| fd360bda14 | |||
| 4723abb896 | |||
| 155b5eecb9 | |||
| 845635d667 | |||
| 0c26eae214 | |||
| 325a3165e4 | |||
| bf378916af | |||
| c029e44dc8 | |||
| f74d4db8c5 | |||
| 2512694df9 | |||
| f289984061 | |||
| 1d37749ec1 | |||
| da13bf1f3d | |||
| 78767e7199 | |||
| 194932889d | |||
| 4293ec5564 | |||
| 57baab9f68 | |||
| a7c20eea42 | |||
| 0a4cc2c476 | |||
| cbb718bb8b | |||
| db95cdd3f3 | |||
| 04f3ddbc86 | |||
| f06f5676e8 | |||
| c8c8995d70 | |||
| 4ee3baaded | |||
| ff94908505 | |||
| 5496c02f9f | |||
| 8d6d14b671 | |||
| 98dc586a99 | |||
| 9b185f99d5 | |||
| e8a79bbda5 | |||
| e621ff4d5e | |||
| 7a579e4eb7 | |||
| a1ed1d7b42 | |||
| 9157111d44 | |||
| 48f67ac5a6 | |||
| f6d63ea53d | |||
| 668219ae59 | |||
| 18c404f72d | |||
| 84f2fb5396 | |||
| d39b8c19b2 | |||
| 9a24c9d17d | |||
| 29abb059b6 | |||
| eb056bc58d | |||
| 70a152bd46 | |||
| 0b580d997e | |||
| 9f63582a23 | |||
| 5f33811357 | |||
| 3bd0a0e7cc | |||
| b7c3cdb607 | |||
| 3a89a84399 | |||
| 59a70d2c63 | |||
| 26ed6daeaa | |||
| cafd418220 | |||
| dded42350f | |||
| 65648fb7a8 | |||
| 45b0d18532 | |||
| 8f258ae0b8 | |||
| b80f7a953f | |||
| f27a84e015 | |||
| 5794bacbbf | |||
| e29b60dcfd | |||
| 7c95b156ce | |||
| e05346e8c1 | |||
| 9deea01360 | |||
| c19f0f83ee | |||
| 8b88d655c4 | |||
| 0e8c0077ff | |||
| cfda557b31 | |||
| 44c2b75b8d | |||
| c3849fb6d3 | |||
| 5608ed9f3c | |||
| e9108858fc | |||
| c85f5d015c | |||
| 321543d4ae | |||
| 8bd209de13 | |||
| 58e9c84347 | |||
| dcfff15151 | |||
| 9426dc8668 | |||
| cdbeb6419e | |||
| 858113cf76 | |||
| a547da0b52 | |||
| df52fd46e5 | |||
| 2e37a96984 | |||
| 12c3b8cb1d | |||
| 0fadebf7d8 | |||
| 33ccaa9e45 | |||
| 6b5ec50ab9 | |||
| 63810f29d3 | |||
| 0de749a6a2 | |||
| 2df1131d3c | |||
| af0795264b | |||
| 327daa5f32 | |||
| 09b7e44841 | |||
| e26a0f04d9 | |||
| c92f379f78 | |||
| 893bdec066 | |||
| 607dcfda07 | |||
| 26a0b9678f | |||
| e58e5d2b74 | |||
| 6faa5a4efc | |||
| 2881d65e4e | |||
| 1696e7cee6 | |||
| 35b89386ed | |||
| 3634eb1dbf | |||
| 66f5a66740 | |||
| 6e2a504fc1 | |||
| 124aff5ea6 | |||
| c44ab4cd03 | |||
| 677dfeec11 | |||
| c77a1877d3 | |||
| 1c51f5d84e | |||
| 6922a82536 | |||
| 9cc5bf1a85 | |||
| 012cb8a4df | |||
| fab60ae6ab | |||
| cd52da6155 | |||
| acd9347930 | |||
| d7e2f0fb08 | |||
| a3ed9c7155 | |||
| 8db1f07fba | |||
| 17081d0328 | |||
| d1ab87748b | |||
| 6844d1252d | |||
| 1346c29089 | |||
| 3bc1b5e697 | |||
| 9a6fa0478a | |||
| 573ded6d41 | |||
| b4ec35433a | |||
| cf1148f0a8 | |||
| a0649b1e50 | |||
| 2f2fd24421 | |||
| f754ae16bb | |||
| cef1be80a5 | |||
| c0571d86bf | |||
| d82eddca03 | |||
| 119e8145c3 | |||
| 99dae0f671 | |||
| f54dfff8a9 | |||
| c9760ae0ee | |||
| 98ff1670b3 | |||
| bdd466f838 | |||
| 324ebc9223 | |||
| 42ec6d8701 | |||
| 19513067bb | |||
| 753c912ecc | |||
| 4e8c469ec7 | |||
| 852723f867 | |||
| 94514a8179 | |||
| 7d57744c0a | |||
| a41ddf6bd1 | |||
| 197b7bae3f | |||
| f468739cfb | |||
| 555d5bd2be | |||
| 0a4d32c8a5 | |||
| 1a1cedfc21 | |||
| d35ee2c14c | |||
| 554a8bbae6 | |||
| 6572ad3d44 | |||
| 35cabaeebc | |||
| 300285a92d | |||
| 7a6f1eb010 | |||
| 66d754978e | |||
| 9c222a9350 | |||
| 7f4273f47f | |||
| dd707c21e3 | |||
| 7833743f96 | |||
| 5a9155e311 | |||
| 857c47ad66 | |||
| 87cf6073dc | |||
| 36dd089808 | |||
| c58f52e06e | |||
| 265a95d3b6 | |||
| 290c1377fb | |||
| 8e42040d01 | |||
| d8755e6791 | |||
| 364a1fafd9 | |||
| 251b7f7960 | |||
| 6d491f9f2b | |||
| 7cfbce82fd | |||
| d520ca4291 | |||
| bf252422fc | |||
| d7874d583b | |||
| d32dc82e1c | |||
| bd048d50b5 | |||
| 26b2eeee20 | |||
| e527457ba3 | |||
| 1b7bd02bf2 | |||
| de9b0b9383 | |||
| 991f4126d7 | |||
| 076a457ad9 | |||
| 264f74d159 | |||
| 9f89c4e744 | |||
| 8d2788094b | |||
| e2f4fd442a | |||
| 1bccc03b30 | |||
| adac27fa9c | |||
| d1c30fd24b | |||
| a1cfa41cb2 | |||
| 57e9bb0054 | |||
| 8e34179b1c | |||
| c03cb26961 | |||
| 127ff904d6 | |||
| 6c53bd1cd6 | |||
| d8307c29ba | |||
| f526673903 | |||
| 85f10b7d59 | |||
| bbbadc83e4 | |||
| 9c2b033042 | |||
| e427d5111e | |||
| ab724138c1 | |||
| e36b580615 | |||
| f8a1761165 | |||
| 521bb00247 | |||
| 5cd4245412 | |||
| 40daa84ccc | |||
| f0ea766900 | |||
| 89125df805 | |||
| 83ee7d90d7 | |||
| bb87f5ed56 | |||
| 424e1c351d | |||
| 83bde7ccea | |||
| 7fab8ce2c2 | |||
| d4326fad0f | |||
| a0d4da00e6 | |||
| f72c34a5dd | |||
| 2bc41d20b8 | |||
| 3cce589cec | |||
| 70758edd49 | |||
| ba7a9cd565 | |||
| 37a7afbe2d | |||
| b0138c26e6 | |||
| d653377faf | |||
| 0b87419166 | |||
| d832b7425e | |||
| 2991dce623 | |||
| 28b67dd208 | |||
| 24f73fbc2d | |||
| ffd0bb57ee | |||
| 75870dd412 | |||
| 831d73e302 | |||
| 0cf2e2849d | |||
| 6ba8d47927 | |||
| af940b5390 | |||
| 819bc2da5b | |||
| 2dad2e73f3 | |||
| e550b32ea8 | |||
| 6af8d81086 | |||
| 0ed4089cb9 | |||
| f09191ec8b | |||
| aef7b65b95 | |||
| 5438aab121 | |||
| a259143c0b | |||
| 0896d6a0c4 | |||
| 39f2efe296 | |||
| d047f26ad4 | |||
| 998f996a32 | |||
| c620980e5a | |||
| 2983fcfbea | |||
| e3511e7202 | |||
| 692f040618 | |||
| 8645a965aa | |||
| 3a483865e8 | |||
| 6ea6a0ccaf | |||
| 6bc94eaf6e | |||
| 49e409cb64 | |||
| 2693de45c7 | |||
| 88f711b6e7 | |||
| a7976fc177 | |||
| 8a837a23e7 | |||
| f37597ad9d | |||
| 928a664544 | |||
| 9fb715ef1c | |||
| 3cff2e39fe | |||
| 653a5be104 | |||
| 67ade52e95 | |||
| ab3e365ff6 | |||
| 902672e934 | |||
| 6207b3506b | |||
| 5446d448fd | |||
| 366def6c16 | |||
| a84fc7a248 | |||
| e4aa40216b | |||
| 87d03e62d7 | |||
| 92b4f5e8aa | |||
| 19cd447b83 | |||
| 570182b6b7 | |||
| 0a6ed0de43 | |||
| 0b7a1fc14e | |||
| 2c69e3b98f | |||
| 86f43fa02a | |||
| 03b95247c3 | |||
| 0e8a11b836 | |||
| 4c9de740d2 | |||
| 9b45baa41c | |||
| ecfaeb2fd2 | |||
| cef0b1703a | |||
| 18317ef606 | |||
| 4896396a51 | |||
| be4f207aac | |||
| af15be61b8 | |||
| 39d64c5fd1 | |||
| 645cf5e338 | |||
| 7430c48b72 | |||
| 783d9e4b12 | |||
| eab957c8c9 | |||
| 6e80c391a8 | |||
| 58bae65a28 | |||
| 70d8c7a625 | |||
| 66611ca21a | |||
| 20fe371ac7 | |||
| d23143b801 | |||
| c98615cdd0 | |||
| 0749a04773 | |||
| a4f072714d | |||
| 427ec9e431 | |||
| 168939d14f | |||
| 58ecbd8a73 | |||
| 10eb361975 | |||
| 1242d71382 | |||
| 6ef93693c5 | |||
| 69b8b25322 | |||
| b706cd13f7 | |||
| 724e51b5c7 | |||
| 7b4835a98e | |||
| 477773b331 | |||
| c98c481f24 | |||
| 462fe074f9 | |||
| 70bfc5eab3 | |||
| a4d2592438 | |||
| 8306f84236 | |||
| 6952a2e728 | |||
| 7142c747f4 | |||
| 11db8e126a | |||
| 6f1fce3cdb | |||
| b2e12f9ec8 | |||
| 44f8e393d6 | |||
| b8cbc64d20 | |||
| 5d51be5679 | |||
| d550b8cd15 | |||
| 25b28af19d | |||
| dbe2cdac37 | |||
| 767af30453 | |||
| df02e34a5b | |||
| 26c918863e | |||
| 1c458cee2e | |||
| 433570c27b | |||
| 30cb4ecef3 | |||
| 84e2a51337 | |||
| f1c2bc39d2 | |||
| ad53dc61f0 | |||
| 8598296756 | |||
| f5ef10326e | |||
| 16ec3c8325 | |||
| 49676e12af | |||
| 0aa123995b | |||
| cd4d811d4f | |||
| 76ebf9279b | |||
| 3c3e621040 | |||
| 40e91ffa67 | |||
| 72710696a0 | |||
| d27228999d | |||
| a4e8ba3cdf | |||
| e27b5656fd | |||
| f132d3198a | |||
| 6afd6bbce9 | |||
| 6fa14b55d3 | |||
| 8f4eb44d36 | |||
| 67f4c4238a | |||
| ffb89feb0d | |||
| 45b00e32a7 | |||
| 90edd88b22 | |||
| 2533cc68c1 | |||
| a11a765b93 | |||
| 6505f98bae | |||
| eb3e7851f7 | |||
| 78b6142d18 | |||
| af58f322e2 | |||
| e4bcc68c9a | |||
| 9a024b8595 | |||
| 581177b219 | |||
| 669f0b0e2a | |||
| e5ac89c4df | |||
| 1e8ad56b0f | |||
| b6607f0f42 | |||
| 8615bf5272 | |||
| 7f475977b5 | |||
| 53eee452eb | |||
| 031c9d576f | |||
| b0568b5f90 | |||
| 359a3b0d61 | |||
| d46e0efc16 | |||
| b97a104ad6 | |||
| a2ee94a8fb | |||
| 3b35c2c296 | |||
| 97834d305a | |||
| 86a53e6479 | |||
| 8c746e3e17 | |||
| b1d1a7cca5 | |||
| f172a83d48 | |||
| 4346b41c70 | |||
| 195ed4ae15 | |||
| e4fee65430 | |||
| 4f10a7e14a | |||
| a637ec3d11 | |||
| 1dd7be4250 | |||
| c2b9121436 | |||
| 567120b4bc | |||
| b61a395cd0 | |||
| 2a3962aea7 | |||
| 364ddc98b7 | |||
| d93d283be2 | |||
| 42141c2bf9 | |||
| d82c898509 | |||
| 6545d71b46 | |||
| 93b707eae5 | |||
| 8d358218f8 | |||
| b84b168be8 | |||
| 35c810e46d | |||
| e1ea2f9354 | |||
| 7db6ea33ac | |||
| a53826a673 | |||
| b7ecb49a96 | |||
| 911140b3ac | |||
| f1c4efb464 | |||
| 5a979874ad | |||
| a32ca25520 | |||
| e304089c3e | |||
| 5d8932e5ee | |||
| 7770ab8ff2 | |||
| 277294817a | |||
| 25b17d51c3 | |||
| ac103519f8 | |||
| e8b8af045f | |||
| 0bb6d6e2bd | |||
| 0184dcac24 | |||
| 558e748e9e | |||
| dec86fbc2e | |||
| ddc310084b | |||
| 2a6053ec2c | |||
| 86e0e29a41 | |||
| bc754f402b | |||
| ea5bc23a76 | |||
| 46ecf15337 | |||
| d020d20bde | |||
| 01ff4269f2 | |||
| f507bb0c05 | |||
| 9179b3cac0 | |||
| 5be33758ed | |||
| 41a44272d2 | |||
| 6b3f63252f | |||
| c9acc4154b | |||
| d5fed79e86 | |||
| 05edd6b065 | |||
| d96914ab2e | |||
| 4c4e192317 | |||
| 2963d2520b | |||
| 85686805a7 | |||
| eef41088b1 | |||
| f7387427c8 | |||
| 23e1164c93 | |||
| fd4ab23f50 | |||
| c78bf77055 | |||
| 5e212e4db8 | |||
| 9f666cee79 | |||
| 69e9368c2d | |||
| 4513dd7522 | |||
| 8b3e99adb3 | |||
| c5972cdb74 | |||
| 7b9bc848ee | |||
| 921a4c31a8 | |||
| 67063fc34f | |||
| 21dd1782fa | |||
| beb8c70585 | |||
| b46cc0c6da | |||
| 74af94132a | |||
| 24cc273800 | |||
| c0fbb0723a | |||
| 6ab397db10 | |||
| d8623ae454 | |||
| e6d395fa27 | |||
| e77090b6b8 | |||
| c61f907079 | |||
| bd90eecd8c | |||
| 44b2ef0c4e | |||
| 38d73effc1 | |||
| 6f6b75bb1f | |||
| cd90c7d1d8 | |||
| ce3c68538d | |||
| b6adf5223b | |||
| 0818d5428f | |||
| 1d8afb452e | |||
| 1c82d820c9 | |||
| 7cf8712d3c | |||
| 2b62692ab2 | |||
| 9188d94723 | |||
| 2ba3e06f4e | |||
| 6d78f7e3ed | |||
| 1e5ff1f8c9 | |||
| 83538ca6ec | |||
| 619bd638b0 | |||
| 5c359ba0fa | |||
| 27f019105e | |||
| eb572b5ab4 | |||
| 67c3d38a03 | |||
| 8f4ca7f624 | |||
| ce3bdb37ba | |||
| a91e9c2fc1 | |||
| da96cdf21e | |||
| 0b2e4e9b22 | |||
| 129ce5f0df | |||
| 25f7421573 | |||
| 8c654b658c | |||
| ed3691a0aa | |||
| ded2c5156a | |||
| 7c3a6303d1 | |||
| 591ed6b150 | |||
| c1c4f50ef6 | |||
| 2b29e7efeb | |||
| 9f089b18e6 | |||
| 9a1e43b8f2 | |||
| ac1ba4271c | |||
| af77d9baf8 | |||
| 706e6bab4f | |||
| b6fff224dd | |||
| 61d3d9580d | |||
| 69b88cb075 | |||
| a00133892d | |||
| 5eb337b80d | |||
| d6212b46ce | |||
| 3558766ae8 | |||
| 34f4dc43d6 | |||
| 0024336558 | |||
| c60c5321df | |||
| 0ba69875f5 | |||
| c8812c7e15 | |||
| 7d4093795b | |||
| 628ad0cb8b | |||
| 77ddd7c8a6 | |||
| c53d54f203 | |||
| ed6fe287c4 | |||
| 4f5a88a05a | |||
| 347c0eba81 | |||
| 14b482603e | |||
| 58ce002d35 | |||
| 7fd3a047fd | |||
| 26b4bfbab6 | |||
| 9e00de4e56 | |||
| afa8a0f75f | |||
| 52b8ae82b8 | |||
| e6c339ebae | |||
| 3ea0735768 | |||
| 54b930bba3 | |||
| bf202224b7 | |||
| cead16eb57 | |||
| 5c91c81968 | |||
| 42594a47c1 | |||
| 9d20adca1a | |||
| 181c09cfb7 | |||
| 770947d6e6 | |||
| 0a78bd001e | |||
| 5a1ece3955 | |||
| 8266b99d1e | |||
| e27470778c | |||
| 8ef4a006e0 | |||
| 4fdaf14ded | |||
| f1da8d4b5c | |||
| eb9689c0a2 | |||
| 6fe7c6bde0 | |||
| a1b372ac66 | |||
| ddead6457a | |||
| 92b4385890 | |||
| 7074d5cb50 | |||
| 2b1f1182c3 | |||
| 38fc8f4fe7 | |||
| a203495532 | |||
| 33a69d7f52 | |||
| fe3f12c430 | |||
| aeb1a297d3 | |||
| 4c1972c0b9 | |||
| 74f0f319dc | |||
| 683bba59d7 | |||
| f890cdb889 | |||
| b3a98641f5 | |||
| ecbcfff5cb | |||
| 085d295342 | |||
| e842703721 | |||
| c229070c21 | |||
| 67867f1083 | |||
| 91b76c4ca9 | |||
| d2b82441fe | |||
| 532b36f5f7 | |||
| abe34011e5 | |||
| 4b57be0ae1 | |||
| d8a75c56d0 | |||
| 27ce818f3d | |||
| f582b2f4fa | |||
| c46a779ea1 | |||
| 06a7d9e187 | |||
| ca773cf957 | |||
| 26b54b690c | |||
| 871d5b5935 | |||
| 0382c31225 | |||
| 4a856ff5b3 | |||
| e247704dfb | |||
| c8b031fafc | |||
| 68b740cce6 | |||
| e856e787aa | |||
| 7e4159e297 | |||
| d9a73b847e | |||
| 3dbeec8db1 | |||
| 8ec0b5f0dd | |||
| 3c2839147f | |||
| a51c162444 | |||
| 14096e0ca5 | |||
| 2631f5204b | |||
| f3b1e54df4 | |||
| 536b10b249 | |||
| b22aa3b3a7 | |||
| eb395a94f9 | |||
| b2597c45d8 | |||
| 1525c1fb3a | |||
| fd17f5a470 | |||
| ac923205d0 | |||
| 6617a3cac5 | |||
| 64a4f51e1b | |||
| 6305ed415a | |||
| 3dff0d48fe | |||
| 6f94b366f8 | |||
| 6bb89e6693 | |||
| 6252e80aa6 | |||
| b22ef82b4f | |||
| 129bced2dd | |||
| c82415733d | |||
| ee93719b79 | |||
| 361eb53257 | |||
| bf9fe3badf | |||
| 9178962b84 | |||
| 2b4a68c8c8 | |||
| f38eec962f | |||
| a313e66d93 | |||
| c755286323 | |||
| 0d219f5d2e | |||
| 28bdeb6f4b | |||
| 496a1ad7d8 | |||
| 57dec77718 | |||
| 4dc60cb4ca | |||
| f5f67653f8 | |||
| b7fd5915a5 | |||
| 72f7c510b9 | |||
| ac62aa01d5 | |||
| a727daa6ff | |||
| 2187855da2 | |||
| fb1ed99470 | |||
| be68853991 | |||
| c9d794dc76 | |||
| c1cc0910c5 | |||
| 61095f726d | |||
| 721d062421 | |||
| f38c90b1d5 | |||
| 8c0284dbe8 | |||
| f8f4facdca | |||
| e97f13395f | |||
| dc87fca814 | |||
| aafd7caf77 | |||
| ef964bfc1a | |||
| e5ae885ae1 | |||
| 2291255133 | |||
| d48294f940 | |||
| ef87cce5a9 | |||
| 63048e641d | |||
| 91aa427137 | |||
| 811c1ceeb6 | |||
| 8c2e95fb46 | |||
| d47fb9f718 | |||
| 4625eca277 | |||
| b2abb41a38 | |||
| b228d36041 | |||
| 7680aea223 | |||
| 771042a619 | |||
| b1f7713916 | |||
| 7b0c04b95b | |||
| 9f09c934bf | |||
| 88bad450fd | |||
| 7614f77431 | |||
| 761f27958a | |||
| 52347a0c98 | |||
| e2e97b774a | |||
| 4f0f97959f | |||
| 93f4eeb227 | |||
| ec769e00bb | |||
| ade975d48f | |||
| 16a07abd51 | |||
| 2bc071b323 | |||
| 3c07ec133e | |||
| 5c74244695 | |||
| 4e877e4f11 | |||
| 51ec7e3741 | |||
| 1f983fea40 | |||
| a26f0374ec | |||
| a0029a8411 | |||
| 2de3b6cf1c | |||
| fd19ec2c6a | |||
| 6aec3ed37a | |||
| 7f7f0f7e3d | |||
| dd210c9002 | |||
| 2ae4bd156f | |||
| 8740fcdbad | |||
| fb18948243 | |||
| e104d36785 | |||
| 1786231a49 | |||
| fa8e09ae9c | |||
| 2dd212d020 | |||
| 15acd305d1 | |||
| 5a65a39c5e | |||
| f18754f8f0 | |||
| e860234d05 | |||
| 50d61d2935 | |||
| 47c40ce086 | |||
| 2032942b61 | |||
| 0076fe4f53 | |||
| 9b18412ecc | |||
| 5f0ba6a371 | |||
| 1e2953b22e | |||
| e27ad6f919 | |||
| bfa7180b7b | |||
| 24ae4f9bda | |||
| cbb7512c9a | |||
| 869576e8ab | |||
| 9187dccb54 | |||
| eb6193d13e | |||
| a43eaaaf81 | |||
| c31574d7d6 | |||
| 3a42f565cb | |||
| 8f1942a9a5 | |||
| ab05b61638 | |||
| 5c4a414cb7 | |||
| 0e11dbadbf | |||
| 96cf5718b2 | |||
| d3f8351744 | |||
| 9d903fd92f | |||
| f77d8aaec3 | |||
| 4c2b867172 | |||
| 1bdf4a0c64 | |||
| c2b1465548 | |||
| f4471062a9 | |||
| f843a95343 | |||
| 1605422808 | |||
| 5ee2bdbd10 | |||
| f4c7160763 | |||
| 3e81740517 | |||
| a8e065969f | |||
| 688d167190 | |||
| 4553dafeca | |||
| 8aeceb00e4 | |||
| 022aa736ec | |||
| 2cad413958 | |||
| f5fb42e535 | |||
| 4995eeec41 | |||
| 0961b59420 | |||
| 1fdeedf112 | |||
| 43c7079a07 | |||
| 097f64721a | |||
| b3b6c78657 | |||
| fcfc2f8651 | |||
| 1f9b0bfe02 | |||
| 533def6b57 | |||
| 826193ef5a | |||
| 631aa4b356 | |||
| 067422b4b4 | |||
| 7ec8f12648 | |||
| 731a0cb0bf | |||
| ebd97e9b93 | |||
| 9fcf81c170 | |||
| 1f2cb16dbb | |||
| 827306728f | |||
| f6076cb7f0 | |||
| 694386e233 | |||
| f11928af11 | |||
| acda8f640a | |||
| 4ff3a5d818 | |||
| 314b729c8a | |||
| 9fb676aba9 | |||
| b91741d10d | |||
| f3787356b6 | |||
| def3136c85 | |||
| abb0c9b384 | |||
| 87b2891c1a | |||
| 52c34ef64f | |||
| 40bc836a55 | |||
| d2738ece19 | |||
| f758a5d738 | |||
| 63edc5d89b | |||
| 0db1584f21 | |||
| 1ed173f21d | |||
| b17f3f51f7 | |||
| 4f0556cce7 | |||
| b55a5e5ec8 | |||
| 68acbb064d | |||
| 92df76793f | |||
| 5cda51c7a5 | |||
| 659a406eb8 | |||
| 4cf2dd5b32 | |||
| 100a5ba0bc | |||
| ab16abaa88 | |||
| 989dd1dd2a | |||
| 0468ef22c4 | |||
| 6238994a17 | |||
| 7ba2fe66a0 | |||
| dfaec438d9 | |||
| aaeef59ff6 | |||
| 4d35f5129a | |||
| 84f610347c | |||
| 44bfda1320 | |||
| 330524adba | |||
| 85bddf8f00 | |||
| 7b0d891f4d | |||
| 84f0e2feba | |||
| 76309c35ec | |||
| 3f6b453c0a | |||
| 43dbb49103 | |||
| f08f93f347 | |||
| e0c852f4b9 | |||
| 15373996f4 | |||
| ff1e8da0cb | |||
| 99f7f5b9f1 | |||
| 656f390de8 | |||
| 42a7e79359 | |||
| bf084cc2ac | |||
| eaaba665bc | |||
| 94d311134c | |||
| 0d49ae9851 | |||
| a5c39384a8 | |||
| cb6bc30bc6 | |||
| 82c72a94d9 | |||
| f327afd364 | |||
| d94f4c5bbc | |||
| 8be04ea656 | |||
| de7c16d942 | |||
| 5ea843458a | |||
| 758941d12f | |||
| e01d5bc18b | |||
| 2c16539190 | |||
| ed79e61a2f | |||
| b7bcc69722 | |||
| 3dde375d0b | |||
| 483e30a5ba | |||
| e783556e6b | |||
| 5645a433dc | |||
| 715ab8b96a | |||
| 5f96190eb5 | |||
| c579162ef9 | |||
| a5cca6de75 | |||
| b7f1157693 | |||
| ae7b6fc715 | |||
| e0c3b72950 | |||
| 566f7f4555 | |||
| 4ff62b2b41 | |||
| d47970fd81 | |||
| 69bdca063f | |||
| 63cea99415 | |||
| 5ecd27e3b8 | |||
| 206a2dbc04 | |||
| 2a083791b6 | |||
| d5b2b0b464 | |||
| 2eab1ad845 | |||
| 2b16420d41 | |||
| 9fa0889499 | |||
| 99b17fabeb | |||
| 933d3014d7 | |||
| 018e0f31de | |||
| cf1647e937 | |||
| b9f154bf38 | |||
| 4cc18ce0af | |||
| f5ea1c24a3 | |||
| 952b0bb735 | |||
| 8b7edad8a2 | |||
| 02787ac910 | |||
| bcc3ba09ca | |||
| 31e65dc58b | |||
| 9a227e6c73 | |||
| ddc9c24d34 | |||
| 42488a2be7 | |||
| 839486c25b | |||
| 5d56200179 | |||
| fef1d4f7c0 | |||
| 43defcc17e | |||
| f78460e2a7 | |||
| 3448923b69 | |||
| 58a13bc268 | |||
| c18038f986 | |||
| d4356a1f4c | |||
| 3c8f478b65 | |||
| 23493302e6 | |||
| 35ceaf728d | |||
| 5c9412fc33 | |||
| 825c9329eb | |||
| 9ebb990716 | |||
| f964209589 | |||
| 2e699d392e | |||
| 431ecee509 | |||
| 90696215ae | |||
| 5b55261700 | |||
| 727ff90acf | |||
| 0060fdacd8 | |||
| 85ad1fa988 | |||
| 56c022ca41 | |||
| f68e0989ea | |||
| 7381117bb8 | |||
| c9209ebb3d | |||
| 35345d11f5 | |||
| 6ee17b4c26 | |||
| 86267f93a1 | |||
| 50642e7069 | |||
| 8349f291d2 | |||
| 1aad21382e | |||
| 686ee087a5 | |||
| f137ba213a | |||
| 5ae51010cc | |||
| 29d8e7f670 | |||
| 5be3e0ce52 | |||
| ddde30a12e | |||
| 2db5578998 | |||
| 290250836f | |||
| 0ff4df4dc3 | |||
| 9177aa2c08 | |||
| ad791dc7f8 | |||
| 6b298ff7f3 | |||
| 01e30e938c | |||
| e81632e05e | |||
| 4ab3358851 | |||
| 4ded988907 | |||
| 8637dc05c0 | |||
| 6f65ad0b97 | |||
| c5ec378ea7 | |||
| 37013c2eca | |||
| 54a8a6407e | |||
| 69360fb804 | |||
| 92d296ec24 | |||
| 99557332a0 | |||
| a3d9c5a1b2 | |||
| 235ff64a38 | |||
| 0f7fca9e03 | |||
| 161bf49a3a | |||
| 7ac90f19dd | |||
| 90cc426c82 | |||
| 550a239553 | |||
| 57fea1bd6f | |||
| d758545164 | |||
| 5935632b8b | |||
| 8f3a7b7947 | |||
| 2f47bd12fd | |||
| 86fb607dd4 | |||
| 80823b1e16 | |||
| ff6f56b8c5 | |||
| 5393ba3cb4 | |||
| 4ade6c0457 | |||
| e5c389e677 | |||
| ea27b5a77c | |||
| 18c19e4466 | |||
| 0ea950ee52 | |||
| 2d3033fc71 | |||
| 1687f1cffe | |||
| 2f0263a5b8 | |||
| dfbf20acd2 | |||
| 0b9019ab71 | |||
| b0fc2245f4 | |||
| 113c669041 | |||
| b8b5e12a4a | |||
| bece3de495 | |||
| 89120f7797 | |||
| 99e035495b | |||
| 0c56b0c35c | |||
| 111f92e368 | |||
| 03e666ffea | |||
| 40598be9d4 | |||
| 8f057f3c9b | |||
| 972e6f8054 | |||
| aeb7ef392a | |||
| 930a63d55c | |||
| 544de727a0 | |||
| 466e6b5fe3 | |||
| 1abaaf6cf1 | |||
| 48bd910207 | |||
| 87c580f819 | |||
| db1df1ac67 | |||
| 4005d7ea50 | |||
| d29d4404c3 | |||
| 33779576bd | |||
| 3bddd66637 | |||
| e00a407c91 | |||
| 117dcff4e1 | |||
| 7243afd5b5 | |||
| 0a75bc9744 | |||
| ca3b3808b9 | |||
| 287b398826 | |||
| 76d2eda80e | |||
| 880c498c3f | |||
| 12f053ef7f | |||
| 35ee2f60bd | |||
| 3e480e9aea | |||
| 46ba98a4ee | |||
| 958de9441a | |||
| 74312f5487 | |||
| ecf5278679 | |||
| 863abfb00e | |||
| f782693537 | |||
| a2c2411109 | |||
| 712f02e359 | |||
| 61477e515a | |||
| be9343534a | |||
| 2b4e9be4ad | |||
| 382dff7e3b | |||
| 6f2012c1c9 | |||
| c71fe81f8d | |||
| 91586d6690 | |||
| 046726b864 | |||
| ddf353cff5 | |||
| 160497cb64 | |||
| 6194f94aa7 | |||
| e288332f0e | |||
| e4979f33e3 | |||
| 03c3aebca8 | |||
| 487a5ffb95 | |||
| 01d15d4d0e | |||
| 6655794b4d | |||
| 4beb57a5a0 | |||
| bac517e755 | |||
| 62b68cfcd9 | |||
| 481e800a7c | |||
| 9a7c6c339d | |||
| 23340bcfee | |||
| 102979e985 | |||
| ab9a4fbe5f | |||
| aad72f8e81 | |||
| 72295bf186 | |||
| c45a2c14b2 | |||
| ee177b28ff | |||
| 2e0f2f59a0 | |||
| 9856efa7c4 | |||
| 34878b9638 | |||
| 27abdfe7d7 | |||
| 3b0bdba799 | |||
| b547d8c30c | |||
| 1bd317cd50 | |||
| 60b57fd368 | |||
| 27a22e8ccb | |||
| 0378bbb491 | |||
| bccec5cee9 | |||
| d6fbb29977 | |||
| 9d0bf98a52 | |||
| 795272d625 | |||
| c3866f80b6 | |||
| 580a662f36 | |||
| 5767e0df04 | |||
| eeb63f215a | |||
| 5a6e4e49b4 | |||
| b6eada4e67 | |||
| bbe0acf001 | |||
| 05e65801fa | |||
| 08338a4a26 | |||
| bf913e0016 | |||
| 774ceb3367 | |||
| 335a14c714 | |||
| 4dea56d4a0 | |||
| c9916dd2e3 | |||
| 662a311f95 | |||
| bfd6ea22ca | |||
| c5d7991468 | |||
| c4404694e1 | |||
| e914736956 | |||
| 23833dda9b | |||
| 15573b9d3f | |||
| 86661c1cda | |||
| 9cbace7f76 | |||
| 74cb870488 | |||
| ae9b83f07c | |||
| d70c681c32 | |||
| c312d917a1 | |||
| 5d2ecd2f1f | |||
| a1e1dbd865 | |||
| 12f28894ce | |||
| 538ef6e378 | |||
| 1588ea44b2 | |||
| 3cc9098e25 | |||
| 436e945a91 | |||
| f9b83a4e95 | |||
| b1f8bf9f5e | |||
| 7af5175942 | |||
| c24a9096de | |||
| 36d27c46ed | |||
| 713fa36bca | |||
| 20249f9672 | |||
| 8b55e73f77 | |||
| 2058b3c5bf | |||
| 4eb17eb9a9 | |||
| 7138b7afb2 | |||
| fe9b9401d3 | |||
| 8c870cabfb | |||
| b8182c077a | |||
| fbbdadd347 | |||
| b54faf36f5 | |||
| a0dc2a6f33 | |||
| f775fca31c | |||
| efebff4ce8 | |||
| 94b2ab43a5 | |||
| a21dbc2da1 | |||
| cf5a9d26d1 | |||
| ef4772b87a | |||
| ffda318476 | |||
| 6aff0d0197 | |||
| b9ebd33703 | |||
| 61e17df22d | |||
| b88d0ad800 | |||
| 7e24f94164 | |||
| 3a239aa71a | |||
| 0e1ae7a798 | |||
| 133c308796 | |||
| 7ea8c861a2 | |||
| 20e0af2bf4 | |||
| 5d0ed4e7cd | |||
| 144629d7dc | |||
| cf36e8c7cb | |||
| 233df5d59d | |||
| 375796063b | |||
| d8a70de8a8 | |||
| f1ee7fc04f | |||
| e8585fb4a7 | |||
| e10cc01f7e | |||
| 79d6db74b1 | |||
| 69d607a76e | |||
| 2c03d89213 | |||
| 11bf9833da | |||
| d2d37255d5 | |||
| bea5b4919e | |||
| b67a040474 | |||
| d40199ec00 | |||
| 6f7390921c | |||
| e5fa0473de | |||
| 889b777eeb | |||
| 8d4626ef81 | |||
| 7c7d2bc959 | |||
| d76a7c5ea2 | |||
| 3641a97b5f | |||
| 5e818e85f3 | |||
| c9d10077af | |||
| 6394214b55 | |||
| bfa26b8b05 | |||
| 15172c86b9 | |||
| daa85630c7 | |||
| 9914e50d8a | |||
| ef59b5ad6b | |||
| 98741a0606 | |||
| 6aadf1683a | |||
| e10cb6bfb1 | |||
| 2fd6d7e1f8 | |||
| 30c12d9c63 | |||
| 3313891205 | |||
| 1e914b8558 | |||
| b9fc30f592 | |||
| e8e67fe093 | |||
| 66e49c764c | |||
| 322d19689f | |||
| 07a6853585 | |||
| f34599c5ad | |||
| 97c5f0944d | |||
| 1e598e2511 | |||
| 966a5e35db | |||
| d760946828 | |||
| 3dda7c3731 | |||
| 3441833521 | |||
| 603950ca65 | |||
| a946ce09c0 | |||
| c196347e58 | |||
| 979491a631 | |||
| fef3581417 | |||
| f6d948b0e0 | |||
| 2f42fdb282 | |||
| b16261c158 | |||
| 3e1d657888 | |||
| 06946d3632 | |||
| cd8530a5c2 | |||
| 91015bd2c1 | |||
| 907b66624b | |||
| 193352c616 | |||
| 2e551e9c4e | |||
| 58c625affd | |||
| b13702972d | |||
| 8c16776d72 | |||
| 7e4405989a | |||
| 15b819703a | |||
| bf2372101f | |||
| d87f88ee4d | |||
| 24266be8db | |||
| 3187d73b64 | |||
| 48f52668be | |||
| f7ef15d7d0 | |||
| d084ac8a58 | |||
| 077d93e283 | |||
| 71409e7712 | |||
| 61a7ad7116 | |||
| d1ab3939e9 | |||
| 0f2f10557c | |||
| ad748743cd | |||
| 844a8daad6 | |||
| 93cc65adfc | |||
| 3a1aa3f6af | |||
| 5b5f124082 | |||
| cd17d3948c | |||
| 7c49ceaf2c | |||
| a156996d61 | |||
| 9438005891 | |||
| aefde88d24 | |||
| 347bca0de4 | |||
| a0f2073eb1 | |||
| 1b0fd2e4b6 | |||
| 4be3d87e04 | |||
| 5ffe9203d3 | |||
| 24cd70dc95 | |||
| 6e9b241fb2 | |||
| 4cc660a3a7 | |||
| 7c48f6d17b | |||
| c4d7ae49ba | |||
| 26dd3828df | |||
| ead7b1a04a | |||
| 1ddd5c2515 | |||
| e1fcbc067a | |||
| 9bf33597c3 | |||
| 17a8e05a90 | |||
| 7a01a6850c | |||
| 6fdcc392dd | |||
| 3e5bea876d | |||
| 976089104b | |||
| 7b1b24860a | |||
| 2e192e79a6 | |||
| 9662b9a2f0 | |||
| 8f5385f9ca | |||
| 0b46e1d807 | |||
| 35a1b8dd62 | |||
| 760b17431a | |||
| 4d3a352889 | |||
| 3fa65989ea | |||
| 1553d4dbc3 | |||
| ac766e2615 | |||
| fee800cb21 | |||
| 7fd0e8de3c | |||
| 1dd1afc972 | |||
| c1e8b1d80c | |||
| fb19d5fec2 | |||
| b2f01679a5 | |||
| c5703462c2 | |||
| deeea09e5d | |||
| b39ffa8fa3 | |||
| 0b1926f089 | |||
| f05fc7b559 | |||
| 37590bf0e0 | |||
| fd25ce1a0d | |||
| f581e1c685 | |||
| 977c4816ed | |||
| 7a022245d4 | |||
| 503377a00b | |||
| a624be1e20 | |||
| 41ad52e495 |
@@ -0,0 +1 @@
|
||||
.git/
|
||||
@@ -1 +1,5 @@
|
||||
*.pyc
|
||||
site
|
||||
.DS_Store
|
||||
|
||||
/.envrc
|
||||
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
language: bash
|
||||
dist: trusty
|
||||
jobs:
|
||||
include:
|
||||
- stage: "Bash linting (shellcheck)"
|
||||
sudo: false
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- debian-sid # Grab shellcheck from the Debian repo (o_O)
|
||||
packages:
|
||||
- shellcheck
|
||||
script: make check
|
||||
|
||||
- stage: "Stack Tests"
|
||||
services: docker
|
||||
env: STACK=heroku-16
|
||||
script: ./tests.sh
|
||||
|
||||
- stage: "Stack Tests"
|
||||
services: docker
|
||||
env: STACK=cedar-14
|
||||
script: ./tests.sh
|
||||
+367
@@ -0,0 +1,367 @@
|
||||
# Python Buildpack Changelog
|
||||
|
||||
# 130
|
||||
|
||||
Better upgrade strategy for pip.
|
||||
|
||||
# 129
|
||||
|
||||
Don't upgrade pip (from v128).
|
||||
|
||||
# 128
|
||||
|
||||
Upgrade pip, pin to Pipenv v11.8.2.
|
||||
|
||||
# 127
|
||||
|
||||
Pin to Pipenv v11.7.1.
|
||||
|
||||
# 126
|
||||
|
||||
Bugfixes.
|
||||
|
||||
# 125
|
||||
|
||||
Bugfixes.
|
||||
|
||||
# 124
|
||||
|
||||
Update buildpack to automatically install `[dev-packages]` during Heroku CI Pipenv builds.
|
||||
|
||||
- Skip installs if Pipfile.lock hasn't changed, and uninstall stale dependencies with Pipenv.
|
||||
- Set `PYTHONPATH` during collectstatic runs.
|
||||
- No longer warn if there is no `Procfile`.
|
||||
- Update Pipenv's "3.6" runtime specifier to point to "3.6.4".
|
||||
|
||||
# 123
|
||||
|
||||
Update gunicorn `init.d` script to allow overrides.
|
||||
|
||||
# 122
|
||||
|
||||
Update default Python to v3.6.4.
|
||||
|
||||
# 121
|
||||
|
||||
Update default Python to v3.6.3.
|
||||
|
||||
# 120
|
||||
|
||||
Use `$ pipenv --deploy`.
|
||||
|
||||
# 119
|
||||
|
||||
Improvements to Pipenv support, warning on unsupported Python versions.
|
||||
|
||||
- We now warn when a user is not using latest 2.x or 3.x Python.
|
||||
- Heroku now supports `[requires]` `python_full_version` in addition to `python_version`.
|
||||
|
||||
# 118
|
||||
|
||||
Improvements to Pipenv support.
|
||||
|
||||
# 117
|
||||
|
||||
Bug fix.
|
||||
|
||||
# 116
|
||||
|
||||
Vendoring improvements.
|
||||
|
||||
- Geos libraries should work on Heroku-16 now.
|
||||
- The libffi/libmemcached vendoring step is now skipped on Heroku-16 (since they are installed in the base image).
|
||||
|
||||
# 115
|
||||
|
||||
Revert a pull request.
|
||||
|
||||
- No longer using `sub_env` for `pip install` step.
|
||||
|
||||
# 114
|
||||
|
||||
- Bugfixes.
|
||||
|
||||
Blacklisting `PYTHONHOME` and `PYTHONPATH` for older apps. Upgrades to nltk support.
|
||||
|
||||
# 113
|
||||
|
||||
Updates to Pipenv support.
|
||||
|
||||
# 112
|
||||
|
||||
Bugfix.
|
||||
|
||||
- Fixed grep output bug.
|
||||
|
||||
# 111
|
||||
|
||||
Linting, bugfixes.
|
||||
|
||||
# 110
|
||||
|
||||
Update default Python to 3.6.2.
|
||||
|
||||
# 109
|
||||
|
||||
Update Default Python to 3.6.1, bugfixes.
|
||||
|
||||
- Fixed automatic pip uninstall of dependencies removed from requirements.txt.
|
||||
|
||||
# 108
|
||||
|
||||
Fix output for collectstatic step.
|
||||
|
||||
# 107
|
||||
|
||||
Bugfix for C dependency installation.
|
||||
|
||||
# 106
|
||||
|
||||
Don't install packages that could mess up packaging.
|
||||
|
||||
- The Python buildpack will automatically remove `six`, `pyparsing`, `appdirs`,
|
||||
`setuptools`, and `distribute` from a `requirements.txt` file now, as these
|
||||
packages are provided by the Python buildpack.
|
||||
|
||||
# 105
|
||||
|
||||
Improvements to output messaging.
|
||||
|
||||
# 104
|
||||
|
||||
General improvements.
|
||||
|
||||
- Fix for Heroku CI.
|
||||
- Use `pkg_resources` to check if a distribution is installed instead of
|
||||
parsing `requirements.txt`. ([#395][395])
|
||||
|
||||
[395]: https://github.com/heroku/heroku-buildpack-python/pull/395
|
||||
|
||||
## 103
|
||||
|
||||
Bug fixes and improvements.
|
||||
|
||||
- Fix for Pipenv.
|
||||
- Fix for Heroku CI.
|
||||
- Improve handling of WEB_CONCURRENCY when using multiple buildpacks.
|
||||
- Adjust environment variables set during the build to more closely match those in the dyno environment (DYNO is now available, STACK is not).
|
||||
- Restore the build cache prior to running bin/pre_compile.
|
||||
|
||||
## 102
|
||||
|
||||
Buildpack code cleanup.
|
||||
|
||||
- Improved messaging around NLTK.
|
||||
|
||||
## 101
|
||||
|
||||
Updated setuptools installation method.
|
||||
|
||||
- Improved pipenv support.
|
||||
|
||||
## 100
|
||||
|
||||
Preliminary pipenv support.
|
||||
|
||||
## 99
|
||||
|
||||
Cleanup.
|
||||
|
||||
## 98
|
||||
|
||||
Official NLTK support and other improvements.
|
||||
|
||||
- Support for `nltk.txt` file for declaring corpora to be downloaded.
|
||||
- Leading zeros for auto-set WEB_CONCURRENCY.
|
||||
|
||||
## 97
|
||||
|
||||
Improved egg-link functionality.
|
||||
|
||||
## 96
|
||||
|
||||
Bugfix.
|
||||
|
||||
## 95
|
||||
|
||||
Improved output support.
|
||||
|
||||
## v94
|
||||
|
||||
Improved support for PyPy.
|
||||
|
||||
## v93
|
||||
|
||||
Improved support for PyPy.
|
||||
|
||||
## v92
|
||||
|
||||
Improved cache functionality and fix egg-links regression.
|
||||
|
||||
## v91
|
||||
|
||||
Bugfix, rolled back to v88.
|
||||
|
||||
## v90
|
||||
|
||||
Bugfix.
|
||||
|
||||
## v89
|
||||
|
||||
Improved cache functionality and fix egg-links regression.
|
||||
|
||||
## v88
|
||||
|
||||
Fixed bug with editable pip installations.
|
||||
|
||||
## v87
|
||||
|
||||
Updated default Python 2.7.13.
|
||||
|
||||
- Python 2.7.13 uses UCS-4 build, more compatibile with linux wheels.
|
||||
- Updated setuptools to v32.1.0.
|
||||
|
||||
## v86
|
||||
|
||||
Refactor and multi-buildpack compatibility.
|
||||
|
||||
## v85
|
||||
|
||||
Packaging fix.
|
||||
|
||||
## v84
|
||||
|
||||
Updated pip and setuptools.
|
||||
|
||||
- Updated pip to v9.0.1.
|
||||
- Updated setuptools to v28.8.0.
|
||||
|
||||
## v83
|
||||
|
||||
Support for Heroku CI.
|
||||
|
||||
- Cffi support for argon2
|
||||
|
||||
## v82 (2016-08-22)
|
||||
|
||||
Update to library detection mechnisms (pip-pop).
|
||||
|
||||
- Updated setuptools to v25.5.0
|
||||
|
||||
## v81 (2016-06-28)
|
||||
|
||||
Updated default Python to 2.7.11.
|
||||
|
||||
- Updated pip to v8.1.2.
|
||||
- Updated setuptools to v23.1.0.
|
||||
|
||||
## v80 (2016-04-05)
|
||||
|
||||
Improved pip-pop compatibility with latest pip releases.
|
||||
|
||||
## v79 (2016-03-22)
|
||||
|
||||
Compatibility improvements with heroku-apt-buildpack.
|
||||
|
||||
## v78 (2016-03-18)
|
||||
|
||||
Added automatic configuration of Gunicorn's `FORWARDED_ALLOW_IPS` setting.
|
||||
|
||||
Improved detection of libffi dependency when using bcrypt via `Django[bcrypt]`.
|
||||
|
||||
Improved GDAL support.
|
||||
|
||||
- GDAL dependency detection now checks for pygdal and is case-insensitive.
|
||||
- The vendored GDAL library has been updated to 1.11.1.
|
||||
- GDAL bootstrapping now also installs the GEOS and Proj.4 libraries.
|
||||
|
||||
Updated pip to 8.1.1 and setuptools to 20.3.
|
||||
|
||||
## v77 (2016-02-10)
|
||||
|
||||
Improvements to warnings and minor bugfix.
|
||||
|
||||
## v76 (2016-02-08)
|
||||
|
||||
Improved Django collectstatic support.
|
||||
|
||||
- `$ python manage.py collectstatic` will only be run if `Django` is present in `requirements.txt`.
|
||||
- If collectstatic fails, the build fails. Full traceback is provided.
|
||||
- `$DISABLE_COLLECTSTATIC`: skip collectstatic step completely (not new).
|
||||
- `$DEBUG_COLLECTSTATIC`: echo environment variables upon collectstatic failure.
|
||||
- Updated build output style.
|
||||
- New warning for outdated Python (via pip `InsecurePlatform` warning).
|
||||
|
||||
## v75 (2016-01-29)
|
||||
|
||||
Updated pip and Setuptools.
|
||||
|
||||
## v74 (2015-12-29)
|
||||
|
||||
Added warnings for lack of Procfile.
|
||||
|
||||
## v72 (2015-12-07)
|
||||
|
||||
Updated default Python to 2.7.11.
|
||||
|
||||
## v72 (2015-12-03)
|
||||
|
||||
Added friendly warnings for common build failures.
|
||||
|
||||
## v70 (2015-10-29)
|
||||
|
||||
Improved compatibility with multi and node.js buildpacks.
|
||||
|
||||
## v69 (2015-10-12)
|
||||
|
||||
Revert to v66.
|
||||
|
||||
## v68 (2015-10-12)
|
||||
|
||||
Fixed .heroku/venv error with modern apps.
|
||||
|
||||
## v67 (2015-10-12)
|
||||
|
||||
Further improved cache compatibility with multi and node.js buildpacks.
|
||||
|
||||
## v66 (2015-10-09)
|
||||
|
||||
Improved compatibility with multi and node.js buildpacks.
|
||||
|
||||
## v65 (2015-10-08)
|
||||
|
||||
Reverted v64.
|
||||
|
||||
## v64 (2015-10-08)
|
||||
|
||||
Improved compatibility with multi and node.js buildpacks.
|
||||
|
||||
## v63 (2015-10-08)
|
||||
|
||||
Updated Pip and Setuptools.
|
||||
|
||||
- Setuptools updated to v18.3.2
|
||||
- Pip updated to v7.1.2
|
||||
|
||||
|
||||
## v62 (2015-08-07)
|
||||
|
||||
Updated Pip and Setuptools.
|
||||
|
||||
- Setuptools updated to v18.1
|
||||
- Pip updated to v7.1.0
|
||||
|
||||
## v61 (2015-06-30)
|
||||
|
||||
Updated Pip and Setuptools.
|
||||
|
||||
- Setuptools updated to v18.0.1
|
||||
- Pip updated to v7.0.3
|
||||
|
||||
## v60 (2015-05-27)
|
||||
|
||||
Default Python is now latest 2.7.10. Updated Pip and Distribute.
|
||||
|
||||
- Default Python version is v2.7.10
|
||||
- Setuptools updated to v16.0
|
||||
- Pip updated to v7.0.1
|
||||
@@ -1,44 +0,0 @@
|
||||
## v5 (02/01/2012)
|
||||
|
||||
Bugfixes:
|
||||
|
||||
* Git requirements 100% work.
|
||||
|
||||
|
||||
## v4 (01/20/2012)
|
||||
|
||||
Features:
|
||||
|
||||
* Updated to virtualenv v1.7 with patched pip v1.2.
|
||||
* Actually activate created virtualenv within compile process.
|
||||
* Use distribute instead of deprecated setuptools.
|
||||
* Automatically destroy and rebuild corrupt virtualenvs.
|
||||
* Refactor django and pylibmc detection.
|
||||
|
||||
Bugfixes:
|
||||
|
||||
* Fixed `package==dev` in requirements with patched pip embedded within virtualenv. Patch upstreamed.
|
||||
* Minor curl/rm flag fixes (thanks, contributors!)
|
||||
|
||||
|
||||
## v3 (12/07/2011)
|
||||
|
||||
Bugfixes:
|
||||
|
||||
* Better django setup.py injection.
|
||||
|
||||
|
||||
## v2 (11/15/2011)
|
||||
|
||||
Features:
|
||||
|
||||
* Support for pylibmc and libmemcached +sasl.
|
||||
|
||||
Bugfixes:
|
||||
|
||||
* Detect when virtualenv is checked in and alert user.
|
||||
|
||||
|
||||
## v1 (10/01/2011)
|
||||
|
||||
* Conception.
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
FROM heroku/heroku:16-build
|
||||
|
||||
WORKDIR /app
|
||||
ENV WORKSPACE_DIR="/app/builds" \
|
||||
S3_BUCKET="lang-python" \
|
||||
S3_PREFIX="heroku-16/"
|
||||
|
||||
RUN apt-get update && apt-get install -y python-pip && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
COPY requirements.txt /app/
|
||||
RUN pip install --disable-pip-version-check --no-cache-dir -r /app/requirements.txt
|
||||
|
||||
COPY . /app
|
||||
@@ -0,0 +1,9 @@
|
||||
MIT License:
|
||||
|
||||
Copyright (C) 2017 Heroku, Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
@@ -1,6 +1,37 @@
|
||||
pip:
|
||||
git clone git@github.com:kennethreitz/pip.git --branch heroku --depth 1
|
||||
rm -fr src/virtualenv-1.7/virtualenv_support/pip-1.0.2.tar.gz
|
||||
rm -fr pip/.git
|
||||
tar -pczf src/virtualenv-1.7/virtualenv_support/pip-1.0.2.tar.gz pip
|
||||
rm -fr pip
|
||||
# These targets are not files
|
||||
.PHONY: tests
|
||||
|
||||
test: test-heroku-16
|
||||
|
||||
check:
|
||||
@shellcheck -x bin/compile bin/detect bin/release bin/test-compile bin/utils bin/warnings
|
||||
@shellcheck -x bin/steps/collectstatic bin/steps/eggpath-fix bin/steps/eggpath-fix2 bin/steps/gdal bin/steps/geo-libs bin/steps/mercurial bin/steps/nltk bin/steps/pip-install bin/steps/pip-uninstall bin/steps/pipenv bin/steps/pipenv-python-version bin/steps/pylibmc bin/steps/python
|
||||
@shellcheck -x bin/steps/hooks/*
|
||||
|
||||
test-cedar-14:
|
||||
@echo "Running tests in docker (cedar-14)..."
|
||||
@docker run -v $(shell pwd):/buildpack:ro --rm -it -e "STACK=cedar-14" heroku/cedar:14 bash -c 'cp -r /buildpack /buildpack_test; cd /buildpack_test/; test/run;'
|
||||
@echo ""
|
||||
|
||||
test-heroku-16:
|
||||
@echo "Running tests in docker (heroku-16)..."
|
||||
@docker run -v $(shell pwd):/buildpack:ro --rm -it -e "STACK=heroku-16" heroku/heroku:16-build bash -c 'cp -r /buildpack /buildpack_test; cd /buildpack_test/; test/run;'
|
||||
@echo ""
|
||||
|
||||
buildenv-heroku-16:
|
||||
@echo "Creating build environment (heroku-16)..."
|
||||
@echo
|
||||
@docker build --pull -t python-buildenv-heroku-16 .
|
||||
@echo
|
||||
@echo "Usage..."
|
||||
@echo
|
||||
@echo " $$ export AWS_ACCESS_KEY_ID=foo AWS_SECRET_ACCESS_KEY=bar # Optional unless deploying"
|
||||
@echo " $$ bob build runtimes/python-2.7.13"
|
||||
@echo " $$ bob deploy runtimes/python-2.7.13"
|
||||
@echo
|
||||
@docker run -it --rm python-buildenv-heroku-16
|
||||
|
||||
tools:
|
||||
git clone https://github.com/kennethreitz/pip-pop.git
|
||||
mv pip-pop/bin/* vendor/pip-pop/
|
||||
rm -fr pip-pop
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
This buildpack includes some vendorized packages to ease installation.
|
||||
|
||||
jq license
|
||||
----------
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
|
||||
shunit2 license
|
||||
---------------
|
||||
|
||||
Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
|
||||
|
||||
This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below.
|
||||
|
||||
0. Additional Definitions.
|
||||
|
||||
As used herein, “this License” refers to version 3 of the GNU Lesser General Public License, and the “GNU GPL” refers to version 3 of the GNU General Public License.
|
||||
|
||||
“The Library” refers to a covered work governed by this License, other than an Application or a Combined Work as defined below.
|
||||
|
||||
An “Application” is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library.
|
||||
|
||||
A “Combined Work” is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the “Linked Version”.
|
||||
|
||||
The “Minimal Corresponding Source” for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version.
|
||||
|
||||
The “Corresponding Application Code” for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work.
|
||||
|
||||
1. Exception to Section 3 of the GNU GPL.
|
||||
|
||||
You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL.
|
||||
|
||||
2. Conveying Modified Versions.
|
||||
|
||||
If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version:
|
||||
|
||||
a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or
|
||||
b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy.
|
||||
3. Object Code Incorporating Material from Library Header Files.
|
||||
|
||||
The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following:
|
||||
|
||||
a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License.
|
||||
b) Accompany the object code with a copy of the GNU GPL and this license document.
|
||||
4. Combined Works.
|
||||
|
||||
You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following:
|
||||
|
||||
a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License.
|
||||
b) Accompany the Combined Work with a copy of the GNU GPL and this license document.
|
||||
c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document.
|
||||
d) Do one of the following:
|
||||
0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.
|
||||
1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version.
|
||||
e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.)
|
||||
5. Combined Libraries.
|
||||
|
||||
You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License.
|
||||
b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
|
||||
6. Revised Versions of the GNU Lesser General Public License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation.
|
||||
|
||||
If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library.
|
||||
|
||||
get-pip.py license
|
||||
------------------
|
||||
|
||||
Copyright (c) 2008-2016 The pip developers (see AUTHORS.txt file)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
|
||||
pip-pop license
|
||||
---------------
|
||||
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2014 Kenneth Reitz.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
@@ -0,0 +1,9 @@
|
||||
[[source]]
|
||||
url = "https://pypi.python.org/simple"
|
||||
verify_ssl = true
|
||||
name = "pypi"
|
||||
|
||||
[dev-packages]
|
||||
|
||||
[packages]
|
||||
"bob-builder" = "==0.0.13"
|
||||
Generated
+52
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"_meta": {
|
||||
"hash": {
|
||||
"sha256": "36d17c46a8b1b844b3cae475f6f42d6c0a9e59b2a9685cbcdc0985656a7a129f"
|
||||
},
|
||||
"host-environment-markers": {
|
||||
"implementation_name": "cpython",
|
||||
"implementation_version": "3.6.3",
|
||||
"os_name": "posix",
|
||||
"platform_machine": "x86_64",
|
||||
"platform_python_implementation": "CPython",
|
||||
"platform_release": "16.7.0",
|
||||
"platform_system": "Darwin",
|
||||
"platform_version": "Darwin Kernel Version 16.7.0: Thu Jun 15 17:36:27 PDT 2017; root:xnu-3789.70.16~2/RELEASE_X86_64",
|
||||
"python_full_version": "3.6.3",
|
||||
"python_version": "3.6",
|
||||
"sys_platform": "darwin"
|
||||
},
|
||||
"pipfile-spec": 6,
|
||||
"requires": {},
|
||||
"sources": [
|
||||
{
|
||||
"name": "pypi",
|
||||
"url": "https://pypi.python.org/simple",
|
||||
"verify_ssl": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"default": {
|
||||
"bob-builder": {
|
||||
"hashes": [
|
||||
"sha256:b4de49a8e436fcaf82236ea43f78413b4a4c92100726e382ab57b6bdfb38fe64",
|
||||
"sha256:288e3e765c4890fe9a63ae52ac6b4a963c13fe508482c70ff701a5ae21b9a673"
|
||||
],
|
||||
"version": "==0.0.13"
|
||||
},
|
||||
"boto": {
|
||||
"hashes": [
|
||||
"sha256:13be844158d1bd80a94c972c806ec8381b9ea72035aa06123c5db6bc6a6f3ead",
|
||||
"sha256:deb8925b734b109679e3de65856018996338758f4b916ff4fe7bb62b6d7000d1"
|
||||
],
|
||||
"version": "==2.48.0"
|
||||
},
|
||||
"docopt": {
|
||||
"hashes": [
|
||||
"sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"
|
||||
],
|
||||
"version": "==0.6.2"
|
||||
}
|
||||
},
|
||||
"develop": {}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||

|
||||
|
||||
# Heroku Buildpack: Python
|
||||
|
||||
[](https://travis-ci.org/heroku/heroku-buildpack-python)
|
||||
|
||||
This is the official [Heroku buildpack](https://devcenter.heroku.com/articles/buildpacks) for Python apps, powered by [Pipenv](http://docs.pipenv.org/), [pip](https://pip.pypa.io/) and other excellent software.
|
||||
|
||||
Recommended web frameworks include **Django** and **Flask**. The recommended webserver is **Gunicorn**. There are no restrictions around what software can be used (as long as it's pip-installable). Web processes must bind to `$PORT`, and only the HTTP protocol is permitted for incoming connections.
|
||||
|
||||
Python packages with C dependencies that are not [available on the stack image](https://devcenter.heroku.com/articles/stack-packages) are generally not supported, unless `manylinux` wheels are provided by the package maintainers (common). For recommended solutions, check out [this article](https://devcenter.heroku.com/articles/python-c-deps) for more information.
|
||||
|
||||
See it in Action
|
||||
----------------
|
||||
|
||||
Deploying a Python application couldn't be easier:
|
||||
|
||||
$ ls
|
||||
Pipfile Pipfile.lock Procfile web.py
|
||||
|
||||
$ heroku create --buildpack heroku/python
|
||||
|
||||
$ git push heroku master
|
||||
…
|
||||
-----> Python app detected
|
||||
-----> Installing python-3.6.4
|
||||
-----> Installing pip
|
||||
-----> Installing requirements with Pipenv 11.7.1…
|
||||
...
|
||||
Installing dependencies from Pipfile…
|
||||
-----> Discovering process types
|
||||
Procfile declares types -> (none)
|
||||
|
||||
A `Pipfile` or `requirements.txt` must be present at the root of your application's repository.
|
||||
|
||||
You can also specify the latest production release of this buildpack for upcoming builds of an existing application:
|
||||
|
||||
$ heroku buildpacks:set heroku/python
|
||||
|
||||
|
||||
Specify a Python Runtime
|
||||
------------------------
|
||||
|
||||
Specific versions of the Python runtime can be specified in your `Pipfile`:
|
||||
|
||||
[requires]
|
||||
python_version = "2.7"
|
||||
|
||||
Or, more specifically:
|
||||
|
||||
[requires]
|
||||
python_full_version = "2.7.14"
|
||||
|
||||
Or, with a `runtime.txt` file:
|
||||
|
||||
$ cat runtime.txt
|
||||
python-2.7.14
|
||||
|
||||
Runtime options include:
|
||||
|
||||
- `python-3.6.4`
|
||||
- `python-2.7.14`
|
||||
@@ -1,43 +0,0 @@
|
||||
Heroku buildpack: Python
|
||||
========================
|
||||
|
||||
This is a [Heroku buildpack](http://devcenter.heroku.com/articles/buildpack) for Python apps.
|
||||
It uses [virtualenv](http://www.virtualenv.org/) and [pip](http://www.pip-installer.org/).
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
Example usage:
|
||||
|
||||
$ ls
|
||||
Procfile requirements.txt web.py
|
||||
|
||||
$ heroku create --stack cedar --buildpack git@github.com:heroku/heroku-buildpack-python.git
|
||||
|
||||
$ git push heroku master
|
||||
...
|
||||
-----> Heroku receiving push
|
||||
-----> Fetching custom build pack... done
|
||||
-----> Python app detected
|
||||
-----> Preparing virtualenv version 1.6.4
|
||||
New python executable in ./bin/python
|
||||
Installing setuptools............done.
|
||||
Installing pip...............done.
|
||||
-----> Installing dependencies using pip version 1.0.2
|
||||
Downloading/unpacking Flask==0.7.2 (from -r requirements.txt (line 1))
|
||||
Downloading/unpacking Werkzeug>=0.6.1 (from Flask==0.7.2->-r requirements.txt (line 1))
|
||||
Downloading/unpacking Jinja2>=2.4 (from Flask==0.7.2->-r requirements.txt (line 1))
|
||||
Installing collected packages: Flask, Werkzeug, Jinja2
|
||||
Successfully installed Flask Werkzeug Jinja2
|
||||
Cleaning up...
|
||||
|
||||
The buildpack will detect your app as Python if it has the file `requirements.txt` in the root. It will detect your app as Python/Django if there is an additional `settings.py` in a project subdirectory.
|
||||
|
||||
It will use virtualenv and pip to install your dependencies, vendoring a copy of the Python runtime into your slug. The `bin/`, `include/` and `lib/` directories will be cached between builds to allow for faster pip install time.
|
||||
|
||||
Hacking
|
||||
-------
|
||||
|
||||
To use this buildpack, fork it on Github. Push up changes to your fork, then create a test app with `--buildpack <your-github-url>` and push to it.
|
||||
|
||||
To change the vendored virtualenv, unpack the desired version to the `src/` folder, and update the virtualenv() function in `bin/compile` to prepend the virtualenv module directory to the path. The virtualenv release vendors its own versions of pip and setuptools.
|
||||
+244
-81
@@ -1,112 +1,275 @@
|
||||
#!/usr/bin/env bash
|
||||
# bin/compile <build-dir> <cache-dir>
|
||||
|
||||
# The Heroku Python Buildpack. This script accepts parameters for a build
|
||||
# directory, a cache directory, and a directory for app environment variables.
|
||||
|
||||
# Warning: there are a few hacks in this script to accommodate excellent builds
|
||||
# on Heroku. No guarantee for external compatibility is made. However,
|
||||
# everything should work fine outside of the Heroku environment, if the
|
||||
# environment is setup correctly.
|
||||
|
||||
# Usage:
|
||||
#
|
||||
# $ bin/compile <build-dir> <cache-dir> <env-path>
|
||||
|
||||
# Fail fast and fail hard.
|
||||
set -eo pipefail
|
||||
|
||||
# Prepend proper path for virtualenv hackery. Will be deprecated soon.
|
||||
# Standard Library.
|
||||
export BPLOG_PREFIX="buildpack.python"
|
||||
export BUILDPACK_LOG_FILE=${BUILDPACK_LOG_FILE:-/dev/null}
|
||||
|
||||
[ "$BUILDPACK_XTRACE" ] && set -o xtrace
|
||||
|
||||
# Prepend proper path for virtualenv hackery. This will be deprecated soon.
|
||||
export PATH=:/usr/local/bin:$PATH
|
||||
|
||||
BIN_DIR=$(cd $(dirname $0); pwd) # absolute path
|
||||
ROOT_DIR=$(dirname $BIN_DIR)
|
||||
# Paths.
|
||||
BIN_DIR=$(cd "$(dirname "$0")"; pwd) # absolute path
|
||||
ROOT_DIR=$(dirname "$BIN_DIR")
|
||||
BUILD_DIR=$1
|
||||
CACHE_DIR=$2
|
||||
ENV_DIR=$3
|
||||
|
||||
NAME=$($BIN_DIR/detect $BUILD_DIR)
|
||||
PIP_DOWNLOAD_CACHE=${PIP_DOWNLOAD_CACHE:-$CACHE_DIR/pip_downloads}
|
||||
VIRTUALENV_DIRS="bin include lib"
|
||||
VENDORED_MEMCACHED="http://cl.ly/0a191R3K160t1w1P0N25/vendor-libmemcached.tar.gz"
|
||||
export BUILD_DIR CACHE_DIR ENV_DIR
|
||||
|
||||
unset GIT_DIR
|
||||
export PIP_DOWNLOAD_CACHE
|
||||
|
||||
indent() {
|
||||
RE="s/^/ /"
|
||||
[ $(uname) == "Darwin" ] && sed -l "$RE" || sed -u "$RE"
|
||||
}
|
||||
|
||||
function virtualenv (){
|
||||
python "$ROOT_DIR/src/virtualenv-1.7/virtualenv.py" "$@"
|
||||
}
|
||||
|
||||
cd $BUILD_DIR
|
||||
|
||||
# Reject a non-packaged Django app.
|
||||
if [ "$NAME" = "Python" ]; then
|
||||
[ -f manage.py ] && [ -f settings.py ] && { echo " ! Django app must be in a package subdirectory"; exit 1; }
|
||||
VENDOR_URL="https://lang-python.s3.amazonaws.com/$STACK"
|
||||
if [[ -n ${BUILDPACK_VENDOR_URL:-} ]]; then
|
||||
VENDOR_URL="$BUILDPACK_VENDOR_URL"
|
||||
fi
|
||||
export VENDOR_URL
|
||||
|
||||
# Warn a checked-in virtualenv.
|
||||
if [ -d "lib" ] || [ -d "bin" ]; then
|
||||
echo " ! You have a virtualenv checked in. You should ignore the appropriate paths in your repo. See http://devcenter.heroku.com/articles/gitignore for more info.";
|
||||
fi
|
||||
# Python defaults
|
||||
DEFAULT_PYTHON_VERSION="python-3.6.4"
|
||||
LATEST_3="python-3.6.4"
|
||||
LATEST_2="python-2.7.14"
|
||||
|
||||
# Reject a conflicting checked-in virtualenv.
|
||||
if [ -f "lib/python2.7" ]; then
|
||||
echo " ! Checked-in virtualenv conflict."
|
||||
exit 1;
|
||||
fi
|
||||
DEFAULT_PYTHON_STACK="cedar-14"
|
||||
PIP_UPDATE="9.0.1"
|
||||
|
||||
# Copy artifacts out of cache if exists.
|
||||
mkdir -p $CACHE_DIR
|
||||
for dir in $VIRTUALENV_DIRS; do
|
||||
cp -R $CACHE_DIR/$dir . &> /dev/null || true
|
||||
done
|
||||
export DEFAULT_PYTHON_VERSION DEFAULT_PYTHON_STACK PIP_UPDATE LATEST_2 LATEST_3
|
||||
|
||||
# Create virtualenv. Rebuild if corrupt.
|
||||
set +e
|
||||
echo "-----> Preparing virtualenv version $(virtualenv --version)"
|
||||
# Common Problem Warnings
|
||||
WARNINGS_LOG=$(mktemp)
|
||||
export WARNINGS_LOG
|
||||
export RECOMMENDED_PYTHON_VERSION=$DEFAULT_PYTHON_VERSION
|
||||
|
||||
# Try to create the virtualenv.
|
||||
OUT=$(virtualenv --distribute --never-download --prompt=venv . 2>&1)
|
||||
# Setup vendored tools and pip-pop (pip-diff)
|
||||
export PATH=$PATH:$ROOT_DIR/vendor/:$ROOT_DIR/vendor/pip-pop
|
||||
|
||||
# If there's an error, purge and recreate.
|
||||
[ $? -ne 0 ] && {
|
||||
echo " ! Virtualenv corrupt, rebuilding."
|
||||
for dir in $VIRTUALENV_DIRS; do
|
||||
rm -fr $dir &> /dev/null || true
|
||||
done
|
||||
OUT=$(virtualenv --distribute --never-download --prompt=venv . )
|
||||
}
|
||||
echo "$OUT" | indent
|
||||
# Support Anvil Build_IDs
|
||||
[ ! "$SLUG_ID" ] && SLUG_ID="defaultslug"
|
||||
[ ! "$REQUEST_ID" ] && REQUEST_ID=$SLUG_ID
|
||||
[ ! "$STACK" ] && STACK=$DEFAULT_PYTHON_STACK
|
||||
|
||||
set -e
|
||||
# Sanitizing environment variables.
|
||||
unset GIT_DIR PYTHONHOME PYTHONPATH
|
||||
unset RECEIVE_DATA RUN_KEY BUILD_INFO DEPLOY LOG_TOKEN
|
||||
unset CYTOKINE_LOG_FILE GEM_PATH
|
||||
|
||||
# Create set-aside .heroku folder.
|
||||
# Syntax sugar.
|
||||
# shellcheck source=bin/utils
|
||||
source "$BIN_DIR/utils"
|
||||
|
||||
# Import collection of warnings.
|
||||
# shellcheck source=bin/warnings
|
||||
source "$BIN_DIR/warnings"
|
||||
|
||||
# we need to put a bunch of symlinks in there later
|
||||
mkdir -p /app/.heroku
|
||||
|
||||
# Set up outputs under new context
|
||||
PROFILE_PATH="$BUILD_DIR/.profile.d/python.sh"
|
||||
EXPORT_PATH="$BIN_DIR/../export"
|
||||
GUNICORN_PROFILE_PATH="$BUILD_DIR/.profile.d/python.gunicorn.sh"
|
||||
WEB_CONCURRENCY_PROFILE_PATH="$BUILD_DIR/.profile.d/WEB_CONCURRENCY.sh"
|
||||
|
||||
# We'll need to send these statics to other scripts we `source`.
|
||||
export BUILD_DIR CACHE_DIR BIN_DIR PROFILE_PATH EXPORT_PATH
|
||||
|
||||
# Prepend proper environment variables for Python use.
|
||||
export PATH=/app/.heroku/python/bin:/app/.heroku/vendor/bin:$PATH
|
||||
export PYTHONUNBUFFERED=1
|
||||
export LANG=en_US.UTF-8
|
||||
export C_INCLUDE_PATH=/app/.heroku/vendor/include:/app/.heroku/python/include:$C_INCLUDE_PATH
|
||||
export CPLUS_INCLUDE_PATH=/app/.heroku/vendor/include:/app/.heroku/python/include:$CPLUS_INCLUDE_PATH
|
||||
export LIBRARY_PATH=/app/.heroku/vendor/lib:/app/.heroku/python/lib:$LIBRARY_PATH
|
||||
export LD_LIBRARY_PATH=/app/.heroku/vendor/lib:/app/.heroku/python/lib:$LD_LIBRARY_PATH
|
||||
export PKG_CONFIG_PATH=/app/.heroku/vendor/lib/pkg-config:/app/.heroku/python/lib/pkg-config:$PKG_CONFIG_PATH
|
||||
|
||||
# Switch to the repo's context.
|
||||
cd "$BUILD_DIR"
|
||||
|
||||
# Prepare the cache.
|
||||
mkdir -p "$CACHE_DIR"
|
||||
|
||||
# Restore old artifacts from the cache.
|
||||
mkdir -p .heroku
|
||||
|
||||
cp -R "$CACHE_DIR/.heroku/python" .heroku/ &> /dev/null || true
|
||||
cp -R "$CACHE_DIR/.heroku/python-stack" .heroku/ &> /dev/null || true
|
||||
cp -R "$CACHE_DIR/.heroku/python-version" .heroku/ &> /dev/null || true
|
||||
cp -R "$CACHE_DIR/.heroku/vendor" .heroku/ &> /dev/null || true
|
||||
if [[ -d "$CACHE_DIR/.heroku/src" ]]; then
|
||||
cp -R "$CACHE_DIR/.heroku/src" .heroku/ &> /dev/null || true
|
||||
fi
|
||||
|
||||
# Experimental pre_compile hook.
|
||||
# shellcheck source=bin/steps/hooks/pre_compile
|
||||
source "$BIN_DIR/steps/hooks/pre_compile"
|
||||
|
||||
# Sticky runtimes.
|
||||
if [ -f "$CACHE_DIR/.heroku/python-version" ]; then
|
||||
DEFAULT_PYTHON_VERSION=$(cat "$CACHE_DIR/.heroku/python-version")
|
||||
fi
|
||||
|
||||
# Stack fallback for non-declared caches.
|
||||
if [ -f "$CACHE_DIR/.heroku/python-stack" ]; then
|
||||
CACHED_PYTHON_STACK=$(cat "$CACHE_DIR/.heroku/python-stack")
|
||||
else
|
||||
CACHED_PYTHON_STACK=$STACK
|
||||
fi
|
||||
|
||||
export CACHED_PYTHON_STACK
|
||||
|
||||
# Pipenv Python version support.
|
||||
# shellcheck source=bin/steps/pipenv-python-version
|
||||
source "$BIN_DIR/steps/pipenv-python-version"
|
||||
|
||||
# If no runtime given, assume default version.
|
||||
if [ ! -f runtime.txt ]; then
|
||||
echo "$DEFAULT_PYTHON_VERSION" > runtime.txt
|
||||
fi
|
||||
|
||||
mkdir -p "$(dirname "$PROFILE_PATH")"
|
||||
mkdir -p /app/.heroku/src
|
||||
|
||||
if [[ $BUILD_DIR != '/app' ]]; then
|
||||
# python expects to reside in /app, so set up symlinks
|
||||
# we will not remove these later so subsequent buildpacks can still invoke it
|
||||
ln -nsf "$BUILD_DIR/.heroku/python" /app/.heroku/python
|
||||
ln -nsf "$BUILD_DIR/.heroku/vendor" /app/.heroku/vendor
|
||||
# Note: .heroku/src is copied in later.
|
||||
fi
|
||||
|
||||
# Install Python.
|
||||
let start=$(nowms)
|
||||
# shellcheck source=bin/steps/python
|
||||
source "$BIN_DIR/steps/python"
|
||||
mtime "python.install.time" "${start}"
|
||||
|
||||
# Pipenv support.
|
||||
# shellcheck source=bin/steps/pipenv
|
||||
source "$BIN_DIR/steps/pipenv"
|
||||
|
||||
# Uninstall removed dependencies with Pip.
|
||||
let start=$(nowms)
|
||||
# shellcheck source=bin/steps/pip-uninstall
|
||||
source "$BIN_DIR/steps/pip-uninstall"
|
||||
mtime "pip.uninstall.time" "${start}"
|
||||
|
||||
|
||||
# If no requirements.txt file given, assume `setup.py develop` is intended.
|
||||
if [ ! -f requirements.txt ] && [ ! -f Pipfile ]; then
|
||||
echo "-e ." > requirements.txt
|
||||
fi
|
||||
|
||||
# Fix egg-links.
|
||||
# shellcheck source=bin/steps/eggpath-fix
|
||||
source "$BIN_DIR/steps/eggpath-fix"
|
||||
|
||||
# Mercurial support.
|
||||
# shellcheck source=bin/steps/mercurial
|
||||
source "$BIN_DIR/steps/mercurial"
|
||||
|
||||
# Pylibmc support.
|
||||
source $BIN_DIR/steps/pylibmc
|
||||
# shellcheck source=bin/steps/pylibmc
|
||||
source "$BIN_DIR/steps/pylibmc"
|
||||
|
||||
# Activate the virtualenv.
|
||||
echo "-----> Activating virtualenv"
|
||||
source bin/activate
|
||||
# Support for Geo libraries.
|
||||
# shellcheck source=bin/steps/geo-libs
|
||||
sub_env "$BIN_DIR/steps/geo-libs"
|
||||
|
||||
# Install mercurial, if needed.
|
||||
if (grep -Fiq "hg+" requirements.txt) then
|
||||
pip install --use-mirrors mercurial | indent
|
||||
# GDAL support.
|
||||
# shellcheck source=bin/steps/gdal
|
||||
source "$BIN_DIR/steps/gdal"
|
||||
|
||||
# Install dependencies with Pip (where the magic happens).
|
||||
let start=$(nowms)
|
||||
# shellcheck source=bin/steps/pip-install
|
||||
source "$BIN_DIR/steps/pip-install"
|
||||
mtime "pip.install.time" "${start}"
|
||||
|
||||
# Support for NLTK corpora.
|
||||
let start=$(nowms)
|
||||
sub_env "$BIN_DIR/steps/nltk"
|
||||
mtime "nltk.download.time" "${start}"
|
||||
|
||||
# Support for pip install -e.
|
||||
# In CI, $BUILD_DIR is /app.
|
||||
if [[ ! "$BUILD_DIR" == "/app" ]]; then
|
||||
rm -fr "$BUILD_DIR/.heroku/src"
|
||||
deep-cp /app/.heroku/src "$BUILD_DIR/.heroku/src"
|
||||
fi
|
||||
|
||||
# Install dependencies.
|
||||
echo "-----> Installing dependencies using pip version $(pip --version | awk '{print $2}')"
|
||||
pip install --use-mirrors -r requirements.txt --src ./.heroku/src | indent
|
||||
|
||||
# Django support.
|
||||
if [ "$NAME" = "Python/Django" ]; then
|
||||
source $BIN_DIR/steps/django
|
||||
# Django collectstatic support.
|
||||
let start=$(nowms)
|
||||
sub_env "$BIN_DIR/steps/collectstatic"
|
||||
mtime "collectstatic.time" "${start}"
|
||||
|
||||
# Create .profile script for application runtime environment variables.
|
||||
set_env PATH "\$HOME/.heroku/python/bin:\$PATH"
|
||||
set_env PYTHONUNBUFFERED true
|
||||
set_env PYTHONHOME "\$HOME/.heroku/python"
|
||||
|
||||
set_env LIBRARY_PATH "\$HOME/.heroku/vendor/lib:\$HOME/.heroku/python/lib:\$LIBRARY_PATH"
|
||||
set_env LD_LIBRARY_PATH "\$HOME/.heroku/vendor/lib:\$HOME/.heroku/python/lib:\$LD_LIBRARY_PATH"
|
||||
|
||||
set_default_env LANG en_US.UTF-8
|
||||
set_default_env PYTHONHASHSEED random
|
||||
set_default_env PYTHONPATH "\$HOME"
|
||||
|
||||
# python expects to be in /app, if at runtime, it is not, set
|
||||
# up symlinks... this can occur when the subdir buildpack is used
|
||||
cat <<EOT >> "$PROFILE_PATH"
|
||||
if [[ \$HOME != "/app" ]]; then
|
||||
mkdir -p /app/.heroku
|
||||
ln -nsf "\$HOME/.heroku/python" /app/.heroku/python
|
||||
ln -nsf "\$HOME/.heroku/vendor" /app/.heroku/vendor
|
||||
fi
|
||||
EOT
|
||||
|
||||
# Make virtualenv relocatable.
|
||||
set +e
|
||||
OUT=$(virtualenv --relocatable .)
|
||||
[ $? -ne 0 ] && {
|
||||
echo " ! Error making virtualenv relocatable"
|
||||
echo "$OUT" | indent
|
||||
exit 1
|
||||
}
|
||||
set -e
|
||||
# Install sane-default script for $WEB_CONCURRENCY and $FORWARDED_ALLOW_IPS.
|
||||
cp "$ROOT_DIR/vendor/WEB_CONCURRENCY.sh" "$WEB_CONCURRENCY_PROFILE_PATH"
|
||||
cp "$ROOT_DIR/vendor/python.gunicorn.sh" "$GUNICORN_PROFILE_PATH"
|
||||
|
||||
|
||||
# Experimental post_compile hook.
|
||||
# shellcheck source=bin/steps/hooks/post_compile
|
||||
source "$BIN_DIR/steps/hooks/post_compile"
|
||||
|
||||
# Fix egg-links, again.
|
||||
# shellcheck source=bin/steps/eggpath-fix2
|
||||
source "$BIN_DIR/steps/eggpath-fix2"
|
||||
|
||||
# Store new artifacts in cache.
|
||||
for dir in $VIRTUALENV_DIRS; do
|
||||
rm -rf $CACHE_DIR/$dir
|
||||
cp -R $dir $CACHE_DIR/
|
||||
done
|
||||
|
||||
rm -rf "$CACHE_DIR/.heroku/python"
|
||||
rm -rf "$CACHE_DIR/.heroku/python-version"
|
||||
rm -rf "$CACHE_DIR/.heroku/python-stack"
|
||||
rm -rf "$CACHE_DIR/.heroku/vendor"
|
||||
rm -rf "$CACHE_DIR/.heroku/src"
|
||||
|
||||
mkdir -p "$CACHE_DIR/.heroku"
|
||||
cp -R .heroku/python "$CACHE_DIR/.heroku/"
|
||||
cp -R .heroku/python-version "$CACHE_DIR/.heroku/"
|
||||
cp -R .heroku/python-stack "$CACHE_DIR/.heroku/" &> /dev/null || true
|
||||
cp -R .heroku/vendor "$CACHE_DIR/.heroku/" &> /dev/null || true
|
||||
if [[ -d .heroku/src ]]; then
|
||||
cp -R .heroku/src "$CACHE_DIR/.heroku/" &> /dev/null || true
|
||||
fi
|
||||
|
||||
# Measure the size of the Python installation.
|
||||
# shellcheck disable=SC2119
|
||||
mmeasure 'python.size' "$(measure-size)"
|
||||
|
||||
+18
-4
@@ -1,8 +1,22 @@
|
||||
#!/usr/bin/env bash
|
||||
# bin/detect <build-dir>
|
||||
|
||||
# This script serves as the
|
||||
# [**Python Buildpack**](https://github.com/heroku/heroku-buildpack-python)
|
||||
# detector.
|
||||
#
|
||||
# A [buildpack](https://devcenter.heroku.com/articles/buildpacks) is an
|
||||
# adapter between a Python application and Heroku's runtime.
|
||||
|
||||
# ## Usage
|
||||
# Compiling an app into a slug is simple:
|
||||
#
|
||||
# $ bin/detect <build-dir> <cache-dir>
|
||||
|
||||
BUILD_DIR=$1
|
||||
[ -f $BUILD_DIR/requirements.txt ] || exit 1 # fail fast if no requirements.txt
|
||||
|
||||
# 'Python/Django' if there is a [mysite]/settings.py file present; otherwise 'Python'
|
||||
ls $BUILD_DIR/**/settings.py &> /dev/null && echo Python/Django || echo Python
|
||||
# Exit early if app is clearly not Python.
|
||||
if [ ! -f "$BUILD_DIR/requirements.txt" ] && [ ! -f "$BUILD_DIR/setup.py" ] && [ ! -f "$BUILD_DIR/Pipfile" ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo Python
|
||||
|
||||
+7
-15
@@ -1,30 +1,22 @@
|
||||
#!/usr/bin/env bash
|
||||
# bin/release <build-dir>
|
||||
|
||||
BIN_DIR=$(cd $(dirname $0); pwd) # absolute path
|
||||
BUILD_DIR=$1
|
||||
NAME=$($BIN_DIR/detect $BUILD_DIR) || exit 1
|
||||
|
||||
MANAGE_FILE=$(cd "$BUILD_DIR" && find . -maxdepth 3 -type f -name 'manage.py' | head -1)
|
||||
MANAGE_FILE=${MANAGE_FILE:2}
|
||||
|
||||
cat <<EOF
|
||||
---
|
||||
config_vars:
|
||||
PATH: bin:/usr/local/bin:/usr/bin:/bin
|
||||
PYTHONUNBUFFERED: true
|
||||
LIBRARY_PATH: .heroku/vendor/lib
|
||||
LD_LIBRARY_PATH: .heroku/vendor/lib
|
||||
|
||||
EOF
|
||||
|
||||
|
||||
[ "$NAME" = "Python/Django" ] || exit 0
|
||||
|
||||
SETTINGS_FILE=$(cd $BUILD_DIR && ls **/settings.py | head -1)
|
||||
PROJECT=$(dirname $SETTINGS_FILE)
|
||||
|
||||
if [[ $MANAGE_FILE ]]; then
|
||||
cat <<EOF
|
||||
|
||||
addons:
|
||||
shared-database:5mb
|
||||
|
||||
default_process_types:
|
||||
web: python $PROJECT/manage.py runserver 0.0.0.0:\$PORT --noreload
|
||||
- heroku-postgresql
|
||||
EOF
|
||||
fi
|
||||
|
||||
Executable
+89
@@ -0,0 +1,89 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Django Collectstatic runner. If you have Django installed, collectstatic will
|
||||
# automatically be executed as part of the build process. If collectstatic
|
||||
# fails, your build fails.
|
||||
|
||||
# This functionality will only activate if Django is in requirements.txt.
|
||||
|
||||
# Runtime arguments:
|
||||
# - $DISABLE_COLLECTSTATIC: disables this functionality.
|
||||
# - $DEBUG_COLLECTSTATIC: upon failure, print out environment variables.
|
||||
|
||||
# shellcheck source=bin/utils
|
||||
source $BIN_DIR/utils
|
||||
|
||||
# Location of 'manage.py', if it exists.
|
||||
MANAGE_FILE=$(find . -maxdepth 3 -type f -name 'manage.py' -printf '%d\t%P\n' | sort -nk1 | cut -f2 | head -1)
|
||||
MANAGE_FILE=${MANAGE_FILE:-fakepath}
|
||||
|
||||
# Legacy file-based support for $DISABLE_COLLECTSTATIC
|
||||
[ -f .heroku/collectstatic_disabled ] && DISABLE_COLLECTSTATIC=1
|
||||
|
||||
# Ensure that Django is explicitly specified in requirements.txt
|
||||
sp-grep -s django && DJANGO_INSTALLED=1
|
||||
|
||||
|
||||
if [ ! "$DISABLE_COLLECTSTATIC" ] && [ -f "$MANAGE_FILE" ] && [ "$DJANGO_INSTALLED" ]; then
|
||||
set +e
|
||||
|
||||
puts-step "$ python $MANAGE_FILE collectstatic --noinput"
|
||||
|
||||
# Run collectstatic, cleanup some of the noisy output.
|
||||
PYTHONPATH=${PYTHONPATH:-.}
|
||||
export PYTHONPATH
|
||||
|
||||
# Create a temporary file for collecting the collectstaic logs.
|
||||
COLLECTSTATIC_LOG=$(mktemp)
|
||||
|
||||
python "$MANAGE_FILE" collectstatic --noinput --traceback 2>&1 | tee "$COLLECTSTATIC_LOG" | sed '/^Post-processed/d;/^Copying/d;/^$/d' | indent
|
||||
COLLECTSTATIC_STATUS="${PIPESTATUS[0]}"
|
||||
|
||||
set -e
|
||||
|
||||
# Display a warning if collectstatic failed.
|
||||
[ "$COLLECTSTATIC_STATUS" -ne 0 ] && {
|
||||
|
||||
mcount "failure.collectstatic"
|
||||
|
||||
if grep -q 'SyntaxError' "$COLLECTSTATIC_LOG"; then
|
||||
mcount "failure.collectstatic.syntax-error"
|
||||
fi
|
||||
|
||||
if grep -q 'ImproperlyConfigured' "$COLLECTSTATIC_LOG"; then
|
||||
mcount "failure.collectstatic.improper-configuration"
|
||||
fi
|
||||
|
||||
if grep -q 'The CSS file' "$COLLECTSTATIC_LOG"; then
|
||||
mcount "failure.collectstatic.fancy-references"
|
||||
fi
|
||||
|
||||
if grep -q 'OSError' "$COLLECTSTATIC_LOG"; then
|
||||
mcount "failure.collectstatic.missing-file"
|
||||
fi
|
||||
|
||||
echo
|
||||
echo " ! Error while running '$ python $MANAGE_FILE collectstatic --noinput'."
|
||||
echo " See traceback above for details."
|
||||
echo
|
||||
echo " You may need to update application code to resolve this error."
|
||||
echo " Or, you can disable collectstatic for this application:"
|
||||
echo
|
||||
echo " $ heroku config:set DISABLE_COLLECTSTATIC=1"
|
||||
echo
|
||||
echo " https://devcenter.heroku.com/articles/django-assets"
|
||||
|
||||
# Additionally, dump out the environment, if debug mode is on.
|
||||
if [ "$DEBUG_COLLECTSTATIC" ]; then
|
||||
echo
|
||||
echo "****** Collectstatic environment variables:"
|
||||
echo
|
||||
env | indent
|
||||
fi
|
||||
|
||||
# Abort the build.
|
||||
exit 1
|
||||
}
|
||||
|
||||
echo
|
||||
fi
|
||||
@@ -1,49 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
echo "-----> Injecting Django settings..."
|
||||
|
||||
SETTINGS_FILE=$(ls **/settings.py | head -1)
|
||||
PROJECT=$(dirname $SETTINGS_FILE)
|
||||
echo "Injecting code into $SETTINGS_FILE to read from DATABASE_URL" | indent
|
||||
|
||||
cat >>$SETTINGS_FILE <<EOF
|
||||
|
||||
import os
|
||||
import sys
|
||||
import urlparse
|
||||
|
||||
# Register database schemes in URLs.
|
||||
urlparse.uses_netloc.append('postgres')
|
||||
urlparse.uses_netloc.append('mysql')
|
||||
|
||||
try:
|
||||
|
||||
# Check to make sure DATABASES is set in settings.py file.
|
||||
# If not default to {}
|
||||
|
||||
if 'DATABASES' not in locals():
|
||||
DATABASES = {}
|
||||
|
||||
if 'DATABASE_URL' in os.environ:
|
||||
url = urlparse.urlparse(os.environ['DATABASE_URL'])
|
||||
|
||||
# Ensure default database exists.
|
||||
DATABASES['default'] = DATABASES.get('default', {})
|
||||
|
||||
# Update with environment configuration.
|
||||
DATABASES['default'].update({
|
||||
'NAME': url.path[1:],
|
||||
'USER': url.username,
|
||||
'PASSWORD': url.password,
|
||||
'HOST': url.hostname,
|
||||
'PORT': url.port,
|
||||
})
|
||||
if url.scheme == 'postgres':
|
||||
DATABASES['default']['ENGINE'] = 'django.db.backends.postgresql_psycopg2'
|
||||
|
||||
if url.scheme == 'mysql':
|
||||
DATABASES['default']['ENGINE'] = 'django.db.backends.mysql'
|
||||
except Exception:
|
||||
print 'Unexpected error:', sys.exc_info()
|
||||
|
||||
EOF
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set +e
|
||||
# delete any existing egg links, to uninstall exisisting installations.
|
||||
find .heroku/python/lib/python*/site-packages/ -name "*.egg-link" -delete 2> /dev/null
|
||||
find .heroku/python/lib/python*/site-packages/ -name "*.pth" -print0 2> /dev/null | xargs -r -0 -n 1 sed -i -e "s#/app/#/$(pwd)/#" &> /dev/null
|
||||
set -e
|
||||
|
||||
set +e
|
||||
# Support for the above, for PyPy.
|
||||
find .heroku/python/lib-python/*/site-packages/ -name "*.egg-link" -print0 2> /dev/null | xargs -r -0 -n 1 sed -i -e "s#/app/#$(pwd)/#" &> /dev/null
|
||||
find .heroku/python/lib-python/*/site-packages/ -name "*.pth" -print0 2> /dev/null | xargs -r -0 -n 1 sed -i -e "s#/app/#/$(pwd)/#" &> /dev/null
|
||||
set -e
|
||||
@@ -0,0 +1,10 @@
|
||||
#!/usr/bin/env bash
|
||||
set +e
|
||||
# rewrite build dir in egg links to /app so things are found at runtime
|
||||
find .heroku/python/lib/python*/site-packages/ -name "*.pth" -print0 2> /dev/null | xargs -r -0 -n 1 sed -i -e "s#$(pwd)#/app#" &> /dev/null
|
||||
set -e
|
||||
|
||||
set +e
|
||||
# Support for PyPy
|
||||
find .heroku/python/lib-python/*/site-packages/ -name "*.pth" -print0 2> /dev/null | xargs -r -0 -n 1 sed -i -e "s#$(pwd)#/app#" &> /dev/null
|
||||
set -e
|
||||
Executable
+34
@@ -0,0 +1,34 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# This script serves as the GDAL build step of the
|
||||
# [**Python Buildpack**](https://github.com/heroku/heroku-buildpack-python)
|
||||
# compiler.
|
||||
#
|
||||
# A [buildpack](https://devcenter.heroku.com/articles/buildpacks) is an
|
||||
# adapter between a Python application and Heroku's runtime.
|
||||
#
|
||||
# This script is invoked by [`bin/compile`](/).
|
||||
|
||||
# The location of the pre-compiled cryptography binary.
|
||||
VENDORED_GDAL="${VENDOR_URL}/libraries/vendor/gdal.tar.gz"
|
||||
|
||||
PKG_CONFIG_PATH="/app/.heroku/vendor/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||
|
||||
# Syntax sugar.
|
||||
# shellcheck source=bin/utils
|
||||
source "$BIN_DIR/utils"
|
||||
|
||||
# If GDAL exists within requirements, use vendored gdal.
|
||||
if (pip-grep -s requirements.txt GDAL gdal pygdal &> /dev/null) then
|
||||
|
||||
if [ ! -f ".heroku/vendor/bin/gdalserver" ]; then
|
||||
echo "-----> Noticed GDAL. Bootstrapping gdal."
|
||||
mkdir -p .heroku/vendor
|
||||
# Download and extract cryptography into target vendor directory.
|
||||
curl "$VENDORED_GDAL" -s | tar zxv -C .heroku/vendor &> /dev/null
|
||||
fi
|
||||
|
||||
GDAL=$(pwd)/vendor
|
||||
export GDAL
|
||||
fi
|
||||
|
||||
Executable
+49
@@ -0,0 +1,49 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# This script serves as the GDAL build step of the
|
||||
# [**Python Buildpack**](https://github.com/heroku/heroku-buildpack-python)
|
||||
# compiler.
|
||||
#
|
||||
# A [buildpack](https://devcenter.heroku.com/articles/buildpacks) is an
|
||||
# adapter between a Python application and Heroku's runtime.
|
||||
#
|
||||
# This script is invoked by [`bin/compile`](/).
|
||||
|
||||
# The location of the pre-compiled cryptography binary.
|
||||
VENDORED_GDAL="${VENDOR_URL}/libraries/vendor/gdal.tar.gz"
|
||||
VENDORED_GEOS="${VENDOR_URL}/libraries/vendor/geos.tar.gz"
|
||||
VENDORED_PROJ="${VENDOR_URL}/libraries/vendor/proj.tar.gz"
|
||||
|
||||
PKG_CONFIG_PATH="/app/.heroku/vendor/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||
|
||||
# Syntax sugar.
|
||||
# shellcheck source=bin/utils
|
||||
source "$BIN_DIR/utils"
|
||||
|
||||
# If GDAL exists within requirements, use vendored gdal.
|
||||
if [[ "$BUILD_WITH_GEO_LIBRARIES" ]]; then
|
||||
|
||||
if [ ! -f ".heroku/vendor/bin/proj" ]; then
|
||||
echo "-----> Bootstrapping gdal, geos, proj."
|
||||
mkdir -p .heroku/vendor
|
||||
# Download and extract cryptography into target vendor directory.
|
||||
curl "$VENDORED_GDAL" -s | tar zxv -C .heroku/vendor &> /dev/null
|
||||
curl "$VENDORED_GEOS" -s | tar zxv -C .heroku/vendor &> /dev/null
|
||||
curl "$VENDORED_PROJ" -s | tar zxv -C .heroku/vendor &> /dev/null
|
||||
|
||||
# Copy libjasper from build image to slug.
|
||||
if [[ "$STACK" == "heroku-16" ]]; then
|
||||
cp /usr/lib/x86_64-linux-gnu/libjasper.so* ".heroku/vendor/lib/."
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
GDAL=$(pwd)/vendor
|
||||
export GDAL
|
||||
# set path for post_compile hooks
|
||||
export GDAL_LIBRARY_PATH="$BUILD_DIR/.heroku/vendor/lib/libgdal.so"
|
||||
export GEOS_LIBRARY_PATH="$BUILD_DIR/.heroku/vendor/lib/libgeos_c.so"
|
||||
# set path for runtime environmeht
|
||||
set_env GDAL_LIBRARY_PATH "/app/.heroku/vendor/lib/libgdal.so"
|
||||
set_env GEOS_LIBRARY_PATH "/app/.heroku/vendor/lib/libgeos_c.so"
|
||||
fi
|
||||
Executable
+7
@@ -0,0 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
if [ -f bin/post_compile ]; then
|
||||
echo "-----> Running post-compile hook"
|
||||
chmod +x bin/post_compile
|
||||
sub_env bin/post_compile
|
||||
fi
|
||||
Executable
+7
@@ -0,0 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
if [ -f bin/pre_compile ]; then
|
||||
echo "-----> Running pre-compile hook"
|
||||
chmod +x bin/pre_compile
|
||||
sub_env bin/pre_compile
|
||||
fi
|
||||
Executable
+9
@@ -0,0 +1,9 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Install Mercurial if it appears to be required.
|
||||
if [[ -f "requirements.txt" ]]; then
|
||||
if (grep -Fiq "hg+" requirements.txt) then
|
||||
/app/.heroku/python/bin/pip install mercurial | cleanup | indent
|
||||
fi
|
||||
fi
|
||||
|
||||
Executable
+34
@@ -0,0 +1,34 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# This script serves as the NLTK build step of the
|
||||
# [**Python Buildpack**](https://github.com/heroku/heroku-buildpack-python)
|
||||
# compiler.
|
||||
#
|
||||
# A [buildpack](https://devcenter.heroku.com/articles/buildpacks) is an
|
||||
# adapter between a Python application and Heroku's runtime.
|
||||
#
|
||||
# This script is invoked by [`bin/compile`](/).
|
||||
|
||||
# Syntax sugar.
|
||||
# shellcheck source=bin/utils
|
||||
source "$BIN_DIR/utils"
|
||||
|
||||
# Check that nltk was installed by pip, otherwise obviously not needed
|
||||
if sp-grep -s nltk; then
|
||||
puts-step "Downloading NLTK corpora…"
|
||||
|
||||
nltk_packages_definition="$BUILD_DIR/nltk.txt"
|
||||
|
||||
if [ -f "$nltk_packages_definition" ]; then
|
||||
|
||||
readarray -t nltk_packages < "$nltk_packages_definition"
|
||||
puts-step "Downloading NLTK packages: ${nltk_packages[*]}"
|
||||
|
||||
python -m nltk.downloader -d "$BUILD_DIR/.heroku/python/nltk_data" "${nltk_packages[@]}" | indent
|
||||
set_env NLTK_DATA "/app/.heroku/python/nltk_data"
|
||||
|
||||
else
|
||||
puts-warn "'nltk.txt' not found, not downloading any corpora"
|
||||
puts-warn "Learn more: https://devcenter.heroku.com/articles/python-nltk"
|
||||
fi
|
||||
fi
|
||||
Executable
+55
@@ -0,0 +1,55 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# shellcheck source=bin/utils
|
||||
source $BIN_DIR/utils
|
||||
|
||||
if [ ! "$SKIP_PIP_INSTALL" ]; then
|
||||
|
||||
# Install dependencies with Pip.
|
||||
puts-step "Installing requirements with pip"
|
||||
|
||||
# Set PIP_EXTRA_INDEX_URL
|
||||
if [[ -r $ENV_DIR/PIP_EXTRA_INDEX_URL ]]; then
|
||||
PIP_EXTRA_INDEX_URL="$(cat "$ENV_DIR/PIP_EXTRA_INDEX_URL")"
|
||||
export PIP_EXTRA_INDEX_URL
|
||||
fi
|
||||
|
||||
set +e
|
||||
|
||||
# Measure that we're using pip.
|
||||
mcount "tool.pip"
|
||||
|
||||
# Count expected build failures.
|
||||
if grep -q 'wsgiref' requirements.txt; then
|
||||
mcount "failure.wsgiref"
|
||||
fi
|
||||
if grep -q '==0.0.0' requirements.txt; then
|
||||
mcount "failure.none-version"
|
||||
fi
|
||||
|
||||
|
||||
/app/.heroku/python/bin/pip install -r "$BUILD_DIR/requirements.txt" --exists-action=w --src=/app/.heroku/src --disable-pip-version-check --no-cache-dir 2>&1 | tee "$WARNINGS_LOG" | cleanup | indent
|
||||
PIP_STATUS="${PIPESTATUS[0]}"
|
||||
set -e
|
||||
|
||||
show-warnings
|
||||
|
||||
if [[ ! $PIP_STATUS -eq 0 ]]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# Smart Requirements handling
|
||||
cp requirements.txt .heroku/python/requirements-declared.txt
|
||||
/app/.heroku/python/bin/pip freeze --disable-pip-version-check > .heroku/python/requirements-installed.txt
|
||||
|
||||
echo
|
||||
|
||||
# Install test dependencies, for CI.
|
||||
if [ "$INSTALL_TEST" ]; then
|
||||
if [[ -f "$1/requirements-test.txt" ]]; then
|
||||
puts-step "Installing test dependencies…"
|
||||
/app/.heroku/python/bin/pip install -r "$1/requirements-test.txt" --exists-action=w --src=./.heroku/src --disable-pip-version-check --no-cache-dir 2>&1 | cleanup | indent
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
Executable
+28
@@ -0,0 +1,28 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set +e
|
||||
# Install dependencies with Pip.
|
||||
# shellcheck source=bin/utils
|
||||
source $BIN_DIR/utils
|
||||
|
||||
if [ ! "$SKIP_PIP_INSTALL" ]; then
|
||||
|
||||
if [[ -f .heroku/python/requirements-declared.txt ]]; then
|
||||
|
||||
cp .heroku/python/requirements-declared.txt requirements-declared.txt
|
||||
|
||||
|
||||
if ! pip-diff --stale requirements-declared.txt requirements.txt --exclude setuptools pip wheel > .heroku/python/requirements-stale.txt; then
|
||||
mount "failure.bad-requirements"
|
||||
fi
|
||||
|
||||
rm -fr requirements-declared.txt
|
||||
|
||||
if [[ -s .heroku/python/requirements-stale.txt ]]; then
|
||||
puts-step "Uninstalling stale dependencies"
|
||||
/app/.heroku/python/bin/pip uninstall -r .heroku/python/requirements-stale.txt -y --exists-action=w | cleanup | indent
|
||||
fi
|
||||
fi
|
||||
|
||||
fi
|
||||
set -e
|
||||
Executable
+72
@@ -0,0 +1,72 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# export CLINT_FORCE_COLOR=1
|
||||
# export PIPENV_FORCE_COLOR=1
|
||||
# shellcheck source=bin/utils
|
||||
source $BIN_DIR/utils
|
||||
set -e
|
||||
|
||||
if [[ -f Pipfile.lock ]]; then
|
||||
if [[ -f .heroku/python/Pipfile.lock.sha256 ]]; then
|
||||
if [[ $(openssl dgst -sha256 Pipfile.lock) == $(cat .heroku/python/Pipfile.lock.sha256) ]]; then
|
||||
# Measure that we're using Pipenv.
|
||||
mcount "tool.pipenv"
|
||||
|
||||
# Don't skip installation of there are git deps.
|
||||
if ! grep -q 'git' Pipfile.lock; then
|
||||
echo "Skipping installation, as Pipfile.lock hasn't changed since last deploy." | indent
|
||||
|
||||
mcount "tool.pipenv"
|
||||
export SKIP_PIPENV_INSTALL=1
|
||||
export SKIP_PIP_INSTALL=1
|
||||
fi
|
||||
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
if [ ! "$SKIP_PIPENV_INSTALL" ]; then
|
||||
# Pipenv support (Generate requriements.txt with pipenv).
|
||||
if [[ -f Pipfile ]]; then
|
||||
# Measure that we're using Pipenv.
|
||||
mcount "tool.pipenv"
|
||||
|
||||
# Skip pip install, later.
|
||||
export SKIP_PIP_INSTALL=1
|
||||
|
||||
# Set PIP_EXTRA_INDEX_URL
|
||||
if [[ -r $ENV_DIR/PIP_EXTRA_INDEX_URL ]]; then
|
||||
PIP_EXTRA_INDEX_URL="$(cat "$ENV_DIR/PIP_EXTRA_INDEX_URL")"
|
||||
export PIP_EXTRA_INDEX_URL
|
||||
fi
|
||||
|
||||
export PIPENV_VERSION="11.8.2"
|
||||
|
||||
# Install pipenv.
|
||||
/app/.heroku/python/bin/pip install pipenv==$PIPENV_VERSION --upgrade &> /dev/null
|
||||
|
||||
# Install the dependencies.
|
||||
if [[ ! -f Pipfile.lock ]]; then
|
||||
puts-step "Installing dependencies with Pipenv $PIPENV_VERSION…"
|
||||
/app/.heroku/python/bin/pipenv install --system --skip-lock 2>&1 | indent
|
||||
else
|
||||
pipenv-to-pip Pipfile.lock > requirements.txt
|
||||
"$BIN_DIR/steps/pip-uninstall"
|
||||
cp requirements.txt .heroku/python/requirements-declared.txt
|
||||
openssl dgst -sha256 Pipfile.lock > .heroku/python/Pipfile.lock.sha256
|
||||
|
||||
puts-step "Installing dependencies with Pipenv $PIPENV_VERSION…"
|
||||
/app/.heroku/python/bin/pipenv install --system --deploy 2>&1 | indent
|
||||
fi
|
||||
|
||||
# Install the test dependencies, for CI.
|
||||
if [ "$INSTALL_TEST" ]; then
|
||||
puts-step "Installing test dependencies…"
|
||||
/app/.heroku/python/bin/pipenv install --dev --system --deploy 2>&1 | cleanup | indent
|
||||
fi
|
||||
fi
|
||||
else
|
||||
export SKIP_PIP_INSTALL=1
|
||||
pipenv-to-pip Pipfile.lock > requirements.txt
|
||||
fi
|
||||
Executable
+33
@@ -0,0 +1,33 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Detect Python-version with Pipenv.
|
||||
|
||||
if [[ -f $BUILD_DIR/Pipfile ]]; then
|
||||
|
||||
if [[ ! -f $BUILD_DIR/runtime.txt ]]; then
|
||||
if [[ ! -f $BUILD_DIR/Pipfile.lock ]]; then
|
||||
puts-warn "No 'Pipfile.lock' found! We recommend you commit this into your repository."
|
||||
fi
|
||||
if [[ -f $BUILD_DIR/Pipfile.lock ]]; then
|
||||
set +e
|
||||
PYTHON=$(jq -r '._meta.requires.python_full_version' "$BUILD_DIR/Pipfile.lock")
|
||||
if [[ "$PYTHON" != "null" ]]; then
|
||||
echo "python-$PYTHON" > "$BUILD_DIR/runtime.txt"
|
||||
fi
|
||||
set -e
|
||||
|
||||
if [[ "$PYTHON" == "null" ]]; then
|
||||
PYTHON=$(jq -r '._meta.requires.python_version' "$BUILD_DIR/Pipfile.lock")
|
||||
if [ "$PYTHON" = 2.7 ]; then
|
||||
echo "$LATEST_2" > "$BUILD_DIR/runtime.txt"
|
||||
fi
|
||||
if [ "$PYTHON" = 3.6 ]; then
|
||||
echo "$LATEST_3" > "$BUILD_DIR/runtime.txt"
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
Regular → Executable
+32
-16
@@ -1,20 +1,36 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# if pylibmc within requirements, use vendored libmemcached
|
||||
if (grep -Fxiq "pylibmc" requirements.txt) || (grep -Fiq "pylibmc=" requirements.txt)
|
||||
then
|
||||
echo "-----> Noticed pylibmc. Bootstrapping libmemcached."
|
||||
cd .heroku
|
||||
# This script serves as the Pylibmc build step of the
|
||||
# [**Python Buildpack**](https://github.com/heroku/heroku-buildpack-python)
|
||||
# compiler.
|
||||
#
|
||||
# A [buildpack](https://devcenter.heroku.com/articles/buildpacks) is an
|
||||
# adapter between a Python application and Heroku's runtime.
|
||||
#
|
||||
# This script is invoked by [`bin/compile`](/).
|
||||
|
||||
if [ -d "vendor/lib/sasl2" ]; then
|
||||
export LIBMEMCACHED=$(pwd)/vendor
|
||||
else
|
||||
curl -s -L -o tmp-libmemcached.tar.gz $VENDORED_MEMCACHED
|
||||
tar -zxvf tmp-libmemcached.tar.gz > /dev/null
|
||||
rm tmp-libmemcached.tar.gz
|
||||
export LIBMEMCACHED=$(pwd)/vendor
|
||||
fi
|
||||
|
||||
export LIBMEMCACHED=$(pwd)/vendor
|
||||
cd ..
|
||||
if [[ "$STACK" == "heroku-16" ]]; then
|
||||
# libmemcached is pre-installed in the stack image so there is no need to vendor it.
|
||||
return 0
|
||||
fi
|
||||
|
||||
# The location of the pre-compiled libmemcached binary.
|
||||
VENDORED_MEMCACHED="${VENDOR_URL}/libraries/vendor/libmemcache.tar.gz"
|
||||
|
||||
# Syntax sugar.
|
||||
# shellcheck source=bin/utils
|
||||
source "$BIN_DIR/utils"
|
||||
|
||||
# If pylibmc exists within requirements, use vendored libmemcached.
|
||||
if (pip-grep -s requirements.txt pylibmc &> /dev/null) then
|
||||
|
||||
if [ ! -d ".heroku/vendor/lib/sasl2" ]; then
|
||||
echo "-----> Noticed pylibmc. Bootstrapping libmemcached."
|
||||
mkdir -p .heroku/vendor
|
||||
# Download and extract libmemcached into target vendor directory.
|
||||
curl "$VENDORED_MEMCACHED" -s | tar zxv -C .heroku/vendor &> /dev/null
|
||||
fi
|
||||
|
||||
LIBMEMCACHED=$(pwd)/vendor
|
||||
export LIBMEMCACHED
|
||||
fi
|
||||
|
||||
Executable
+75
@@ -0,0 +1,75 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set +e
|
||||
runtime-fixer runtime.txt
|
||||
PYTHON_VERSION=$(cat runtime.txt)
|
||||
|
||||
# The location of the pre-compiled python binary.
|
||||
VENDORED_PYTHON="${VENDOR_URL}/runtimes/$PYTHON_VERSION.tar.gz"
|
||||
|
||||
if [[ $PYTHON_VERSION =~ ^python-2 ]]; then
|
||||
if [[ "$PYTHON_VERSION" != "$LATEST_2" ]]; then
|
||||
puts-warn "The latest version of Python 2 is $LATEST_2 (you are using $PYTHON_VERSION, which is unsupported)."
|
||||
puts-warn "We recommend upgrading by specifying the latest version ($LATEST_2)."
|
||||
echo " Learn More: https://devcenter.heroku.com/articles/python-runtimes"
|
||||
fi
|
||||
else
|
||||
if [[ "$PYTHON_VERSION" != "$LATEST_3" ]]; then
|
||||
puts-warn "The latest version of Python 3 is $LATEST_3 (you are using $PYTHON_VERSION, which is unsupported)."
|
||||
puts-warn "We recommend upgrading by specifying the latest version ($LATEST_3)."
|
||||
echo " Learn More: https://devcenter.heroku.com/articles/python-runtimes"
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
if [[ "$STACK" != "$CACHED_PYTHON_STACK" ]]; then
|
||||
puts-step "Stack has changed from $CACHED_PYTHON_STACK to $STACK, clearing cache"
|
||||
rm -fr .heroku/python-stack .heroku/python-version .heroku/python .heroku/vendor
|
||||
fi
|
||||
|
||||
if [ -f .heroku/python-version ]; then
|
||||
if [ ! "$(cat .heroku/python-version)" = "$PYTHON_VERSION" ]; then
|
||||
puts-step "Found $(cat .heroku/python-version), removing"
|
||||
rm -fr .heroku/python
|
||||
else
|
||||
SKIP_INSTALL=1
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! "$SKIP_INSTALL" ]; then
|
||||
puts-step "Installing $PYTHON_VERSION"
|
||||
|
||||
# Prepare destination directory.
|
||||
mkdir -p .heroku/python
|
||||
|
||||
mcount "version.python.$PYTHON_VERSION"
|
||||
|
||||
if ! curl "${VENDORED_PYTHON}" -s | tar zxv -C .heroku/python &> /dev/null; then
|
||||
puts-warn "Requested runtime ($PYTHON_VERSION) is not available for this stack ($STACK)."
|
||||
puts-warn "Aborting. More info: https://devcenter.heroku.com/articles/python-support"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Record for future reference.
|
||||
echo "$PYTHON_VERSION" > .heroku/python-version
|
||||
echo "$STACK" > .heroku/python-stack
|
||||
FRESH_PYTHON=true
|
||||
|
||||
hash -r
|
||||
fi
|
||||
|
||||
# If Pip isn't up to date:
|
||||
if [ "$FRESH_PYTHON" ] || [[ ! $(pip --version) == *$PIP_UPDATE* ]]; then
|
||||
|
||||
puts-step "Installing pip"
|
||||
|
||||
# Remove old installations.
|
||||
rm -fr /app/.heroku/python/lib/python*/site-packages/pip-*
|
||||
rm -fr /app/.heroku/python/lib/python*/site-packages/setuptools-*
|
||||
|
||||
/app/.heroku/python/bin/python "$ROOT_DIR/vendor/get-pip.py" &> /dev/null
|
||||
|
||||
fi
|
||||
|
||||
set -e
|
||||
hash -r
|
||||
Executable
+13
@@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Syntax sugar.
|
||||
BIN_DIR=$(cd "$(dirname "$0")" || return; pwd) # absolute path
|
||||
|
||||
# shellcheck source=bin/utils
|
||||
source "$BIN_DIR/utils"
|
||||
|
||||
# Locale support for Pipenv.
|
||||
export LC_ALL=C.UTF-8
|
||||
export LANG=C.UTF-8
|
||||
|
||||
DISABLE_COLLECTSTATIC=1 INSTALL_TEST=1 "$(dirname "${0:-}")/compile" "$1" "$2" "$3"
|
||||
@@ -0,0 +1,60 @@
|
||||
#!/usr/bin/env bash
|
||||
shopt -s extglob
|
||||
shopt -s nullglob
|
||||
|
||||
# The standard library.
|
||||
if [[ ! -f /tmp/stdlib.sh ]]; then
|
||||
curl --retry 3 -s https://lang-common.s3.amazonaws.com/buildpack-stdlib/v8/stdlib.sh > /tmp/stdlib.sh
|
||||
fi
|
||||
# shellcheck source=/dev/null
|
||||
source /tmp/stdlib.sh
|
||||
|
||||
if [ "$(uname)" == Darwin ]; then
|
||||
sed() { command sed -l "$@"; }
|
||||
else
|
||||
sed() { command sed -u "$@"; }
|
||||
fi
|
||||
|
||||
# Syntax sugar.
|
||||
indent() {
|
||||
sed "s/^/ /"
|
||||
}
|
||||
|
||||
|
||||
# Clean up pip output
|
||||
cleanup() {
|
||||
sed -e 's/\.\.\.\+/.../g' | sed -e '/already satisfied/Id' | sed -e '/No files were found to uninstall/Id' | sed -e '/Overwriting/Id' | sed -e '/python executable/Id' | sed -e '/no previously-included files/Id'
|
||||
}
|
||||
|
||||
# Buildpack Steps.
|
||||
puts-step() {
|
||||
echo "-----> $*"
|
||||
}
|
||||
|
||||
# Buildpack Warnings.
|
||||
puts-warn() {
|
||||
echo " ! $*"
|
||||
}
|
||||
|
||||
# Does some serious copying.
|
||||
deep-cp() {
|
||||
declare source="$1" target="$2"
|
||||
|
||||
mkdir -p "$target"
|
||||
|
||||
# cp doesn't like being called without source params,
|
||||
# so make sure they expand to something first.
|
||||
# subshell to avoid surprising caller with shopts.
|
||||
(
|
||||
shopt -s nullglob dotglob
|
||||
set -- "$source"/!(tmp|.|..)
|
||||
[[ $# == 0 ]] || cp -a "$@" "$target"
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
# Measure the size of the Python installation.
|
||||
measure-size() {
|
||||
echo "$(du -s .heroku/python 2>/dev/null || echo 0) | awk '{print $1}')"
|
||||
}
|
||||
|
||||
Executable
+66
@@ -0,0 +1,66 @@
|
||||
#!/usr/bin/env bash
|
||||
shopt -s extglob
|
||||
|
||||
old-platform() {
|
||||
if grep -qi 'InsecurePlatformWarning' "$WARNINGS_LOG"; then
|
||||
echo
|
||||
puts-warn "Hello! It looks like your application is using an outdated version of Python."
|
||||
puts-warn "This caused the security warning you saw above during the 'pip install' step."
|
||||
puts-warn "We recommend '$RECOMMENDED_PYTHON_VERSION', which you can specify in a 'runtime.txt' file."
|
||||
puts-warn " -- Much Love, Heroku."
|
||||
mcount 'warnings.python.old'
|
||||
fi
|
||||
}
|
||||
|
||||
pylibmc-missing() {
|
||||
if grep -qi 'fatal error: libmemcached/memcached.h: No such file or directory' "$WARNINGS_LOG"; then
|
||||
echo
|
||||
puts-warn "Hello! There was a problem with your build related to libmemcache."
|
||||
puts-warn "The Python library 'pylibmc' must be explicitly specified in 'requirements.txt' in order to build correctly."
|
||||
puts-warn "Once you do that, everything should work as expected. -- Much Love, Heroku."
|
||||
mcount 'warnings.libmemcache'
|
||||
fi
|
||||
}
|
||||
|
||||
scipy-included() {
|
||||
if grep -qi 'running setup.py install for scipy' "$WARNINGS_LOG"; then
|
||||
echo
|
||||
puts-warn "Hello! It looks like you're trying to use scipy on Heroku."
|
||||
puts-warn "Unfortunately, at this time, we do not directly support this library."
|
||||
puts-warn "There is, however, a buildpack available that makes it possible to use it on Heroku."
|
||||
puts-warn "You can learn more here: https://devcenter.heroku.com/articles/python-c-deps"
|
||||
puts-warn "Sorry for the inconvenience. -- Much Love, Heroku."
|
||||
mcount 'warnings.scipy'
|
||||
fi
|
||||
}
|
||||
|
||||
distribute-included() {
|
||||
if grep -qi 'Running setup.py install for distribute' "$WARNINGS_LOG"; then
|
||||
echo
|
||||
puts-warn "Hello! Your requirements.txt file contains the distribute package."
|
||||
puts-warn "This library is automatically installed by Heroku and shouldn't be in"
|
||||
puts-warn "Your requirements.txt file. This can cause unexpected behavior."
|
||||
puts-warn " -- Much Love, Heroku."
|
||||
mcount 'warnings.distribute'
|
||||
fi
|
||||
}
|
||||
|
||||
six-included() {
|
||||
if grep -qi 'Running setup.py install for six' "$WARNINGS_LOG"; then
|
||||
echo
|
||||
puts-warn "Hello! Your requirements.txt file contains the six package."
|
||||
puts-warn "This library is automatically installed by Heroku and shouldn't be in"
|
||||
puts-warn "Your requirements.txt file. This can cause unexpected behavior."
|
||||
puts-warn " -- Much Love, Heroku."
|
||||
mcount 'warnings.six'
|
||||
fi
|
||||
}
|
||||
|
||||
show-warnings() {
|
||||
old-platform
|
||||
pylibmc-missing
|
||||
scipy-included
|
||||
distribute-included
|
||||
six-included
|
||||
}
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
# Python Buildpack Binaries
|
||||
|
||||
For Cedar-14 stack
|
||||
------------------
|
||||
|
||||
To get started with it, create an app on Heroku inside a clone of this repository, and set your S3 config vars:
|
||||
|
||||
$ heroku create --buildpack https://github.com/heroku/heroku-buildpack-python#not-heroku
|
||||
$ heroku config:set WORKSPACE_DIR=builds
|
||||
$ heroku config:set AWS_ACCESS_KEY_ID=<your_aws_key>
|
||||
$ heroku config:set AWS_SECRET_ACCESS_KEY=<your_aws_secret>
|
||||
$ heroku config:set S3_BUCKET=<your_s3_bucket_name>
|
||||
|
||||
|
||||
Then, shell into an instance and run a build by giving the name of the formula inside `builds`:
|
||||
|
||||
$ heroku run bash
|
||||
Running `bash` attached to terminal... up, run.6880
|
||||
~ $ bob build runtimes/python-2.7.6
|
||||
|
||||
Fetching dependencies... found 2:
|
||||
- libraries/sqlite
|
||||
|
||||
Building formula runtimes/python-2.7.6:
|
||||
=== Building Python 2.7.6
|
||||
Fetching Python v2.7.6 source...
|
||||
Compiling...
|
||||
|
||||
If this works, run `bob deploy` instead of `bob build` to have the result uploaded to S3 for you.
|
||||
|
||||
To speed things up drastically, it'll usually be a good idea to `heroku run bash --size PX` instead.
|
||||
|
||||
For Heroku-16 stack
|
||||
-------------------
|
||||
|
||||
1. Ensure GNU Make and Docker are installed.
|
||||
2. From the root of the buildpack repository, run: `make buildenv-heroku-16`
|
||||
3. Follow the instructions displayed!
|
||||
|
||||
|
||||
Enjoy :)
|
||||
Executable
+22
@@ -0,0 +1,22 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building SQLite…"
|
||||
|
||||
|
||||
SOURCE_TARBALL='https://www.sqlite.org/sqlite-autoconf-3070900.tar.gz'
|
||||
|
||||
curl $SOURCE_TARBALL | tar xz
|
||||
# jx
|
||||
mv sqlite-autoconf-3070900 sqlite
|
||||
|
||||
cd sqlite
|
||||
./configure --prefix=$OUT_PREFIX
|
||||
make
|
||||
make install
|
||||
|
||||
# Cleanup
|
||||
cd ..
|
||||
rm -fr sqlite
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/vendor/
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
# Use new path, containing autoconf.
|
||||
export PATH="/app/.heroku/python/bin/:$PATH"
|
||||
hash -r
|
||||
|
||||
|
||||
echo "Building gdal…"
|
||||
|
||||
VERSION="2.2.1"
|
||||
SOURCE_TARBALL="http://download.osgeo.org/gdal/${VERSION}/gdal-${VERSION}.tar.gz"
|
||||
|
||||
curl -L $SOURCE_TARBALL | tar zx
|
||||
|
||||
pushd "gdal-${VERSION}"
|
||||
./configure --prefix=$OUT_PREFIX --enable-static=no &&
|
||||
make
|
||||
make install
|
||||
|
||||
# Cleanup
|
||||
popd
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/vendor/
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
# Use new path, containing autoconf.
|
||||
export PATH="/app/.heroku/python/bin/:$PATH"
|
||||
hash -r
|
||||
|
||||
|
||||
echo "Building geos…"
|
||||
|
||||
VERSION=3.6.2
|
||||
|
||||
SOURCE_TARBALL="http://download.osgeo.org/geos/geos-${VERSION}.tar.bz2"
|
||||
|
||||
curl -L $SOURCE_TARBALL | tar xj
|
||||
|
||||
pushd "geos-${VERSION}"
|
||||
./configure --prefix=$OUT_PREFIX --enable-static=no &&
|
||||
make
|
||||
make install
|
||||
|
||||
# Cleanup
|
||||
popd
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/vendor/
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
# Skip the build for heroku-16.
|
||||
if [[ $S3_PREFIX == "heroku-16" ]]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Use new path, containing autoconf.
|
||||
export PATH="/app/.heroku/python/bin/:$PATH"
|
||||
hash -r
|
||||
|
||||
|
||||
echo "Building libffi…"
|
||||
|
||||
SOURCE_TARBALL='ftp://sourceware.org/pub/libffi/libffi-3.1.tar.gz'
|
||||
|
||||
curl -L $SOURCE_TARBALL | tar x
|
||||
|
||||
cd libffi-3.1
|
||||
./configure --prefix=$OUT_PREFIX --disable-static &&
|
||||
make
|
||||
make install
|
||||
|
||||
# Cleanup
|
||||
cd ..
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/vendor/
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
# Skip the build for heroku-16.
|
||||
if [[ $S3_PREFIX == "heroku-16" ]]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# fail hard
|
||||
set -o pipefail
|
||||
# fail harder
|
||||
set -eux
|
||||
|
||||
DEFAULT_VERSION="1.0.18"
|
||||
dep_version=${VERSION:-$DEFAULT_VERSION}
|
||||
dep_dirname=libmemcached-${dep_version}
|
||||
dep_archive_name=${dep_dirname}.tar.gz
|
||||
dep_url=https://launchpad.net/libmemcached/1.0/${dep_version}/+download/${dep_archive_name}
|
||||
|
||||
# SASL Support.
|
||||
echo "-----> Building cyrus-sasl 2.1.26…"
|
||||
|
||||
curl -LO ftp://ftp.cyrusimap.org/cyrus-sasl/cyrus-sasl-2.1.26.tar.gz
|
||||
# FTP doesn't play well with piping into tar xz
|
||||
tar xzf cyrus-sasl-2.1.26.tar.gz
|
||||
|
||||
pushd cyrus-sasl-2.1.26
|
||||
./configure --prefix=${OUT_PREFIX} --with-plugindir=${OUT_PREFIX}lib/sasl2 --with-configdir=${OUT_PREFIX}lib/sasl2
|
||||
|
||||
make -s -j 9
|
||||
make install -s
|
||||
popd
|
||||
|
||||
echo "-----> Building libmemcached ${dep_version}…"
|
||||
|
||||
curl -L ${dep_url} | tar xz
|
||||
pushd ${dep_dirname}
|
||||
CPPFLAGS=-I${OUT_PREFIX}/include LDFLAGS=-L${OUT_PREFIX}/lib ./configure --prefix=${OUT_PREFIX} --without-memcached
|
||||
make -s -j 9
|
||||
make install -s
|
||||
popd
|
||||
|
||||
echo "-----> Done."
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/vendor/
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
# Use new path, containing autoconf.
|
||||
export PATH="/app/.heroku/python/bin/:$PATH"
|
||||
hash -r
|
||||
|
||||
|
||||
echo "Building gdal…"
|
||||
|
||||
VERSION=4.9.3
|
||||
SOURCE_TARBALL="http://download.osgeo.org/proj/proj-${VERSION}.tar.gz"
|
||||
|
||||
curl -L $SOURCE_TARBALL | tar zx
|
||||
|
||||
pushd "proj-${VERSION}"
|
||||
./configure --prefix=$OUT_PREFIX --enable-static=no
|
||||
make
|
||||
make install
|
||||
|
||||
# Cleanup
|
||||
popd
|
||||
Executable
+14
@@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
# NOTICE: This formula only works for the cedar-14 stack, not cedar.
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building PyPy…"
|
||||
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.3.1-linux64.tar.bz2'
|
||||
curl -L $SOURCE_TARBALL | tar jx
|
||||
cp -R pypy2-v5.3.1-linux64/* $OUT_PREFIX
|
||||
|
||||
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
|
||||
Executable
+14
@@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
# NOTICE: This formula only works for the cedar-14 stack, not cedar.
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building PyPy…"
|
||||
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.6.0-linux64.tar.bz2'
|
||||
curl -L $SOURCE_TARBALL | tar jx
|
||||
cp -R pypy2-v5.6.0-linux64/* $OUT_PREFIX
|
||||
|
||||
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
|
||||
Executable
+14
@@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
# NOTICE: This formula only works for the cedar-14 and heroku-16 stacks, not cedar.
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building PyPy…"
|
||||
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.7.0-linux64.tar.bz2'
|
||||
curl -L $SOURCE_TARBALL | tar jx
|
||||
cp -R pypy2-v5.7.0-linux64/* $OUT_PREFIX
|
||||
|
||||
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
|
||||
Executable
+14
@@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
# NOTICE: This formula only works for the cedar-14 stack, not cedar.
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building PyPy…"
|
||||
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.7.1-linux64.tar.bz2'
|
||||
curl -L $SOURCE_TARBALL | tar jx
|
||||
cp -R pypy2-v5.7.1-linux64/* $OUT_PREFIX
|
||||
|
||||
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
|
||||
Executable
+12
@@ -0,0 +1,12 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building PyPy…"
|
||||
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.8.0-linux64.tar.bz2'
|
||||
curl -L $SOURCE_TARBALL | tar jx
|
||||
cp -R pypy2-v5.8.0-linux64/* $OUT_PREFIX
|
||||
|
||||
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
|
||||
Executable
+14
@@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
# NOTICE: This formula only works for the cedar-14 stack, not cedar.
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building PyPy…"
|
||||
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy3-2.4.0-linux64.tar.bz2'
|
||||
curl -L $SOURCE_TARBALL | tar jx
|
||||
cp -R pypy3-2.4.0-linux64/* $OUT_PREFIX
|
||||
|
||||
ln $OUT_PREFIX/bin/pypy3 $OUT_PREFIX/bin/python
|
||||
Executable
+14
@@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
# NOTICE: This formula only works for the cedar-14 stack, not cedar.
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building PyPy…"
|
||||
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy3.3-v5.5.0-alpha-linux64.tar.bz2'
|
||||
curl -L $SOURCE_TARBALL | tar jx
|
||||
cp -R pypy3-v5.5.0-linux64/* $OUT_PREFIX
|
||||
|
||||
ln $OUT_PREFIX/bin/pypy3 $OUT_PREFIX/bin/python
|
||||
Executable
+12
@@ -0,0 +1,12 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building PyPy…"
|
||||
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy3-v5.7.1-linux64.tar.bz2'
|
||||
curl -L $SOURCE_TARBALL | tar jx
|
||||
cp -R pypy3-v5.7.1-linux64/* $OUT_PREFIX
|
||||
|
||||
ln $OUT_PREFIX/bin/pypy3 $OUT_PREFIX/bin/python
|
||||
Executable
+12
@@ -0,0 +1,12 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building PyPy…"
|
||||
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy3-v5.8.0-linux64.tar.bz2'
|
||||
curl -L $SOURCE_TARBALL | tar jx
|
||||
cp -R pypy3-v5.8.0-linux64/* $OUT_PREFIX
|
||||
|
||||
ln $OUT_PREFIX/bin/pypy3 $OUT_PREFIX/bin/python
|
||||
Executable
+15
@@ -0,0 +1,15 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/2.7.10/Python-2.7.10.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-2.7.10 src
|
||||
cd src
|
||||
|
||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||
make
|
||||
make install
|
||||
Executable
+15
@@ -0,0 +1,15 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/2.7.11/Python-2.7.11.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-2.7.11 src
|
||||
cd src
|
||||
|
||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||
make
|
||||
make install
|
||||
Executable
+15
@@ -0,0 +1,15 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/2.7.12/Python-2.7.12.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-2.7.12 src
|
||||
cd src
|
||||
|
||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||
make
|
||||
make install
|
||||
Executable
+19
@@ -0,0 +1,19 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/2.7.13/Python-2.7.13.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-2.7.13 src
|
||||
cd src
|
||||
|
||||
./configure --prefix=$OUT_PREFIX --enable-unicode=ucs4 --with-ensurepip=no
|
||||
make
|
||||
make install
|
||||
|
||||
# Remove unneeded test directories, similar to the official Docker Python images:
|
||||
# https://github.com/docker-library/python
|
||||
find "${OUT_PREFIX}" \( -type d -a \( -name test -o -name tests \) \) -exec rm -rf '{}' +
|
||||
Executable
+19
@@ -0,0 +1,19 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/2.7.14/Python-2.7.14.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-2.7.14 src
|
||||
cd src
|
||||
|
||||
./configure --prefix=$OUT_PREFIX --enable-unicode=ucs4 --with-ensurepip=no
|
||||
make
|
||||
make install
|
||||
|
||||
# Remove unneeded test directories, similar to the official Docker Python images:
|
||||
# https://github.com/docker-library/python
|
||||
find "${OUT_PREFIX}" \( -type d -a \( -name test -o -name tests \) \) -exec rm -rf '{}' +
|
||||
Executable
+15
@@ -0,0 +1,15 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/2.7.9/Python-2.7.9.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-2.7.9 src
|
||||
cd src
|
||||
|
||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||
make
|
||||
make install
|
||||
Executable
+18
@@ -0,0 +1,18 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/3.5.2/Python-3.5.2.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-3.5.2 src
|
||||
cd src
|
||||
|
||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||
make
|
||||
make install
|
||||
|
||||
# ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
||||
|
||||
Executable
+18
@@ -0,0 +1,18 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/3.5.3/Python-3.5.3.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-3.5.3 src
|
||||
cd src
|
||||
|
||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||
make
|
||||
make install
|
||||
|
||||
# ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
||||
|
||||
Executable
+18
@@ -0,0 +1,18 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/3.6.0/Python-3.6.0.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-3.6.0 src
|
||||
cd src
|
||||
|
||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||
make
|
||||
make install
|
||||
|
||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
||||
|
||||
Executable
+18
@@ -0,0 +1,18 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/3.6.1/Python-3.6.1.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-3.6.1 src
|
||||
cd src
|
||||
|
||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||
make
|
||||
make install
|
||||
|
||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
||||
|
||||
Executable
+21
@@ -0,0 +1,21 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/3.6.2/Python-3.6.2.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-3.6.2 src
|
||||
cd src
|
||||
|
||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||
make
|
||||
make install
|
||||
|
||||
# Remove unneeded test directories, similar to the official Docker Python images:
|
||||
# https://github.com/docker-library/python
|
||||
find "${OUT_PREFIX}" \( -type d -a \( -name test -o -name tests \) \) -exec rm -rf '{}' +
|
||||
|
||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
||||
Executable
+21
@@ -0,0 +1,21 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/3.6.3/Python-3.6.3.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-3.6.3 src
|
||||
cd src
|
||||
|
||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||
make
|
||||
make install
|
||||
|
||||
# Remove unneeded test directories, similar to the official Docker Python images:
|
||||
# https://github.com/docker-library/python
|
||||
find "${OUT_PREFIX}" \( -type d -a \( -name test -o -name tests \) \) -exec rm -rf '{}' +
|
||||
|
||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
||||
Executable
+21
@@ -0,0 +1,21 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/3.6.4/Python-3.6.4.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-3.6.4 src
|
||||
cd src
|
||||
|
||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||
make
|
||||
make install
|
||||
|
||||
# Remove unneeded test directories, similar to the official Docker Python images:
|
||||
# https://github.com/docker-library/python
|
||||
find "${OUT_PREFIX}" \( -type d -a \( -name test -o -name tests \) \) -exec rm -rf '{}' +
|
||||
|
||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
||||
@@ -0,0 +1,3 @@
|
||||
docopt==0.6.2
|
||||
bob-builder==0.0.13
|
||||
boto==2.48.0
|
||||
@@ -1,33 +0,0 @@
|
||||
Author
|
||||
------
|
||||
|
||||
Ian Bicking
|
||||
|
||||
Maintainers
|
||||
-----------
|
||||
|
||||
Brian Rosner
|
||||
Carl Meyer
|
||||
Jannis Leidel
|
||||
|
||||
Contributors
|
||||
------------
|
||||
|
||||
Alex Grönholm
|
||||
Antonio Cuni
|
||||
Armin Ronacher
|
||||
Chris McDonough
|
||||
Christian Stefanescu
|
||||
Christopher Nilsson
|
||||
Curt Micol
|
||||
Douglas Creager
|
||||
Gunnlaugur Thor Briem
|
||||
Jeff Hammel
|
||||
Jorge Vargas
|
||||
Josh Bronson
|
||||
Kumar McMillan
|
||||
Lars Francke
|
||||
Philip Jenvey
|
||||
Ronny Pfannschmidt
|
||||
Tarek Ziadé
|
||||
Vinay Sajip
|
||||
@@ -1,16 +0,0 @@
|
||||
virtualenv
|
||||
==========
|
||||
|
||||
See docs/index.txt for user documentation.
|
||||
|
||||
Contributor notes
|
||||
-----------------
|
||||
|
||||
* virtualenv is designed to work on python 2 and 3 with a single code base.
|
||||
Use Python 3 print-function syntax, and always use sys.exc_info()[1]
|
||||
inside the `except` block to get at exception objects.
|
||||
|
||||
* virtualenv uses git-flow_ to `coordinate development`_.
|
||||
|
||||
.. _git-flow: https://github.com/nvie/gitflow
|
||||
.. _coordinate development: http://nvie.com/posts/a-successful-git-branching-model/
|
||||
@@ -1,22 +0,0 @@
|
||||
Copyright (c) 2007 Ian Bicking and Contributors
|
||||
Copyright (c) 2009 Ian Bicking, The Open Planning Project
|
||||
Copyright (c) 2011 The virtualenv developers
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
@@ -1,9 +0,0 @@
|
||||
recursive-include docs *.txt
|
||||
recursive-include scripts *
|
||||
recursive-include virtualenv_support *.egg *.tar.gz
|
||||
recursive-exclude virtualenv_support *.py
|
||||
recursive-exclude docs/_templates *.*
|
||||
include virtualenv_support/__init__.py
|
||||
include *.py
|
||||
include AUTHORS.txt
|
||||
include LICENSE.txt
|
||||
@@ -1,906 +0,0 @@
|
||||
Metadata-Version: 1.0
|
||||
Name: virtualenv
|
||||
Version: 1.7
|
||||
Summary: Virtual Python Environment builder
|
||||
Home-page: http://www.virtualenv.org
|
||||
Author: Jannis Leidel, Carl Meyer and Brian Rosner
|
||||
Author-email: python-virtualenv@groups.google.com
|
||||
License: MIT
|
||||
Description:
|
||||
|
||||
Status and License
|
||||
------------------
|
||||
|
||||
``virtualenv`` is a successor to `workingenv
|
||||
<http://cheeseshop.python.org/pypi/workingenv.py>`_, and an extension
|
||||
of `virtual-python
|
||||
<http://peak.telecommunity.com/DevCenter/EasyInstall#creating-a-virtual-python>`_.
|
||||
|
||||
It was written by Ian Bicking, sponsored by the `Open Planning
|
||||
Project <http://openplans.org>`_ and is now maintained by a
|
||||
`group of developers <https://github.com/pypa/virtualenv/raw/master/AUTHORS.txt>`_.
|
||||
It is licensed under an
|
||||
`MIT-style permissive license <https://github.com/pypa/virtualenv/raw/master/LICENSE.txt>`_.
|
||||
|
||||
You can install it with ``pip install virtualenv``, or the `latest
|
||||
development version <https://github.com/pypa/virtualenv/tarball/develop#egg=virtualenv-dev>`_
|
||||
with ``pip install virtualenv==dev``.
|
||||
|
||||
You can also use ``easy_install``, or if you have no Python package manager
|
||||
available at all, you can just grab the single file `virtualenv.py`_ and run
|
||||
it with ``python virtualenv.py``.
|
||||
|
||||
.. _virtualenv.py: https://raw.github.com/pypa/virtualenv/master/virtualenv.py
|
||||
|
||||
|
||||
What It Does
|
||||
------------
|
||||
|
||||
``virtualenv`` is a tool to create isolated Python environments.
|
||||
|
||||
The basic problem being addressed is one of dependencies and versions,
|
||||
and indirectly permissions. Imagine you have an application that
|
||||
needs version 1 of LibFoo, but another application requires version
|
||||
2. How can you use both these applications? If you install
|
||||
everything into ``/usr/lib/python2.7/site-packages`` (or whatever your
|
||||
platform's standard location is), it's easy to end up in a situation
|
||||
where you unintentionally upgrade an application that shouldn't be
|
||||
upgraded.
|
||||
|
||||
Or more generally, what if you want to install an application *and
|
||||
leave it be*? If an application works, any change in its libraries or
|
||||
the versions of those libraries can break the application.
|
||||
|
||||
Also, what if you can't install packages into the global
|
||||
``site-packages`` directory? For instance, on a shared host.
|
||||
|
||||
In all these cases, ``virtualenv`` can help you. It creates an
|
||||
environment that has its own installation directories, that doesn't
|
||||
share libraries with other virtualenv environments (and optionally
|
||||
doesn't access the globally installed libraries either).
|
||||
|
||||
The basic usage is::
|
||||
|
||||
$ python virtualenv.py ENV
|
||||
|
||||
If you install it you can also just do ``virtualenv ENV``.
|
||||
|
||||
This creates ``ENV/lib/pythonX.X/site-packages``, where any libraries you
|
||||
install will go. It also creates ``ENV/bin/python``, which is a Python
|
||||
interpreter that uses this environment. Anytime you use that interpreter
|
||||
(including when a script has ``#!/path/to/ENV/bin/python`` in it) the libraries
|
||||
in that environment will be used.
|
||||
|
||||
It also installs either `Setuptools
|
||||
<http://peak.telecommunity.com/DevCenter/setuptools>`_ or `distribute
|
||||
<http://pypi.python.org/pypi/distribute>`_ into the environment. To use
|
||||
Distribute instead of setuptools, just call virtualenv like this::
|
||||
|
||||
$ python virtualenv.py --distribute ENV
|
||||
|
||||
You can also set the environment variable VIRTUALENV_USE_DISTRIBUTE.
|
||||
|
||||
A new virtualenv also includes the `pip <http://pypy.python.org/pypi/pip>`_
|
||||
installer, so you can use ``ENV/bin/pip`` to install additional packages into
|
||||
the environment.
|
||||
|
||||
Environment variables and configuration files
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
virtualenv can not only be configured by passing command line options such as
|
||||
``--distribute`` but also by two other means:
|
||||
|
||||
- Environment variables
|
||||
|
||||
Each command line option is automatically used to look for environment
|
||||
variables with the name format ``VIRTUALENV_<UPPER_NAME>``. That means
|
||||
the name of the command line options are capitalized and have dashes
|
||||
(``'-'``) replaced with underscores (``'_'``).
|
||||
|
||||
For example, to automatically install Distribute instead of setuptools
|
||||
you can also set an environment variable::
|
||||
|
||||
$ export VIRTUALENV_USE_DISTRIBUTE=true
|
||||
$ python virtualenv.py ENV
|
||||
|
||||
It's the same as passing the option to virtualenv directly::
|
||||
|
||||
$ python virtualenv.py --distribute ENV
|
||||
|
||||
This also works for appending command line options, like ``--find-links``.
|
||||
Just leave an empty space between the passsed values, e.g.::
|
||||
|
||||
$ export VIRTUALENV_EXTRA_SEARCH_DIR="/path/to/dists /path/to/other/dists"
|
||||
$ virtualenv ENV
|
||||
|
||||
is the same as calling::
|
||||
|
||||
$ python virtualenv.py --extra-search-dir=/path/to/dists --extra-search-dir=/path/to/other/dists ENV
|
||||
|
||||
- Config files
|
||||
|
||||
virtualenv also looks for a standard ini config file. On Unix and Mac OS X
|
||||
that's ``$HOME/.virtualenv/virtualenv.ini`` and on Windows, it's
|
||||
``%HOME%\\virtualenv\\virtualenv.ini``.
|
||||
|
||||
The names of the settings are derived from the long command line option,
|
||||
e.g. the option ``--distribute`` would look like this::
|
||||
|
||||
[virtualenv]
|
||||
distribute = true
|
||||
|
||||
Appending options like ``--extra-search-dir`` can be written on multiple
|
||||
lines::
|
||||
|
||||
[virtualenv]
|
||||
extra-search-dir =
|
||||
/path/to/dists
|
||||
/path/to/other/dists
|
||||
|
||||
Please have a look at the output of ``virtualenv --help`` for a full list
|
||||
of supported options.
|
||||
|
||||
Windows Notes
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
Some paths within the virtualenv are slightly different on Windows: scripts and
|
||||
executables on Windows go in ``ENV\Scripts\`` instead of ``ENV/bin/`` and
|
||||
libraries go in ``ENV\Lib\`` rather than ``ENV/lib/``.
|
||||
|
||||
To create a virtualenv under a path with spaces in it on Windows, you'll need
|
||||
the `win32api <http://sourceforge.net/projects/pywin32/>`_ library installed.
|
||||
|
||||
PyPy Support
|
||||
~~~~~~~~~~~~
|
||||
|
||||
Beginning with virtualenv version 1.5 `PyPy <http://pypy.org>`_ is
|
||||
supported. To use PyPy 1.4 or 1.4.1, you need a version of virtualenv >= 1.5.
|
||||
To use PyPy 1.5, you need a version of virtualenv >= 1.6.1.
|
||||
|
||||
Creating Your Own Bootstrap Scripts
|
||||
-----------------------------------
|
||||
|
||||
While this creates an environment, it doesn't put anything into the
|
||||
environment. Developers may find it useful to distribute a script
|
||||
that sets up a particular environment, for example a script that
|
||||
installs a particular web application.
|
||||
|
||||
To create a script like this, call
|
||||
``virtualenv.create_bootstrap_script(extra_text)``, and write the
|
||||
result to your new bootstrapping script. Here's the documentation
|
||||
from the docstring:
|
||||
|
||||
Creates a bootstrap script, which is like this script but with
|
||||
extend_parser, adjust_options, and after_install hooks.
|
||||
|
||||
This returns a string that (written to disk of course) can be used
|
||||
as a bootstrap script with your own customizations. The script
|
||||
will be the standard virtualenv.py script, with your extra text
|
||||
added (your extra text should be Python code).
|
||||
|
||||
If you include these functions, they will be called:
|
||||
|
||||
``extend_parser(optparse_parser)``:
|
||||
You can add or remove options from the parser here.
|
||||
|
||||
``adjust_options(options, args)``:
|
||||
You can change options here, or change the args (if you accept
|
||||
different kinds of arguments, be sure you modify ``args`` so it is
|
||||
only ``[DEST_DIR]``).
|
||||
|
||||
``after_install(options, home_dir)``:
|
||||
|
||||
After everything is installed, this function is called. This
|
||||
is probably the function you are most likely to use. An
|
||||
example would be::
|
||||
|
||||
def after_install(options, home_dir):
|
||||
if sys.platform == 'win32':
|
||||
bin = 'Scripts'
|
||||
else:
|
||||
bin = 'bin'
|
||||
subprocess.call([join(home_dir, bin, 'easy_install'),
|
||||
'MyPackage'])
|
||||
subprocess.call([join(home_dir, bin, 'my-package-script'),
|
||||
'setup', home_dir])
|
||||
|
||||
This example immediately installs a package, and runs a setup
|
||||
script from that package.
|
||||
|
||||
Bootstrap Example
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
Here's a more concrete example of how you could use this::
|
||||
|
||||
import virtualenv, textwrap
|
||||
output = virtualenv.create_bootstrap_script(textwrap.dedent("""
|
||||
import os, subprocess
|
||||
def after_install(options, home_dir):
|
||||
etc = join(home_dir, 'etc')
|
||||
if not os.path.exists(etc):
|
||||
os.makedirs(etc)
|
||||
subprocess.call([join(home_dir, 'bin', 'easy_install'),
|
||||
'BlogApplication'])
|
||||
subprocess.call([join(home_dir, 'bin', 'paster'),
|
||||
'make-config', 'BlogApplication',
|
||||
join(etc, 'blog.ini')])
|
||||
subprocess.call([join(home_dir, 'bin', 'paster'),
|
||||
'setup-app', join(etc, 'blog.ini')])
|
||||
"""))
|
||||
f = open('blog-bootstrap.py', 'w').write(output)
|
||||
|
||||
Another example is available `here
|
||||
<https://github.com/socialplanning/fassembler/blob/master/fassembler/create-venv-script.py>`_.
|
||||
|
||||
activate script
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
In a newly created virtualenv there will be a ``bin/activate`` shell
|
||||
script, or a ``Scripts/activate.bat`` batch file on Windows.
|
||||
|
||||
On Posix systems you can do::
|
||||
|
||||
$ source bin/activate
|
||||
|
||||
This will change your ``$PATH`` to point to the virtualenv's ``bin/``
|
||||
directory. (You have to use ``source`` because it changes your shell
|
||||
environment in-place.) This is all it does; it's purely a convenience. If
|
||||
you directly run a script or the python interpreter from the virtualenv's
|
||||
``bin/`` directory (e.g. ``path/to/env/bin/pip`` or
|
||||
``/path/to/env/bin/python script.py``) there's no need for activation.
|
||||
|
||||
After activating an environment you can use the function ``deactivate`` to
|
||||
undo the changes to your ``$PATH``.
|
||||
|
||||
The ``activate`` script will also modify your shell prompt to indicate
|
||||
which environment is currently active. You can disable this behavior,
|
||||
which can be useful if you have your own custom prompt that already
|
||||
displays the active environment name. To do so, set the
|
||||
``VIRTUAL_ENV_DISABLE_PROMPT`` environment variable to any non-empty
|
||||
value before running the ``activate`` script.
|
||||
|
||||
On Windows you just do::
|
||||
|
||||
> \path\to\env\Scripts\activate.bat
|
||||
|
||||
And use ``deactivate.bat`` to undo the changes.
|
||||
|
||||
The ``--system-site-packages`` Option
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
If you build with ``virtualenv --system-site-packages ENV``, your virtual
|
||||
environment will inherit packages from ``/usr/lib/python2.7/site-packages``
|
||||
(or wherever your global site-packages directory is).
|
||||
|
||||
This can be used if you have control over the global site-packages directory,
|
||||
and you want to depend on the packages there. If you want isolation from the
|
||||
global system, do not use this flag.
|
||||
|
||||
Using Virtualenv without ``bin/python``
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Sometimes you can't or don't want to use the Python interpreter
|
||||
created by the virtualenv. For instance, in a `mod_python
|
||||
<http://www.modpython.org/>`_ or `mod_wsgi <http://www.modwsgi.org/>`_
|
||||
environment, there is only one interpreter.
|
||||
|
||||
Luckily, it's easy. You must use the custom Python interpreter to
|
||||
*install* libraries. But to *use* libraries, you just have to be sure
|
||||
the path is correct. A script is available to correct the path. You
|
||||
can setup the environment like::
|
||||
|
||||
activate_this = '/path/to/env/bin/activate_this.py'
|
||||
execfile(activate_this, dict(__file__=activate_this))
|
||||
|
||||
This will change ``sys.path`` and even change ``sys.prefix``, but also allow
|
||||
you to use an existing interpreter. Items in your environment will show up
|
||||
first on ``sys.path``, before global items. However, global items will
|
||||
always be accessible (as if the ``--system-site-packages`` flag had been used
|
||||
in creating the environment, whether it was or not). Also, this cannot undo
|
||||
the activation of other environments, or modules that have been imported.
|
||||
You shouldn't try to, for instance, activate an environment before a web
|
||||
request; you should activate *one* environment as early as possible, and not
|
||||
do it again in that process.
|
||||
|
||||
Making Environments Relocatable
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Note: this option is somewhat experimental, and there are probably
|
||||
caveats that have not yet been identified. Also this does not
|
||||
currently work on Windows.
|
||||
|
||||
Normally environments are tied to a specific path. That means that
|
||||
you cannot move an environment around or copy it to another computer.
|
||||
You can fix up an environment to make it relocatable with the
|
||||
command::
|
||||
|
||||
$ virtualenv --relocatable ENV
|
||||
|
||||
This will make some of the files created by setuptools or distribute
|
||||
use relative paths, and will change all the scripts to use ``activate_this.py``
|
||||
instead of using the location of the Python interpreter to select the
|
||||
environment.
|
||||
|
||||
**Note:** you must run this after you've installed *any* packages into
|
||||
the environment. If you make an environment relocatable, then
|
||||
install a new package, you must run ``virtualenv --relocatable``
|
||||
again.
|
||||
|
||||
Also, this **does not make your packages cross-platform**. You can
|
||||
move the directory around, but it can only be used on other similar
|
||||
computers. Some known environmental differences that can cause
|
||||
incompatibilities: a different version of Python, when one platform
|
||||
uses UCS2 for its internal unicode representation and another uses
|
||||
UCS4 (a compile-time option), obvious platform changes like Windows
|
||||
vs. Linux, or Intel vs. ARM, and if you have libraries that bind to C
|
||||
libraries on the system, if those C libraries are located somewhere
|
||||
different (either different versions, or a different filesystem
|
||||
layout).
|
||||
|
||||
If you use this flag to create an environment, currently, the
|
||||
``--system-site-packages`` option will be implied.
|
||||
|
||||
The ``--extra-search-dir`` Option
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
When it creates a new environment, virtualenv installs either
|
||||
setuptools or distribute, and pip. In normal operation, the latest
|
||||
releases of these packages are fetched from the `Python Package Index
|
||||
<http://pypi.python.org>`_ (PyPI). In some circumstances, this
|
||||
behavior may not be wanted, for example if you are using virtualenv
|
||||
during a deployment and do not want to depend on Internet access and
|
||||
PyPI availability.
|
||||
|
||||
As an alternative, you can provide your own versions of setuptools,
|
||||
distribute and/or pip on the filesystem, and tell virtualenv to use
|
||||
those distributions instead of downloading them from the Internet. To
|
||||
use this feature, pass one or more ``--extra-search-dir`` options to
|
||||
virtualenv like this::
|
||||
|
||||
$ virtualenv --extra-search-dir=/path/to/distributions ENV
|
||||
|
||||
The ``/path/to/distributions`` path should point to a directory that
|
||||
contains setuptools, distribute and/or pip distributions. Setuptools
|
||||
distributions must be ``.egg`` files; distribute and pip distributions
|
||||
should be `.tar.gz` source distributions.
|
||||
|
||||
Virtualenv will still download these packages if no satisfactory local
|
||||
distributions are found.
|
||||
|
||||
If you are really concerned about virtualenv fetching these packages
|
||||
from the Internet and want to ensure that it never will, you can also
|
||||
provide an option ``--never-download`` like so::
|
||||
|
||||
$ virtualenv --extra-search-dir=/path/to/distributions --never-download ENV
|
||||
|
||||
If this option is provided, virtualenv will never try to download
|
||||
setuptools/distribute or pip. Instead, it will exit with status code 1
|
||||
if it fails to find local distributions for any of these required
|
||||
packages.
|
||||
|
||||
Compare & Contrast with Alternatives
|
||||
------------------------------------
|
||||
|
||||
There are several alternatives that create isolated environments:
|
||||
|
||||
* ``workingenv`` (which I do not suggest you use anymore) is the
|
||||
predecessor to this library. It used the main Python interpreter,
|
||||
but relied on setting ``$PYTHONPATH`` to activate the environment.
|
||||
This causes problems when running Python scripts that aren't part of
|
||||
the environment (e.g., a globally installed ``hg`` or ``bzr``). It
|
||||
also conflicted a lot with Setuptools.
|
||||
|
||||
* `virtual-python
|
||||
<http://peak.telecommunity.com/DevCenter/EasyInstall#creating-a-virtual-python>`_
|
||||
is also a predecessor to this library. It uses only symlinks, so it
|
||||
couldn't work on Windows. It also symlinks over the *entire*
|
||||
standard library and global ``site-packages``. As a result, it
|
||||
won't see new additions to the global ``site-packages``.
|
||||
|
||||
This script only symlinks a small portion of the standard library
|
||||
into the environment, and so on Windows it is feasible to simply
|
||||
copy these files over. Also, it creates a new/empty
|
||||
``site-packages`` and also adds the global ``site-packages`` to the
|
||||
path, so updates are tracked separately. This script also installs
|
||||
Setuptools automatically, saving a step and avoiding the need for
|
||||
network access.
|
||||
|
||||
* `zc.buildout <http://pypi.python.org/pypi/zc.buildout>`_ doesn't
|
||||
create an isolated Python environment in the same style, but
|
||||
achieves similar results through a declarative config file that sets
|
||||
up scripts with very particular packages. As a declarative system,
|
||||
it is somewhat easier to repeat and manage, but more difficult to
|
||||
experiment with. ``zc.buildout`` includes the ability to setup
|
||||
non-Python systems (e.g., a database server or an Apache instance).
|
||||
|
||||
I *strongly* recommend anyone doing application development or
|
||||
deployment use one of these tools.
|
||||
|
||||
Contributing
|
||||
------------
|
||||
|
||||
Refer to the `contributing to pip`_ documentation - it applies equally to
|
||||
virtualenv.
|
||||
|
||||
Virtualenv's release schedule is tied to pip's -- each time there's a new pip
|
||||
release, there will be a new virtualenv release that bundles the new version of
|
||||
pip.
|
||||
|
||||
.. _contributing to pip: http://www.pip-installer.org/en/latest/how-to-contribute.html
|
||||
|
||||
Running the tests
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
Virtualenv's test suite is small and not yet at all comprehensive, but we aim
|
||||
to grow it.
|
||||
|
||||
The easy way to run tests (handles test dependencies automatically)::
|
||||
|
||||
$ python setup.py test
|
||||
|
||||
If you want to run only a selection of the tests, you'll need to run them
|
||||
directly with nose instead. Create a virtualenv, and install required
|
||||
packages::
|
||||
|
||||
$ pip install nose mock
|
||||
|
||||
Run nosetests::
|
||||
|
||||
$ nosetests
|
||||
|
||||
Or select just a single test file to run::
|
||||
|
||||
$ nosetests tests.test_virtualenv
|
||||
|
||||
|
||||
Other Documentation and Links
|
||||
-----------------------------
|
||||
|
||||
* James Gardner has written a tutorial on using `virtualenv with
|
||||
Pylons
|
||||
<http://wiki.pylonshq.com/display/pylonscookbook/Using+a+Virtualenv+Sandbox>`_.
|
||||
|
||||
* `Blog announcement
|
||||
<http://blog.ianbicking.org/2007/10/10/workingenv-is-dead-long-live-virtualenv/>`_.
|
||||
|
||||
* Doug Hellmann wrote a description of his `command-line work flow
|
||||
using virtualenv (virtualenvwrapper)
|
||||
<http://www.doughellmann.com/articles/CompletelyDifferent-2008-05-virtualenvwrapper/index.html>`_
|
||||
including some handy scripts to make working with multiple
|
||||
environments easier. He also wrote `an example of using virtualenv
|
||||
to try IPython
|
||||
<http://www.doughellmann.com/articles/CompletelyDifferent-2008-02-ipython-and-virtualenv/index.html>`_.
|
||||
|
||||
* Chris Perkins created a `showmedo video including virtualenv
|
||||
<http://showmedo.com/videos/video?name=2910000&fromSeriesID=291>`_.
|
||||
|
||||
* `Using virtualenv with mod_wsgi
|
||||
<http://code.google.com/p/modwsgi/wiki/VirtualEnvironments>`_.
|
||||
|
||||
* `virtualenv commands
|
||||
<http://thisismedium.com/tech/extending-virtualenv/>`_ for some more
|
||||
workflow-related tools around virtualenv.
|
||||
|
||||
Changes & News
|
||||
--------------
|
||||
|
||||
1.7 (2011-11-30)
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
* Updated embedded Distribute release to 0.6.24. Thanks Alex Grönholm.
|
||||
|
||||
* Made ``--no-site-packages`` behavior the default behavior. The
|
||||
``--no-site-packages`` flag is still permitted, but displays a warning when
|
||||
used. Thanks Chris McDonough.
|
||||
|
||||
* New flag: ``--system-site-packages``; this flag should be passed to get the
|
||||
previous default global-site-package-including behavior back.
|
||||
|
||||
* Added ability to set command options as environment variables and options
|
||||
in a ``virtualenv.ini`` file.
|
||||
|
||||
* Fixed various encoding related issues with paths. Thanks Gunnlaugur Thor Briem.
|
||||
|
||||
* Made ``virtualenv.py`` script executable.
|
||||
|
||||
1.6.4 (2011-07-21)
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Restored ability to run on Python 2.4, too.
|
||||
|
||||
1.6.3 (2011-07-16)
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Restored ability to run on Python < 2.7.
|
||||
|
||||
1.6.2 (2011-07-16)
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Updated embedded distribute release to 0.6.19.
|
||||
|
||||
* Updated embedded pip release to 1.0.2.
|
||||
|
||||
* Fixed #141 - Be smarter about finding pkg_resources when using the
|
||||
non-default Python intepreter (by using the ``-p`` option).
|
||||
|
||||
* Fixed #112 - Fixed path in docs.
|
||||
|
||||
* Fixed #109 - Corrected doctests of a Logger method.
|
||||
|
||||
* Fixed #118 - Fixed creating virtualenvs on platforms that use the
|
||||
"posix_local" install scheme, such as Ubuntu with Python 2.7.
|
||||
|
||||
* Add missing library to Python 3 virtualenvs (``_dummy_thread``).
|
||||
|
||||
|
||||
1.6.1 (2011-04-30)
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Start to use git-flow.
|
||||
|
||||
* Added support for PyPy 1.5
|
||||
|
||||
* Fixed #121 -- added sanity-checking of the -p argument. Thanks Paul Nasrat.
|
||||
|
||||
* Added progress meter for pip installation as well as setuptools. Thanks Ethan
|
||||
Jucovy.
|
||||
|
||||
* Added --never-download and --search-dir options. Thanks Ethan Jucovy.
|
||||
|
||||
1.6
|
||||
~~~
|
||||
|
||||
* Added Python 3 support! Huge thanks to Vinay Sajip and Vitaly Babiy.
|
||||
|
||||
* Fixed creation of virtualenvs on Mac OS X when standard library modules
|
||||
(readline) are installed outside the standard library.
|
||||
|
||||
* Updated bundled pip to 1.0.
|
||||
|
||||
1.5.2
|
||||
~~~~~
|
||||
|
||||
* Moved main repository to Github: https://github.com/pypa/virtualenv
|
||||
|
||||
* Transferred primary maintenance from Ian to Jannis Leidel, Carl Meyer and Brian Rosner
|
||||
|
||||
* Fixed a few more pypy related bugs.
|
||||
|
||||
* Updated bundled pip to 0.8.2.
|
||||
|
||||
* Handed project over to new team of maintainers.
|
||||
|
||||
* Moved virtualenv to Github at https://github.com/pypa/virtualenv
|
||||
|
||||
1.5.1
|
||||
~~~~~
|
||||
|
||||
* Added ``_weakrefset`` requirement for Python 2.7.1.
|
||||
|
||||
* Fixed Windows regression in 1.5
|
||||
|
||||
1.5
|
||||
~~~
|
||||
|
||||
* Include pip 0.8.1.
|
||||
|
||||
* Add support for PyPy.
|
||||
|
||||
* Uses a proper temporary dir when installing environment requirements.
|
||||
|
||||
* Add ``--prompt`` option to be able to override the default prompt prefix.
|
||||
|
||||
* Fix an issue with ``--relocatable`` on Windows.
|
||||
|
||||
* Fix issue with installing the wrong version of distribute.
|
||||
|
||||
* Add fish and csh activate scripts.
|
||||
|
||||
1.4.9
|
||||
~~~~~
|
||||
|
||||
* Include pip 0.7.2
|
||||
|
||||
1.4.8
|
||||
~~~~~
|
||||
|
||||
* Fix for Mac OS X Framework builds that use
|
||||
``--universal-archs=intel``
|
||||
|
||||
* Fix ``activate_this.py`` on Windows.
|
||||
|
||||
* Allow ``$PYTHONHOME`` to be set, so long as you use ``source
|
||||
bin/activate`` it will get unset; if you leave it set and do not
|
||||
activate the environment it will still break the environment.
|
||||
|
||||
* Include pip 0.7.1
|
||||
|
||||
1.4.7
|
||||
~~~~~
|
||||
|
||||
* Include pip 0.7
|
||||
|
||||
1.4.6
|
||||
~~~~~
|
||||
|
||||
* Allow ``activate.sh`` to skip updating the prompt (by setting
|
||||
``$VIRTUAL_ENV_DISABLE_PROMPT``).
|
||||
|
||||
1.4.5
|
||||
~~~~~
|
||||
|
||||
* Include pip 0.6.3
|
||||
|
||||
* Fix ``activate.bat`` and ``deactivate.bat`` under Windows when
|
||||
``PATH`` contained a parenthesis
|
||||
|
||||
1.4.4
|
||||
~~~~~
|
||||
|
||||
* Include pip 0.6.2 and Distribute 0.6.10
|
||||
|
||||
* Create the ``virtualenv`` script even when Setuptools isn't
|
||||
installed
|
||||
|
||||
* Fix problem with ``virtualenv --relocate`` when ``bin/`` has
|
||||
subdirectories (e.g., ``bin/.svn/``); from Alan Franzoni.
|
||||
|
||||
* If you set ``$VIRTUALENV_USE_DISTRIBUTE`` then virtualenv will use
|
||||
Distribute by default (so you don't have to remember to use
|
||||
``--distribute``).
|
||||
|
||||
1.4.3
|
||||
~~~~~
|
||||
|
||||
* Include pip 0.6.1
|
||||
|
||||
1.4.2
|
||||
~~~~~
|
||||
|
||||
* Fix pip installation on Windows
|
||||
|
||||
* Fix use of stand-alone ``virtualenv.py`` (and boot scripts)
|
||||
|
||||
* Exclude ~/.local (user site-packages) from environments when using
|
||||
``--no-site-packages``
|
||||
|
||||
1.4.1
|
||||
~~~~~
|
||||
|
||||
* Include pip 0.6
|
||||
|
||||
1.4
|
||||
~~~
|
||||
|
||||
* Updated setuptools to 0.6c11
|
||||
|
||||
* Added the --distribute option
|
||||
|
||||
* Fixed packaging problem of support-files
|
||||
|
||||
1.3.4
|
||||
~~~~~
|
||||
|
||||
* Virtualenv now copies the actual embedded Python binary on
|
||||
Mac OS X to fix a hang on Snow Leopard (10.6).
|
||||
|
||||
* Fail more gracefully on Windows when ``win32api`` is not installed.
|
||||
|
||||
* Fix site-packages taking precedent over Jython's ``__classpath__``
|
||||
and also specially handle the new ``__pyclasspath__`` entry in
|
||||
``sys.path``.
|
||||
|
||||
* Now copies Jython's ``registry`` file to the virtualenv if it exists.
|
||||
|
||||
* Better find libraries when compiling extensions on Windows.
|
||||
|
||||
* Create ``Scripts\pythonw.exe`` on Windows.
|
||||
|
||||
* Added support for the Debian/Ubuntu
|
||||
``/usr/lib/pythonX.Y/dist-packages`` directory.
|
||||
|
||||
* Set ``distutils.sysconfig.get_config_vars()['LIBDIR']`` (based on
|
||||
``sys.real_prefix``) which is reported to help building on Windows.
|
||||
|
||||
* Make ``deactivate`` work on ksh
|
||||
|
||||
* Fixes for ``--python``: make it work with ``--relocatable`` and the
|
||||
symlink created to the exact Python version.
|
||||
|
||||
1.3.3
|
||||
~~~~~
|
||||
|
||||
* Use Windows newlines in ``activate.bat``, which has been reported to help
|
||||
when using non-ASCII directory names.
|
||||
|
||||
* Fixed compatibility with Jython 2.5b1.
|
||||
|
||||
* Added a function ``virtualenv.install_python`` for more fine-grained
|
||||
access to what ``virtualenv.create_environment`` does.
|
||||
|
||||
* Fix `a problem <https://bugs.launchpad.net/virtualenv/+bug/241581>`_
|
||||
with Windows and paths that contain spaces.
|
||||
|
||||
* If ``/path/to/env/.pydistutils.cfg`` exists (or
|
||||
``/path/to/env/pydistutils.cfg`` on Windows systems) then ignore
|
||||
``~/.pydistutils.cfg`` and use that other file instead.
|
||||
|
||||
* Fix ` a problem
|
||||
<https://bugs.launchpad.net/virtualenv/+bug/340050>`_ picking up
|
||||
some ``.so`` libraries in ``/usr/local``.
|
||||
|
||||
1.3.2
|
||||
~~~~~
|
||||
|
||||
* Remove the ``[install] prefix = ...`` setting from the virtualenv
|
||||
``distutils.cfg`` -- this has been causing problems for a lot of
|
||||
people, in rather obscure ways.
|
||||
|
||||
* If you use a `boot script <./index.html#boot-script>`_ it will attempt to import ``virtualenv``
|
||||
and find a pre-downloaded Setuptools egg using that.
|
||||
|
||||
* Added platform-specific paths, like ``/usr/lib/pythonX.Y/plat-linux2``
|
||||
|
||||
1.3.1
|
||||
~~~~~
|
||||
|
||||
* Real Python 2.6 compatibility. Backported the Python 2.6 updates to
|
||||
``site.py``, including `user directories
|
||||
<http://docs.python.org/dev/whatsnew/2.6.html#pep-370-per-user-site-packages-directory>`_
|
||||
(this means older versions of Python will support user directories,
|
||||
whether intended or not).
|
||||
|
||||
* Always set ``[install] prefix`` in ``distutils.cfg`` -- previously
|
||||
on some platforms where a system-wide ``distutils.cfg`` was present
|
||||
with a ``prefix`` setting, packages would be installed globally
|
||||
(usually in ``/usr/local/lib/pythonX.Y/site-packages``).
|
||||
|
||||
* Sometimes Cygwin seems to leave ``.exe`` off ``sys.executable``; a
|
||||
workaround is added.
|
||||
|
||||
* Fix ``--python`` option.
|
||||
|
||||
* Fixed handling of Jython environments that use a
|
||||
jython-complete.jar.
|
||||
|
||||
1.3
|
||||
~~~
|
||||
|
||||
* Update to Setuptools 0.6c9
|
||||
* Added an option ``virtualenv --relocatable EXISTING_ENV``, which
|
||||
will make an existing environment "relocatable" -- the paths will
|
||||
not be absolute in scripts, ``.egg-info`` and ``.pth`` files. This
|
||||
may assist in building environments that can be moved and copied.
|
||||
You have to run this *after* any new packages installed.
|
||||
* Added ``bin/activate_this.py``, a file you can use like
|
||||
``execfile("path_to/activate_this.py",
|
||||
dict(__file__="path_to/activate_this.py"))`` -- this will activate
|
||||
the environment in place, similar to what `the mod_wsgi example
|
||||
does <http://code.google.com/p/modwsgi/wiki/VirtualEnvironments>`_.
|
||||
* For Mac framework builds of Python, the site-packages directory
|
||||
``/Library/Python/X.Y/site-packages`` is added to ``sys.path``, from
|
||||
Andrea Rech.
|
||||
* Some platform-specific modules in Macs are added to the path now
|
||||
(``plat-darwin/``, ``plat-mac/``, ``plat-mac/lib-scriptpackages``),
|
||||
from Andrea Rech.
|
||||
* Fixed a small Bashism in the ``bin/activate`` shell script.
|
||||
* Added ``__future__`` to the list of required modules, for Python
|
||||
2.3. You'll still need to backport your own ``subprocess`` module.
|
||||
* Fixed the ``__classpath__`` entry in Jython's ``sys.path`` taking
|
||||
precedent over virtualenv's libs.
|
||||
|
||||
1.2
|
||||
~~~
|
||||
|
||||
* Added a ``--python`` option to select the Python interpreter.
|
||||
* Add ``warnings`` to the modules copied over, for Python 2.6 support.
|
||||
* Add ``sets`` to the module copied over for Python 2.3 (though Python
|
||||
2.3 still probably doesn't work).
|
||||
|
||||
1.1.1
|
||||
~~~~~
|
||||
|
||||
* Added support for Jython 2.5.
|
||||
|
||||
1.1
|
||||
~~~
|
||||
|
||||
* Added support for Python 2.6.
|
||||
* Fix a problem with missing ``DLLs/zlib.pyd`` on Windows. Create
|
||||
* ``bin/python`` (or ``bin/python.exe``) even when you run virtualenv
|
||||
with an interpreter named, e.g., ``python2.4``
|
||||
* Fix MacPorts Python
|
||||
* Added --unzip-setuptools option
|
||||
* Update to Setuptools 0.6c8
|
||||
* If the current directory is not writable, run ez_setup.py in ``/tmp``
|
||||
* Copy or symlink over the ``include`` directory so that packages will
|
||||
more consistently compile.
|
||||
|
||||
1.0
|
||||
~~~
|
||||
|
||||
* Fix build on systems that use ``/usr/lib64``, distinct from
|
||||
``/usr/lib`` (specifically CentOS x64).
|
||||
* Fixed bug in ``--clear``.
|
||||
* Fixed typos in ``deactivate.bat``.
|
||||
* Preserve ``$PYTHONPATH`` when calling subprocesses.
|
||||
|
||||
0.9.2
|
||||
~~~~~
|
||||
|
||||
* Fix include dir copying on Windows (makes compiling possible).
|
||||
* Include the main ``lib-tk`` in the path.
|
||||
* Patch ``distutils.sysconfig``: ``get_python_inc`` and
|
||||
``get_python_lib`` to point to the global locations.
|
||||
* Install ``distutils.cfg`` before Setuptools, so that system
|
||||
customizations of ``distutils.cfg`` won't effect the installation.
|
||||
* Add ``bin/pythonX.Y`` to the virtualenv (in addition to
|
||||
``bin/python``).
|
||||
* Fixed an issue with Mac Framework Python builds, and absolute paths
|
||||
(from Ronald Oussoren).
|
||||
|
||||
0.9.1
|
||||
~~~~~
|
||||
|
||||
* Improve ability to create a virtualenv from inside a virtualenv.
|
||||
* Fix a little bug in ``bin/activate``.
|
||||
* Actually get ``distutils.cfg`` to work reliably.
|
||||
|
||||
0.9
|
||||
~~~
|
||||
|
||||
* Added ``lib-dynload`` and ``config`` to things that need to be
|
||||
copied over in an environment.
|
||||
* Copy over or symlink the ``include`` directory, so that you can
|
||||
build packages that need the C headers.
|
||||
* Include a ``distutils`` package, so you can locally update
|
||||
``distutils.cfg`` (in ``lib/pythonX.Y/distutils/distutils.cfg``).
|
||||
* Better avoid downloading Setuptools, and hitting PyPI on environment
|
||||
creation.
|
||||
* Fix a problem creating a ``lib64/`` directory.
|
||||
* Should work on MacOSX Framework builds (the default Python
|
||||
installations on Mac). Thanks to Ronald Oussoren.
|
||||
|
||||
0.8.4
|
||||
~~~~~
|
||||
|
||||
* Windows installs would sometimes give errors about ``sys.prefix`` that
|
||||
were inaccurate.
|
||||
* Slightly prettier output.
|
||||
|
||||
0.8.3
|
||||
~~~~~
|
||||
|
||||
* Added support for Windows.
|
||||
|
||||
0.8.2
|
||||
~~~~~
|
||||
|
||||
* Give a better warning if you are on an unsupported platform (Mac
|
||||
Framework Pythons, and Windows).
|
||||
* Give error about running while inside a workingenv.
|
||||
* Give better error message about Python 2.3.
|
||||
|
||||
0.8.1
|
||||
~~~~~
|
||||
|
||||
Fixed packaging of the library.
|
||||
|
||||
0.8
|
||||
~~~
|
||||
|
||||
Initial release. Everything is changed and new!
|
||||
|
||||
Keywords: setuptools deployment installation distutils
|
||||
Platform: UNKNOWN
|
||||
Classifier: Development Status :: 4 - Beta
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: MIT License
|
||||
Classifier: Programming Language :: Python :: 2
|
||||
Classifier: Programming Language :: Python :: 2.4
|
||||
Classifier: Programming Language :: Python :: 2.5
|
||||
Classifier: Programming Language :: Python :: 2.6
|
||||
Classifier: Programming Language :: Python :: 2.7
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3.1
|
||||
Classifier: Programming Language :: Python :: 3.2
|
||||
@@ -1,70 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
"""
|
||||
Helper script to rebuild virtualenv.py from virtualenv_support
|
||||
"""
|
||||
|
||||
import re
|
||||
import os
|
||||
import sys
|
||||
|
||||
here = os.path.dirname(__file__)
|
||||
script = os.path.join(here, '..', 'virtualenv.py')
|
||||
|
||||
file_regex = re.compile(
|
||||
r'##file (.*?)\n([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*convert\("""(.*?)"""\)',
|
||||
re.S)
|
||||
file_template = '##file %(filename)s\n%(varname)s = convert("""\n%(data)s""")'
|
||||
|
||||
def rebuild():
|
||||
f = open(script, 'rb')
|
||||
content = f.read()
|
||||
f.close()
|
||||
parts = []
|
||||
last_pos = 0
|
||||
match = None
|
||||
for match in file_regex.finditer(content):
|
||||
parts.append(content[last_pos:match.start()])
|
||||
last_pos = match.end()
|
||||
filename = match.group(1)
|
||||
varname = match.group(2)
|
||||
data = match.group(3)
|
||||
print('Found reference to file %s' % filename)
|
||||
f = open(os.path.join(here, '..', 'virtualenv_support', filename), 'rb')
|
||||
c = f.read()
|
||||
f.close()
|
||||
new_data = c.encode('zlib').encode('base64')
|
||||
if new_data == data:
|
||||
print(' Reference up to date (%s bytes)' % len(c))
|
||||
parts.append(match.group(0))
|
||||
continue
|
||||
print(' Content changed (%s bytes -> %s bytes)' % (
|
||||
zipped_len(data), len(c)))
|
||||
new_match = file_template % dict(
|
||||
filename=filename,
|
||||
varname=varname,
|
||||
data=new_data)
|
||||
parts.append(new_match)
|
||||
parts.append(content[last_pos:])
|
||||
new_content = ''.join(parts)
|
||||
if new_content != content:
|
||||
sys.stdout.write('Content updated; overwriting... ')
|
||||
f = open(script, 'wb')
|
||||
f.write(new_content)
|
||||
f.close()
|
||||
print('done.')
|
||||
else:
|
||||
print('No changes in content')
|
||||
if match is None:
|
||||
print('No variables were matched/found')
|
||||
|
||||
def zipped_len(data):
|
||||
if not data:
|
||||
return 'no data'
|
||||
try:
|
||||
return len(data.decode('base64').decode('zlib'))
|
||||
except:
|
||||
return 'unknown'
|
||||
|
||||
if __name__ == '__main__':
|
||||
rebuild()
|
||||
|
||||
@@ -1,52 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
"""
|
||||
Refresh any files in ../virtualenv_support/ that come from elsewhere
|
||||
"""
|
||||
|
||||
import os
|
||||
try:
|
||||
from urllib.request import urlopen
|
||||
except ImportError:
|
||||
from urllib2 import urlopen
|
||||
import sys
|
||||
|
||||
here = os.path.dirname(__file__)
|
||||
support_files = os.path.join(here, '..', 'virtualenv_support')
|
||||
|
||||
files = [
|
||||
('http://peak.telecommunity.com/dist/ez_setup.py', 'ez_setup.py'),
|
||||
('http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c11-py2.6.egg', 'setuptools-0.6c11-py2.6.egg'),
|
||||
('http://pypi.python.org/packages/2.5/s/setuptools/setuptools-0.6c11-py2.5.egg', 'setuptools-0.6c11-py2.5.egg'),
|
||||
('http://pypi.python.org/packages/2.4/s/setuptools/setuptools-0.6c11-py2.4.egg', 'setuptools-0.6c11-py2.4.egg'),
|
||||
('http://python-distribute.org/distribute_setup.py', 'distribute_setup.py'),
|
||||
('http://pypi.python.org/packages/source/d/distribute/distribute-0.6.24.tar.gz', 'distribute-0.6.24.tar.gz'),
|
||||
('http://pypi.python.org/packages/source/p/pip/pip-1.0.2.tar.gz', 'pip-1.0.2.tar.gz'),
|
||||
]
|
||||
|
||||
def main():
|
||||
for url, filename in files:
|
||||
sys.stdout.write('fetching %s ... ' % url)
|
||||
sys.stdout.flush()
|
||||
f = urlopen(url)
|
||||
content = f.read()
|
||||
f.close()
|
||||
print('done.')
|
||||
filename = os.path.join(support_files, filename)
|
||||
if os.path.exists(filename):
|
||||
f = open(filename, 'rb')
|
||||
cur_content = f.read()
|
||||
f.close()
|
||||
else:
|
||||
cur_content = ''
|
||||
if cur_content == content:
|
||||
print(' %s up-to-date' % filename)
|
||||
else:
|
||||
print(' overwriting %s' % filename)
|
||||
f = open(filename, 'wb')
|
||||
f.write(content)
|
||||
f.close()
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
|
||||
@@ -1,130 +0,0 @@
|
||||
# Makefile for Sphinx documentation
|
||||
#
|
||||
|
||||
# You can set these variables from the command line.
|
||||
SPHINXOPTS =
|
||||
SPHINXBUILD = sphinx-build
|
||||
PAPER =
|
||||
BUILDDIR = _build
|
||||
|
||||
# Internal variables.
|
||||
PAPEROPT_a4 = -D latex_paper_size=a4
|
||||
PAPEROPT_letter = -D latex_paper_size=letter
|
||||
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||
|
||||
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
|
||||
|
||||
help:
|
||||
@echo "Please use \`make <target>' where <target> is one of"
|
||||
@echo " html to make standalone HTML files"
|
||||
@echo " dirhtml to make HTML files named index.html in directories"
|
||||
@echo " singlehtml to make a single large HTML file"
|
||||
@echo " pickle to make pickle files"
|
||||
@echo " json to make JSON files"
|
||||
@echo " htmlhelp to make HTML files and a HTML help project"
|
||||
@echo " qthelp to make HTML files and a qthelp project"
|
||||
@echo " devhelp to make HTML files and a Devhelp project"
|
||||
@echo " epub to make an epub"
|
||||
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
|
||||
@echo " latexpdf to make LaTeX files and run them through pdflatex"
|
||||
@echo " text to make text files"
|
||||
@echo " man to make manual pages"
|
||||
@echo " changes to make an overview of all changed/added/deprecated items"
|
||||
@echo " linkcheck to check all external links for integrity"
|
||||
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
|
||||
|
||||
clean:
|
||||
-rm -rf $(BUILDDIR)/*
|
||||
|
||||
html:
|
||||
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
|
||||
|
||||
dirhtml:
|
||||
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
|
||||
|
||||
singlehtml:
|
||||
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
|
||||
@echo
|
||||
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
|
||||
|
||||
pickle:
|
||||
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
|
||||
@echo
|
||||
@echo "Build finished; now you can process the pickle files."
|
||||
|
||||
json:
|
||||
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
|
||||
@echo
|
||||
@echo "Build finished; now you can process the JSON files."
|
||||
|
||||
htmlhelp:
|
||||
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run HTML Help Workshop with the" \
|
||||
".hhp project file in $(BUILDDIR)/htmlhelp."
|
||||
|
||||
qthelp:
|
||||
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
|
||||
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
|
||||
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/django-compressor.qhcp"
|
||||
@echo "To view the help file:"
|
||||
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/django-compressor.qhc"
|
||||
|
||||
devhelp:
|
||||
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
|
||||
@echo
|
||||
@echo "Build finished."
|
||||
@echo "To view the help file:"
|
||||
@echo "# mkdir -p $$HOME/.local/share/devhelp/django-compressor"
|
||||
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/django-compressor"
|
||||
@echo "# devhelp"
|
||||
|
||||
epub:
|
||||
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
|
||||
@echo
|
||||
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
|
||||
|
||||
latex:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo
|
||||
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
|
||||
@echo "Run \`make' in that directory to run these through (pdf)latex" \
|
||||
"(use \`make latexpdf' here to do that automatically)."
|
||||
|
||||
latexpdf:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo "Running LaTeX files through pdflatex..."
|
||||
make -C $(BUILDDIR)/latex all-pdf
|
||||
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
|
||||
|
||||
text:
|
||||
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
|
||||
@echo
|
||||
@echo "Build finished. The text files are in $(BUILDDIR)/text."
|
||||
|
||||
man:
|
||||
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
|
||||
@echo
|
||||
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
|
||||
|
||||
changes:
|
||||
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
|
||||
@echo
|
||||
@echo "The overview file is in $(BUILDDIR)/changes."
|
||||
|
||||
linkcheck:
|
||||
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
|
||||
@echo
|
||||
@echo "Link check complete; look for any errors in the above output " \
|
||||
"or in $(BUILDDIR)/linkcheck/output.txt."
|
||||
|
||||
doctest:
|
||||
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
|
||||
@echo "Testing of doctests in the sources finished, look at the " \
|
||||
"results in $(BUILDDIR)/doctest/output.txt."
|
||||
@@ -1,229 +0,0 @@
|
||||
/**
|
||||
* Sphinx stylesheet -- default theme
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*/
|
||||
|
||||
@import url("basic.css");
|
||||
|
||||
/* -- page layout ----------------------------------------------------------- */
|
||||
|
||||
body {
|
||||
font-family: Arial, sans-serif;
|
||||
font-size: 100%;
|
||||
background-color: #111;
|
||||
color: #555;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
div.documentwrapper {
|
||||
float: left;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
div.bodywrapper {
|
||||
margin: 0 0 0 230px;
|
||||
}
|
||||
|
||||
hr{
|
||||
border: 1px solid #B1B4B6;
|
||||
}
|
||||
|
||||
div.document {
|
||||
background-color: #eee;
|
||||
}
|
||||
|
||||
div.body {
|
||||
background-color: #ffffff;
|
||||
color: #3E4349;
|
||||
padding: 0 30px 30px 30px;
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
||||
div.footer {
|
||||
color: #555;
|
||||
width: 100%;
|
||||
padding: 13px 0;
|
||||
text-align: center;
|
||||
font-size: 75%;
|
||||
}
|
||||
|
||||
div.footer a {
|
||||
color: #444;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
div.related {
|
||||
background-color: #6BA81E;
|
||||
line-height: 32px;
|
||||
color: #fff;
|
||||
text-shadow: 0px 1px 0 #444;
|
||||
font-size: 0.80em;
|
||||
}
|
||||
|
||||
div.related a {
|
||||
color: #E2F3CC;
|
||||
}
|
||||
|
||||
div.sphinxsidebar {
|
||||
font-size: 0.75em;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
|
||||
div.sphinxsidebarwrapper{
|
||||
padding: 20px 0;
|
||||
}
|
||||
|
||||
div.sphinxsidebar h3,
|
||||
div.sphinxsidebar h4 {
|
||||
font-family: Arial, sans-serif;
|
||||
color: #222;
|
||||
font-size: 1.2em;
|
||||
font-weight: normal;
|
||||
margin: 0;
|
||||
padding: 5px 10px;
|
||||
background-color: #ddd;
|
||||
text-shadow: 1px 1px 0 white
|
||||
}
|
||||
|
||||
div.sphinxsidebar h4{
|
||||
font-size: 1.1em;
|
||||
}
|
||||
|
||||
div.sphinxsidebar h3 a {
|
||||
color: #444;
|
||||
}
|
||||
|
||||
|
||||
div.sphinxsidebar p {
|
||||
color: #888;
|
||||
padding: 5px 20px;
|
||||
}
|
||||
|
||||
div.sphinxsidebar p.topless {
|
||||
}
|
||||
|
||||
div.sphinxsidebar ul {
|
||||
margin: 10px 20px;
|
||||
padding: 0;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
div.sphinxsidebar a {
|
||||
color: #444;
|
||||
}
|
||||
|
||||
div.sphinxsidebar input {
|
||||
border: 1px solid #ccc;
|
||||
font-family: sans-serif;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
div.sphinxsidebar input[type=text]{
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
/* -- body styles ----------------------------------------------------------- */
|
||||
|
||||
a {
|
||||
color: #005B81;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: #E32E00;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
div.body h1,
|
||||
div.body h2,
|
||||
div.body h3,
|
||||
div.body h4,
|
||||
div.body h5,
|
||||
div.body h6 {
|
||||
font-family: Arial, sans-serif;
|
||||
background-color: #BED4EB;
|
||||
font-weight: normal;
|
||||
color: #212224;
|
||||
margin: 30px 0px 10px 0px;
|
||||
padding: 5px 0 5px 10px;
|
||||
text-shadow: 0px 1px 0 white
|
||||
}
|
||||
|
||||
div.body h1 { border-top: 20px solid white; margin-top: 0; font-size: 200%; }
|
||||
div.body h2 { font-size: 150%; background-color: #C8D5E3; }
|
||||
div.body h3 { font-size: 120%; background-color: #D8DEE3; }
|
||||
div.body h4 { font-size: 110%; background-color: #D8DEE3; }
|
||||
div.body h5 { font-size: 100%; background-color: #D8DEE3; }
|
||||
div.body h6 { font-size: 100%; background-color: #D8DEE3; }
|
||||
|
||||
a.headerlink {
|
||||
color: #c60f0f;
|
||||
font-size: 0.8em;
|
||||
padding: 0 4px 0 4px;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a.headerlink:hover {
|
||||
background-color: #c60f0f;
|
||||
color: white;
|
||||
}
|
||||
|
||||
div.body p, div.body dd, div.body li {
|
||||
line-height: 1.5em;
|
||||
}
|
||||
|
||||
div.admonition p.admonition-title + p {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
div.highlight{
|
||||
background-color: white;
|
||||
}
|
||||
|
||||
div.note {
|
||||
background-color: #eee;
|
||||
border: 1px solid #ccc;
|
||||
}
|
||||
|
||||
div.seealso {
|
||||
background-color: #ffc;
|
||||
border: 1px solid #ff6;
|
||||
}
|
||||
|
||||
div.topic {
|
||||
background-color: #eee;
|
||||
}
|
||||
|
||||
div.warning {
|
||||
background-color: #ffe4e4;
|
||||
border: 1px solid #f66;
|
||||
}
|
||||
|
||||
p.admonition-title {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
p.admonition-title:after {
|
||||
content: ":";
|
||||
}
|
||||
|
||||
pre {
|
||||
padding: 10px;
|
||||
background-color: White;
|
||||
color: #222;
|
||||
line-height: 1.2em;
|
||||
border: 1px solid #C6C9CB;
|
||||
font-size: 1.2em;
|
||||
margin: 1.5em 0 1.5em 0;
|
||||
-webkit-box-shadow: 1px 1px 1px #d8d8d8;
|
||||
-moz-box-shadow: 1px 1px 1px #d8d8d8;
|
||||
}
|
||||
|
||||
tt {
|
||||
background-color: #ecf0f3;
|
||||
color: #222;
|
||||
padding: 1px 2px;
|
||||
font-size: 1.2em;
|
||||
font-family: monospace;
|
||||
}
|
||||
@@ -1,54 +0,0 @@
|
||||
.c { color: #999988; font-style: italic } /* Comment */
|
||||
.k { font-weight: bold } /* Keyword */
|
||||
.o { font-weight: bold } /* Operator */
|
||||
.cm { color: #999988; font-style: italic } /* Comment.Multiline */
|
||||
.cp { color: #999999; font-weight: bold } /* Comment.preproc */
|
||||
.c1 { color: #999988; font-style: italic } /* Comment.Single */
|
||||
.gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
|
||||
.ge { font-style: italic } /* Generic.Emph */
|
||||
.gr { color: #aa0000 } /* Generic.Error */
|
||||
.gh { color: #999999 } /* Generic.Heading */
|
||||
.gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
|
||||
.go { color: #111 } /* Generic.Output */
|
||||
.gp { color: #555555 } /* Generic.Prompt */
|
||||
.gs { font-weight: bold } /* Generic.Strong */
|
||||
.gu { color: #aaaaaa } /* Generic.Subheading */
|
||||
.gt { color: #aa0000 } /* Generic.Traceback */
|
||||
.kc { font-weight: bold } /* Keyword.Constant */
|
||||
.kd { font-weight: bold } /* Keyword.Declaration */
|
||||
.kp { font-weight: bold } /* Keyword.Pseudo */
|
||||
.kr { font-weight: bold } /* Keyword.Reserved */
|
||||
.kt { color: #445588; font-weight: bold } /* Keyword.Type */
|
||||
.m { color: #009999 } /* Literal.Number */
|
||||
.s { color: #bb8844 } /* Literal.String */
|
||||
.na { color: #008080 } /* Name.Attribute */
|
||||
.nb { color: #999999 } /* Name.Builtin */
|
||||
.nc { color: #445588; font-weight: bold } /* Name.Class */
|
||||
.no { color: #ff99ff } /* Name.Constant */
|
||||
.ni { color: #800080 } /* Name.Entity */
|
||||
.ne { color: #990000; font-weight: bold } /* Name.Exception */
|
||||
.nf { color: #990000; font-weight: bold } /* Name.Function */
|
||||
.nn { color: #555555 } /* Name.Namespace */
|
||||
.nt { color: #000080 } /* Name.Tag */
|
||||
.nv { color: purple } /* Name.Variable */
|
||||
.ow { font-weight: bold } /* Operator.Word */
|
||||
.mf { color: #009999 } /* Literal.Number.Float */
|
||||
.mh { color: #009999 } /* Literal.Number.Hex */
|
||||
.mi { color: #009999 } /* Literal.Number.Integer */
|
||||
.mo { color: #009999 } /* Literal.Number.Oct */
|
||||
.sb { color: #bb8844 } /* Literal.String.Backtick */
|
||||
.sc { color: #bb8844 } /* Literal.String.Char */
|
||||
.sd { color: #bb8844 } /* Literal.String.Doc */
|
||||
.s2 { color: #bb8844 } /* Literal.String.Double */
|
||||
.se { color: #bb8844 } /* Literal.String.Escape */
|
||||
.sh { color: #bb8844 } /* Literal.String.Heredoc */
|
||||
.si { color: #bb8844 } /* Literal.String.Interpol */
|
||||
.sx { color: #bb8844 } /* Literal.String.Other */
|
||||
.sr { color: #808000 } /* Literal.String.Regex */
|
||||
.s1 { color: #bb8844 } /* Literal.String.Single */
|
||||
.ss { color: #bb8844 } /* Literal.String.Symbol */
|
||||
.bp { color: #999999 } /* Name.Builtin.Pseudo */
|
||||
.vc { color: #ff99ff } /* Name.Variable.Class */
|
||||
.vg { color: #ff99ff } /* Name.Variable.Global */
|
||||
.vi { color: #ff99ff } /* Name.Variable.Instance */
|
||||
.il { color: #009999 } /* Literal.Number.Integer.Long */
|
||||
@@ -1,4 +0,0 @@
|
||||
[theme]
|
||||
inherit = basic
|
||||
stylesheet = nature.css
|
||||
pygments_style = tango
|
||||
@@ -1,136 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Paste documentation build configuration file, created by
|
||||
# sphinx-quickstart on Tue Apr 22 22:08:49 2008.
|
||||
#
|
||||
# This file is execfile()d with the current directory set to its containing dir.
|
||||
#
|
||||
# The contents of this file are pickled, so don't put values in the namespace
|
||||
# that aren't pickleable (module imports are okay, they're removed automatically).
|
||||
#
|
||||
# All configuration values have a default value; values that are commented out
|
||||
# serve to show the default value.
|
||||
|
||||
import sys
|
||||
|
||||
# If your extensions are in another directory, add it here.
|
||||
#sys.path.append('some/directory')
|
||||
|
||||
# General configuration
|
||||
# ---------------------
|
||||
|
||||
# Add any Sphinx extension module names here, as strings. They can be extensions
|
||||
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
||||
extensions = ['sphinx.ext.autodoc']
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
## FIXME: disabled for now because I haven't figured out how to use this:
|
||||
#templates_path = ['_templates']
|
||||
|
||||
# The suffix of source filenames.
|
||||
source_suffix = '.txt'
|
||||
|
||||
# The master toctree document.
|
||||
master_doc = 'index'
|
||||
|
||||
# General substitutions.
|
||||
project = 'virtualenv'
|
||||
copyright = '2007-2011, Ian Bicking, The Open Planning Project, The virtualenv developers'
|
||||
|
||||
# The default replacements for |version| and |release|, also used in various
|
||||
# other places throughout the built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
|
||||
release = "1.7"
|
||||
version = ".".join(release.split(".")[:2])
|
||||
|
||||
# There are two options for replacing |today|: either, you set today to some
|
||||
# non-false value, then it is used:
|
||||
#today = ''
|
||||
# Else, today_fmt is used as the format for a strftime call.
|
||||
today_fmt = '%B %d, %Y'
|
||||
|
||||
# List of documents that shouldn't be included in the build.
|
||||
unused_docs = []
|
||||
|
||||
# If true, '()' will be appended to :func: etc. cross-reference text.
|
||||
#add_function_parentheses = True
|
||||
|
||||
# If true, the current module name will be prepended to all description
|
||||
# unit titles (such as .. function::).
|
||||
#add_module_names = True
|
||||
|
||||
# If true, sectionauthor and moduleauthor directives will be shown in the
|
||||
# output. They are ignored by default.
|
||||
#show_authors = False
|
||||
|
||||
# The name of the Pygments (syntax highlighting) style to use.
|
||||
pygments_style = 'sphinx'
|
||||
|
||||
|
||||
# Options for HTML output
|
||||
# -----------------------
|
||||
|
||||
# The style sheet to use for HTML and HTML Help pages. A file of that name
|
||||
# must exist either in Sphinx' static/ path, or in one of the custom paths
|
||||
# given in html_static_path.
|
||||
#html_style = 'default.css'
|
||||
|
||||
html_theme = 'nature'
|
||||
html_theme_path = ['_theme']
|
||||
|
||||
# Add any paths that contain custom static files (such as style sheets) here,
|
||||
# relative to this directory. They are copied after the builtin static files,
|
||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||
html_static_path = ['_static']
|
||||
|
||||
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
||||
# using the given strftime format.
|
||||
html_last_updated_fmt = '%b %d, %Y'
|
||||
|
||||
# If true, SmartyPants will be used to convert quotes and dashes to
|
||||
# typographically correct entities.
|
||||
#html_use_smartypants = True
|
||||
|
||||
# Content template for the index page.
|
||||
#html_index = ''
|
||||
|
||||
# Custom sidebar templates, maps document names to template names.
|
||||
#html_sidebars = {}
|
||||
|
||||
# Additional templates that should be rendered to pages, maps page names to
|
||||
# template names.
|
||||
#html_additional_pages = {}
|
||||
|
||||
# If false, no module index is generated.
|
||||
#html_use_modindex = True
|
||||
|
||||
# If true, the reST sources are included in the HTML build as _sources/<name>.
|
||||
#html_copy_source = True
|
||||
|
||||
# Output file base name for HTML help builder.
|
||||
htmlhelp_basename = 'Pastedoc'
|
||||
|
||||
|
||||
# Options for LaTeX output
|
||||
# ------------------------
|
||||
|
||||
# The paper size ('letter' or 'a4').
|
||||
#latex_paper_size = 'letter'
|
||||
|
||||
# The font size ('10pt', '11pt' or '12pt').
|
||||
#latex_font_size = '10pt'
|
||||
|
||||
# Grouping the document tree into LaTeX files. List of tuples
|
||||
# (source start file, target name, title, author, document class [howto/manual]).
|
||||
#latex_documents = []
|
||||
|
||||
# Additional stuff for the LaTeX preamble.
|
||||
#latex_preamble = ''
|
||||
|
||||
# Documents to append as an appendix to all manuals.
|
||||
#latex_appendices = []
|
||||
|
||||
# If false, no module index is generated.
|
||||
#latex_use_modindex = True
|
||||
@@ -1,487 +0,0 @@
|
||||
virtualenv
|
||||
==========
|
||||
|
||||
* `Discussion list <http://groups.google.com/group/python-virtualenv/>`_
|
||||
* `Bugs <https://github.com/pypa/virtualenv/issues/>`_
|
||||
|
||||
.. contents::
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
news
|
||||
|
||||
.. comment: split here
|
||||
|
||||
Status and License
|
||||
------------------
|
||||
|
||||
``virtualenv`` is a successor to `workingenv
|
||||
<http://cheeseshop.python.org/pypi/workingenv.py>`_, and an extension
|
||||
of `virtual-python
|
||||
<http://peak.telecommunity.com/DevCenter/EasyInstall#creating-a-virtual-python>`_.
|
||||
|
||||
It was written by Ian Bicking, sponsored by the `Open Planning
|
||||
Project <http://openplans.org>`_ and is now maintained by a
|
||||
`group of developers <https://github.com/pypa/virtualenv/raw/master/AUTHORS.txt>`_.
|
||||
It is licensed under an
|
||||
`MIT-style permissive license <https://github.com/pypa/virtualenv/raw/master/LICENSE.txt>`_.
|
||||
|
||||
You can install it with ``pip install virtualenv``, or the `latest
|
||||
development version <https://github.com/pypa/virtualenv/tarball/develop#egg=virtualenv-dev>`_
|
||||
with ``pip install virtualenv==dev``.
|
||||
|
||||
You can also use ``easy_install``, or if you have no Python package manager
|
||||
available at all, you can just grab the single file `virtualenv.py`_ and run
|
||||
it with ``python virtualenv.py``.
|
||||
|
||||
.. _virtualenv.py: https://raw.github.com/pypa/virtualenv/master/virtualenv.py
|
||||
|
||||
|
||||
What It Does
|
||||
------------
|
||||
|
||||
``virtualenv`` is a tool to create isolated Python environments.
|
||||
|
||||
The basic problem being addressed is one of dependencies and versions,
|
||||
and indirectly permissions. Imagine you have an application that
|
||||
needs version 1 of LibFoo, but another application requires version
|
||||
2. How can you use both these applications? If you install
|
||||
everything into ``/usr/lib/python2.7/site-packages`` (or whatever your
|
||||
platform's standard location is), it's easy to end up in a situation
|
||||
where you unintentionally upgrade an application that shouldn't be
|
||||
upgraded.
|
||||
|
||||
Or more generally, what if you want to install an application *and
|
||||
leave it be*? If an application works, any change in its libraries or
|
||||
the versions of those libraries can break the application.
|
||||
|
||||
Also, what if you can't install packages into the global
|
||||
``site-packages`` directory? For instance, on a shared host.
|
||||
|
||||
In all these cases, ``virtualenv`` can help you. It creates an
|
||||
environment that has its own installation directories, that doesn't
|
||||
share libraries with other virtualenv environments (and optionally
|
||||
doesn't access the globally installed libraries either).
|
||||
|
||||
The basic usage is::
|
||||
|
||||
$ python virtualenv.py ENV
|
||||
|
||||
If you install it you can also just do ``virtualenv ENV``.
|
||||
|
||||
This creates ``ENV/lib/pythonX.X/site-packages``, where any libraries you
|
||||
install will go. It also creates ``ENV/bin/python``, which is a Python
|
||||
interpreter that uses this environment. Anytime you use that interpreter
|
||||
(including when a script has ``#!/path/to/ENV/bin/python`` in it) the libraries
|
||||
in that environment will be used.
|
||||
|
||||
It also installs either `Setuptools
|
||||
<http://peak.telecommunity.com/DevCenter/setuptools>`_ or `distribute
|
||||
<http://pypi.python.org/pypi/distribute>`_ into the environment. To use
|
||||
Distribute instead of setuptools, just call virtualenv like this::
|
||||
|
||||
$ python virtualenv.py --distribute ENV
|
||||
|
||||
You can also set the environment variable VIRTUALENV_USE_DISTRIBUTE.
|
||||
|
||||
A new virtualenv also includes the `pip <http://pypy.python.org/pypi/pip>`_
|
||||
installer, so you can use ``ENV/bin/pip`` to install additional packages into
|
||||
the environment.
|
||||
|
||||
Environment variables and configuration files
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
virtualenv can not only be configured by passing command line options such as
|
||||
``--distribute`` but also by two other means:
|
||||
|
||||
- Environment variables
|
||||
|
||||
Each command line option is automatically used to look for environment
|
||||
variables with the name format ``VIRTUALENV_<UPPER_NAME>``. That means
|
||||
the name of the command line options are capitalized and have dashes
|
||||
(``'-'``) replaced with underscores (``'_'``).
|
||||
|
||||
For example, to automatically install Distribute instead of setuptools
|
||||
you can also set an environment variable::
|
||||
|
||||
$ export VIRTUALENV_USE_DISTRIBUTE=true
|
||||
$ python virtualenv.py ENV
|
||||
|
||||
It's the same as passing the option to virtualenv directly::
|
||||
|
||||
$ python virtualenv.py --distribute ENV
|
||||
|
||||
This also works for appending command line options, like ``--find-links``.
|
||||
Just leave an empty space between the passsed values, e.g.::
|
||||
|
||||
$ export VIRTUALENV_EXTRA_SEARCH_DIR="/path/to/dists /path/to/other/dists"
|
||||
$ virtualenv ENV
|
||||
|
||||
is the same as calling::
|
||||
|
||||
$ python virtualenv.py --extra-search-dir=/path/to/dists --extra-search-dir=/path/to/other/dists ENV
|
||||
|
||||
- Config files
|
||||
|
||||
virtualenv also looks for a standard ini config file. On Unix and Mac OS X
|
||||
that's ``$HOME/.virtualenv/virtualenv.ini`` and on Windows, it's
|
||||
``%HOME%\\virtualenv\\virtualenv.ini``.
|
||||
|
||||
The names of the settings are derived from the long command line option,
|
||||
e.g. the option ``--distribute`` would look like this::
|
||||
|
||||
[virtualenv]
|
||||
distribute = true
|
||||
|
||||
Appending options like ``--extra-search-dir`` can be written on multiple
|
||||
lines::
|
||||
|
||||
[virtualenv]
|
||||
extra-search-dir =
|
||||
/path/to/dists
|
||||
/path/to/other/dists
|
||||
|
||||
Please have a look at the output of ``virtualenv --help`` for a full list
|
||||
of supported options.
|
||||
|
||||
Windows Notes
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
Some paths within the virtualenv are slightly different on Windows: scripts and
|
||||
executables on Windows go in ``ENV\Scripts\`` instead of ``ENV/bin/`` and
|
||||
libraries go in ``ENV\Lib\`` rather than ``ENV/lib/``.
|
||||
|
||||
To create a virtualenv under a path with spaces in it on Windows, you'll need
|
||||
the `win32api <http://sourceforge.net/projects/pywin32/>`_ library installed.
|
||||
|
||||
PyPy Support
|
||||
~~~~~~~~~~~~
|
||||
|
||||
Beginning with virtualenv version 1.5 `PyPy <http://pypy.org>`_ is
|
||||
supported. To use PyPy 1.4 or 1.4.1, you need a version of virtualenv >= 1.5.
|
||||
To use PyPy 1.5, you need a version of virtualenv >= 1.6.1.
|
||||
|
||||
Creating Your Own Bootstrap Scripts
|
||||
-----------------------------------
|
||||
|
||||
While this creates an environment, it doesn't put anything into the
|
||||
environment. Developers may find it useful to distribute a script
|
||||
that sets up a particular environment, for example a script that
|
||||
installs a particular web application.
|
||||
|
||||
To create a script like this, call
|
||||
``virtualenv.create_bootstrap_script(extra_text)``, and write the
|
||||
result to your new bootstrapping script. Here's the documentation
|
||||
from the docstring:
|
||||
|
||||
Creates a bootstrap script, which is like this script but with
|
||||
extend_parser, adjust_options, and after_install hooks.
|
||||
|
||||
This returns a string that (written to disk of course) can be used
|
||||
as a bootstrap script with your own customizations. The script
|
||||
will be the standard virtualenv.py script, with your extra text
|
||||
added (your extra text should be Python code).
|
||||
|
||||
If you include these functions, they will be called:
|
||||
|
||||
``extend_parser(optparse_parser)``:
|
||||
You can add or remove options from the parser here.
|
||||
|
||||
``adjust_options(options, args)``:
|
||||
You can change options here, or change the args (if you accept
|
||||
different kinds of arguments, be sure you modify ``args`` so it is
|
||||
only ``[DEST_DIR]``).
|
||||
|
||||
``after_install(options, home_dir)``:
|
||||
|
||||
After everything is installed, this function is called. This
|
||||
is probably the function you are most likely to use. An
|
||||
example would be::
|
||||
|
||||
def after_install(options, home_dir):
|
||||
if sys.platform == 'win32':
|
||||
bin = 'Scripts'
|
||||
else:
|
||||
bin = 'bin'
|
||||
subprocess.call([join(home_dir, bin, 'easy_install'),
|
||||
'MyPackage'])
|
||||
subprocess.call([join(home_dir, bin, 'my-package-script'),
|
||||
'setup', home_dir])
|
||||
|
||||
This example immediately installs a package, and runs a setup
|
||||
script from that package.
|
||||
|
||||
Bootstrap Example
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
Here's a more concrete example of how you could use this::
|
||||
|
||||
import virtualenv, textwrap
|
||||
output = virtualenv.create_bootstrap_script(textwrap.dedent("""
|
||||
import os, subprocess
|
||||
def after_install(options, home_dir):
|
||||
etc = join(home_dir, 'etc')
|
||||
if not os.path.exists(etc):
|
||||
os.makedirs(etc)
|
||||
subprocess.call([join(home_dir, 'bin', 'easy_install'),
|
||||
'BlogApplication'])
|
||||
subprocess.call([join(home_dir, 'bin', 'paster'),
|
||||
'make-config', 'BlogApplication',
|
||||
join(etc, 'blog.ini')])
|
||||
subprocess.call([join(home_dir, 'bin', 'paster'),
|
||||
'setup-app', join(etc, 'blog.ini')])
|
||||
"""))
|
||||
f = open('blog-bootstrap.py', 'w').write(output)
|
||||
|
||||
Another example is available `here
|
||||
<https://github.com/socialplanning/fassembler/blob/master/fassembler/create-venv-script.py>`_.
|
||||
|
||||
activate script
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
In a newly created virtualenv there will be a ``bin/activate`` shell
|
||||
script, or a ``Scripts/activate.bat`` batch file on Windows.
|
||||
|
||||
On Posix systems you can do::
|
||||
|
||||
$ source bin/activate
|
||||
|
||||
This will change your ``$PATH`` to point to the virtualenv's ``bin/``
|
||||
directory. (You have to use ``source`` because it changes your shell
|
||||
environment in-place.) This is all it does; it's purely a convenience. If
|
||||
you directly run a script or the python interpreter from the virtualenv's
|
||||
``bin/`` directory (e.g. ``path/to/env/bin/pip`` or
|
||||
``/path/to/env/bin/python script.py``) there's no need for activation.
|
||||
|
||||
After activating an environment you can use the function ``deactivate`` to
|
||||
undo the changes to your ``$PATH``.
|
||||
|
||||
The ``activate`` script will also modify your shell prompt to indicate
|
||||
which environment is currently active. You can disable this behavior,
|
||||
which can be useful if you have your own custom prompt that already
|
||||
displays the active environment name. To do so, set the
|
||||
``VIRTUAL_ENV_DISABLE_PROMPT`` environment variable to any non-empty
|
||||
value before running the ``activate`` script.
|
||||
|
||||
On Windows you just do::
|
||||
|
||||
> \path\to\env\Scripts\activate.bat
|
||||
|
||||
And use ``deactivate.bat`` to undo the changes.
|
||||
|
||||
The ``--system-site-packages`` Option
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
If you build with ``virtualenv --system-site-packages ENV``, your virtual
|
||||
environment will inherit packages from ``/usr/lib/python2.7/site-packages``
|
||||
(or wherever your global site-packages directory is).
|
||||
|
||||
This can be used if you have control over the global site-packages directory,
|
||||
and you want to depend on the packages there. If you want isolation from the
|
||||
global system, do not use this flag.
|
||||
|
||||
Using Virtualenv without ``bin/python``
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Sometimes you can't or don't want to use the Python interpreter
|
||||
created by the virtualenv. For instance, in a `mod_python
|
||||
<http://www.modpython.org/>`_ or `mod_wsgi <http://www.modwsgi.org/>`_
|
||||
environment, there is only one interpreter.
|
||||
|
||||
Luckily, it's easy. You must use the custom Python interpreter to
|
||||
*install* libraries. But to *use* libraries, you just have to be sure
|
||||
the path is correct. A script is available to correct the path. You
|
||||
can setup the environment like::
|
||||
|
||||
activate_this = '/path/to/env/bin/activate_this.py'
|
||||
execfile(activate_this, dict(__file__=activate_this))
|
||||
|
||||
This will change ``sys.path`` and even change ``sys.prefix``, but also allow
|
||||
you to use an existing interpreter. Items in your environment will show up
|
||||
first on ``sys.path``, before global items. However, global items will
|
||||
always be accessible (as if the ``--system-site-packages`` flag had been used
|
||||
in creating the environment, whether it was or not). Also, this cannot undo
|
||||
the activation of other environments, or modules that have been imported.
|
||||
You shouldn't try to, for instance, activate an environment before a web
|
||||
request; you should activate *one* environment as early as possible, and not
|
||||
do it again in that process.
|
||||
|
||||
Making Environments Relocatable
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Note: this option is somewhat experimental, and there are probably
|
||||
caveats that have not yet been identified. Also this does not
|
||||
currently work on Windows.
|
||||
|
||||
Normally environments are tied to a specific path. That means that
|
||||
you cannot move an environment around or copy it to another computer.
|
||||
You can fix up an environment to make it relocatable with the
|
||||
command::
|
||||
|
||||
$ virtualenv --relocatable ENV
|
||||
|
||||
This will make some of the files created by setuptools or distribute
|
||||
use relative paths, and will change all the scripts to use ``activate_this.py``
|
||||
instead of using the location of the Python interpreter to select the
|
||||
environment.
|
||||
|
||||
**Note:** you must run this after you've installed *any* packages into
|
||||
the environment. If you make an environment relocatable, then
|
||||
install a new package, you must run ``virtualenv --relocatable``
|
||||
again.
|
||||
|
||||
Also, this **does not make your packages cross-platform**. You can
|
||||
move the directory around, but it can only be used on other similar
|
||||
computers. Some known environmental differences that can cause
|
||||
incompatibilities: a different version of Python, when one platform
|
||||
uses UCS2 for its internal unicode representation and another uses
|
||||
UCS4 (a compile-time option), obvious platform changes like Windows
|
||||
vs. Linux, or Intel vs. ARM, and if you have libraries that bind to C
|
||||
libraries on the system, if those C libraries are located somewhere
|
||||
different (either different versions, or a different filesystem
|
||||
layout).
|
||||
|
||||
If you use this flag to create an environment, currently, the
|
||||
``--system-site-packages`` option will be implied.
|
||||
|
||||
The ``--extra-search-dir`` Option
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
When it creates a new environment, virtualenv installs either
|
||||
setuptools or distribute, and pip. In normal operation, the latest
|
||||
releases of these packages are fetched from the `Python Package Index
|
||||
<http://pypi.python.org>`_ (PyPI). In some circumstances, this
|
||||
behavior may not be wanted, for example if you are using virtualenv
|
||||
during a deployment and do not want to depend on Internet access and
|
||||
PyPI availability.
|
||||
|
||||
As an alternative, you can provide your own versions of setuptools,
|
||||
distribute and/or pip on the filesystem, and tell virtualenv to use
|
||||
those distributions instead of downloading them from the Internet. To
|
||||
use this feature, pass one or more ``--extra-search-dir`` options to
|
||||
virtualenv like this::
|
||||
|
||||
$ virtualenv --extra-search-dir=/path/to/distributions ENV
|
||||
|
||||
The ``/path/to/distributions`` path should point to a directory that
|
||||
contains setuptools, distribute and/or pip distributions. Setuptools
|
||||
distributions must be ``.egg`` files; distribute and pip distributions
|
||||
should be `.tar.gz` source distributions.
|
||||
|
||||
Virtualenv will still download these packages if no satisfactory local
|
||||
distributions are found.
|
||||
|
||||
If you are really concerned about virtualenv fetching these packages
|
||||
from the Internet and want to ensure that it never will, you can also
|
||||
provide an option ``--never-download`` like so::
|
||||
|
||||
$ virtualenv --extra-search-dir=/path/to/distributions --never-download ENV
|
||||
|
||||
If this option is provided, virtualenv will never try to download
|
||||
setuptools/distribute or pip. Instead, it will exit with status code 1
|
||||
if it fails to find local distributions for any of these required
|
||||
packages.
|
||||
|
||||
Compare & Contrast with Alternatives
|
||||
------------------------------------
|
||||
|
||||
There are several alternatives that create isolated environments:
|
||||
|
||||
* ``workingenv`` (which I do not suggest you use anymore) is the
|
||||
predecessor to this library. It used the main Python interpreter,
|
||||
but relied on setting ``$PYTHONPATH`` to activate the environment.
|
||||
This causes problems when running Python scripts that aren't part of
|
||||
the environment (e.g., a globally installed ``hg`` or ``bzr``). It
|
||||
also conflicted a lot with Setuptools.
|
||||
|
||||
* `virtual-python
|
||||
<http://peak.telecommunity.com/DevCenter/EasyInstall#creating-a-virtual-python>`_
|
||||
is also a predecessor to this library. It uses only symlinks, so it
|
||||
couldn't work on Windows. It also symlinks over the *entire*
|
||||
standard library and global ``site-packages``. As a result, it
|
||||
won't see new additions to the global ``site-packages``.
|
||||
|
||||
This script only symlinks a small portion of the standard library
|
||||
into the environment, and so on Windows it is feasible to simply
|
||||
copy these files over. Also, it creates a new/empty
|
||||
``site-packages`` and also adds the global ``site-packages`` to the
|
||||
path, so updates are tracked separately. This script also installs
|
||||
Setuptools automatically, saving a step and avoiding the need for
|
||||
network access.
|
||||
|
||||
* `zc.buildout <http://pypi.python.org/pypi/zc.buildout>`_ doesn't
|
||||
create an isolated Python environment in the same style, but
|
||||
achieves similar results through a declarative config file that sets
|
||||
up scripts with very particular packages. As a declarative system,
|
||||
it is somewhat easier to repeat and manage, but more difficult to
|
||||
experiment with. ``zc.buildout`` includes the ability to setup
|
||||
non-Python systems (e.g., a database server or an Apache instance).
|
||||
|
||||
I *strongly* recommend anyone doing application development or
|
||||
deployment use one of these tools.
|
||||
|
||||
Contributing
|
||||
------------
|
||||
|
||||
Refer to the `contributing to pip`_ documentation - it applies equally to
|
||||
virtualenv.
|
||||
|
||||
Virtualenv's release schedule is tied to pip's -- each time there's a new pip
|
||||
release, there will be a new virtualenv release that bundles the new version of
|
||||
pip.
|
||||
|
||||
.. _contributing to pip: http://www.pip-installer.org/en/latest/how-to-contribute.html
|
||||
|
||||
Running the tests
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
Virtualenv's test suite is small and not yet at all comprehensive, but we aim
|
||||
to grow it.
|
||||
|
||||
The easy way to run tests (handles test dependencies automatically)::
|
||||
|
||||
$ python setup.py test
|
||||
|
||||
If you want to run only a selection of the tests, you'll need to run them
|
||||
directly with nose instead. Create a virtualenv, and install required
|
||||
packages::
|
||||
|
||||
$ pip install nose mock
|
||||
|
||||
Run nosetests::
|
||||
|
||||
$ nosetests
|
||||
|
||||
Or select just a single test file to run::
|
||||
|
||||
$ nosetests tests.test_virtualenv
|
||||
|
||||
|
||||
Other Documentation and Links
|
||||
-----------------------------
|
||||
|
||||
* James Gardner has written a tutorial on using `virtualenv with
|
||||
Pylons
|
||||
<http://wiki.pylonshq.com/display/pylonscookbook/Using+a+Virtualenv+Sandbox>`_.
|
||||
|
||||
* `Blog announcement
|
||||
<http://blog.ianbicking.org/2007/10/10/workingenv-is-dead-long-live-virtualenv/>`_.
|
||||
|
||||
* Doug Hellmann wrote a description of his `command-line work flow
|
||||
using virtualenv (virtualenvwrapper)
|
||||
<http://www.doughellmann.com/articles/CompletelyDifferent-2008-05-virtualenvwrapper/index.html>`_
|
||||
including some handy scripts to make working with multiple
|
||||
environments easier. He also wrote `an example of using virtualenv
|
||||
to try IPython
|
||||
<http://www.doughellmann.com/articles/CompletelyDifferent-2008-02-ipython-and-virtualenv/index.html>`_.
|
||||
|
||||
* Chris Perkins created a `showmedo video including virtualenv
|
||||
<http://showmedo.com/videos/video?name=2910000&fromSeriesID=291>`_.
|
||||
|
||||
* `Using virtualenv with mod_wsgi
|
||||
<http://code.google.com/p/modwsgi/wiki/VirtualEnvironments>`_.
|
||||
|
||||
* `virtualenv commands
|
||||
<http://thisismedium.com/tech/extending-virtualenv/>`_ for some more
|
||||
workflow-related tools around virtualenv.
|
||||
@@ -1,170 +0,0 @@
|
||||
@ECHO OFF
|
||||
|
||||
REM Command file for Sphinx documentation
|
||||
|
||||
if "%SPHINXBUILD%" == "" (
|
||||
set SPHINXBUILD=sphinx-build
|
||||
)
|
||||
set BUILDDIR=_build
|
||||
set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
|
||||
if NOT "%PAPER%" == "" (
|
||||
set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
|
||||
)
|
||||
|
||||
if "%1" == "" goto help
|
||||
|
||||
if "%1" == "help" (
|
||||
:help
|
||||
echo.Please use `make ^<target^>` where ^<target^> is one of
|
||||
echo. html to make standalone HTML files
|
||||
echo. dirhtml to make HTML files named index.html in directories
|
||||
echo. singlehtml to make a single large HTML file
|
||||
echo. pickle to make pickle files
|
||||
echo. json to make JSON files
|
||||
echo. htmlhelp to make HTML files and a HTML help project
|
||||
echo. qthelp to make HTML files and a qthelp project
|
||||
echo. devhelp to make HTML files and a Devhelp project
|
||||
echo. epub to make an epub
|
||||
echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
|
||||
echo. text to make text files
|
||||
echo. man to make manual pages
|
||||
echo. changes to make an overview over all changed/added/deprecated items
|
||||
echo. linkcheck to check all external links for integrity
|
||||
echo. doctest to run all doctests embedded in the documentation if enabled
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "clean" (
|
||||
for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
|
||||
del /q /s %BUILDDIR%\*
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "html" (
|
||||
%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The HTML pages are in %BUILDDIR%/html.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "dirhtml" (
|
||||
%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "singlehtml" (
|
||||
%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "pickle" (
|
||||
%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; now you can process the pickle files.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "json" (
|
||||
%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; now you can process the JSON files.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "htmlhelp" (
|
||||
%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; now you can run HTML Help Workshop with the ^
|
||||
.hhp project file in %BUILDDIR%/htmlhelp.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "qthelp" (
|
||||
%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; now you can run "qcollectiongenerator" with the ^
|
||||
.qhcp project file in %BUILDDIR%/qthelp, like this:
|
||||
echo.^> qcollectiongenerator %BUILDDIR%\qthelp\django-compressor.qhcp
|
||||
echo.To view the help file:
|
||||
echo.^> assistant -collectionFile %BUILDDIR%\qthelp\django-compressor.ghc
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "devhelp" (
|
||||
%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "epub" (
|
||||
%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The epub file is in %BUILDDIR%/epub.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "latex" (
|
||||
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "text" (
|
||||
%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The text files are in %BUILDDIR%/text.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "man" (
|
||||
%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The manual pages are in %BUILDDIR%/man.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "changes" (
|
||||
%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.The overview file is in %BUILDDIR%/changes.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "linkcheck" (
|
||||
%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Link check complete; look for any errors in the above output ^
|
||||
or in %BUILDDIR%/linkcheck/output.txt.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "doctest" (
|
||||
%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Testing of doctests in the sources finished, look at the ^
|
||||
results in %BUILDDIR%/doctest/output.txt.
|
||||
goto end
|
||||
)
|
||||
|
||||
:end
|
||||
@@ -1,409 +0,0 @@
|
||||
Changes & News
|
||||
--------------
|
||||
|
||||
1.7 (2011-11-30)
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
* Updated embedded Distribute release to 0.6.24. Thanks Alex Grönholm.
|
||||
|
||||
* Made ``--no-site-packages`` behavior the default behavior. The
|
||||
``--no-site-packages`` flag is still permitted, but displays a warning when
|
||||
used. Thanks Chris McDonough.
|
||||
|
||||
* New flag: ``--system-site-packages``; this flag should be passed to get the
|
||||
previous default global-site-package-including behavior back.
|
||||
|
||||
* Added ability to set command options as environment variables and options
|
||||
in a ``virtualenv.ini`` file.
|
||||
|
||||
* Fixed various encoding related issues with paths. Thanks Gunnlaugur Thor Briem.
|
||||
|
||||
* Made ``virtualenv.py`` script executable.
|
||||
|
||||
1.6.4 (2011-07-21)
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Restored ability to run on Python 2.4, too.
|
||||
|
||||
1.6.3 (2011-07-16)
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Restored ability to run on Python < 2.7.
|
||||
|
||||
1.6.2 (2011-07-16)
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Updated embedded distribute release to 0.6.19.
|
||||
|
||||
* Updated embedded pip release to 1.0.2.
|
||||
|
||||
* Fixed #141 - Be smarter about finding pkg_resources when using the
|
||||
non-default Python intepreter (by using the ``-p`` option).
|
||||
|
||||
* Fixed #112 - Fixed path in docs.
|
||||
|
||||
* Fixed #109 - Corrected doctests of a Logger method.
|
||||
|
||||
* Fixed #118 - Fixed creating virtualenvs on platforms that use the
|
||||
"posix_local" install scheme, such as Ubuntu with Python 2.7.
|
||||
|
||||
* Add missing library to Python 3 virtualenvs (``_dummy_thread``).
|
||||
|
||||
|
||||
1.6.1 (2011-04-30)
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Start to use git-flow.
|
||||
|
||||
* Added support for PyPy 1.5
|
||||
|
||||
* Fixed #121 -- added sanity-checking of the -p argument. Thanks Paul Nasrat.
|
||||
|
||||
* Added progress meter for pip installation as well as setuptools. Thanks Ethan
|
||||
Jucovy.
|
||||
|
||||
* Added --never-download and --search-dir options. Thanks Ethan Jucovy.
|
||||
|
||||
1.6
|
||||
~~~
|
||||
|
||||
* Added Python 3 support! Huge thanks to Vinay Sajip and Vitaly Babiy.
|
||||
|
||||
* Fixed creation of virtualenvs on Mac OS X when standard library modules
|
||||
(readline) are installed outside the standard library.
|
||||
|
||||
* Updated bundled pip to 1.0.
|
||||
|
||||
1.5.2
|
||||
~~~~~
|
||||
|
||||
* Moved main repository to Github: https://github.com/pypa/virtualenv
|
||||
|
||||
* Transferred primary maintenance from Ian to Jannis Leidel, Carl Meyer and Brian Rosner
|
||||
|
||||
* Fixed a few more pypy related bugs.
|
||||
|
||||
* Updated bundled pip to 0.8.2.
|
||||
|
||||
* Handed project over to new team of maintainers.
|
||||
|
||||
* Moved virtualenv to Github at https://github.com/pypa/virtualenv
|
||||
|
||||
1.5.1
|
||||
~~~~~
|
||||
|
||||
* Added ``_weakrefset`` requirement for Python 2.7.1.
|
||||
|
||||
* Fixed Windows regression in 1.5
|
||||
|
||||
1.5
|
||||
~~~
|
||||
|
||||
* Include pip 0.8.1.
|
||||
|
||||
* Add support for PyPy.
|
||||
|
||||
* Uses a proper temporary dir when installing environment requirements.
|
||||
|
||||
* Add ``--prompt`` option to be able to override the default prompt prefix.
|
||||
|
||||
* Fix an issue with ``--relocatable`` on Windows.
|
||||
|
||||
* Fix issue with installing the wrong version of distribute.
|
||||
|
||||
* Add fish and csh activate scripts.
|
||||
|
||||
1.4.9
|
||||
~~~~~
|
||||
|
||||
* Include pip 0.7.2
|
||||
|
||||
1.4.8
|
||||
~~~~~
|
||||
|
||||
* Fix for Mac OS X Framework builds that use
|
||||
``--universal-archs=intel``
|
||||
|
||||
* Fix ``activate_this.py`` on Windows.
|
||||
|
||||
* Allow ``$PYTHONHOME`` to be set, so long as you use ``source
|
||||
bin/activate`` it will get unset; if you leave it set and do not
|
||||
activate the environment it will still break the environment.
|
||||
|
||||
* Include pip 0.7.1
|
||||
|
||||
1.4.7
|
||||
~~~~~
|
||||
|
||||
* Include pip 0.7
|
||||
|
||||
1.4.6
|
||||
~~~~~
|
||||
|
||||
* Allow ``activate.sh`` to skip updating the prompt (by setting
|
||||
``$VIRTUAL_ENV_DISABLE_PROMPT``).
|
||||
|
||||
1.4.5
|
||||
~~~~~
|
||||
|
||||
* Include pip 0.6.3
|
||||
|
||||
* Fix ``activate.bat`` and ``deactivate.bat`` under Windows when
|
||||
``PATH`` contained a parenthesis
|
||||
|
||||
1.4.4
|
||||
~~~~~
|
||||
|
||||
* Include pip 0.6.2 and Distribute 0.6.10
|
||||
|
||||
* Create the ``virtualenv`` script even when Setuptools isn't
|
||||
installed
|
||||
|
||||
* Fix problem with ``virtualenv --relocate`` when ``bin/`` has
|
||||
subdirectories (e.g., ``bin/.svn/``); from Alan Franzoni.
|
||||
|
||||
* If you set ``$VIRTUALENV_USE_DISTRIBUTE`` then virtualenv will use
|
||||
Distribute by default (so you don't have to remember to use
|
||||
``--distribute``).
|
||||
|
||||
1.4.3
|
||||
~~~~~
|
||||
|
||||
* Include pip 0.6.1
|
||||
|
||||
1.4.2
|
||||
~~~~~
|
||||
|
||||
* Fix pip installation on Windows
|
||||
|
||||
* Fix use of stand-alone ``virtualenv.py`` (and boot scripts)
|
||||
|
||||
* Exclude ~/.local (user site-packages) from environments when using
|
||||
``--no-site-packages``
|
||||
|
||||
1.4.1
|
||||
~~~~~
|
||||
|
||||
* Include pip 0.6
|
||||
|
||||
1.4
|
||||
~~~
|
||||
|
||||
* Updated setuptools to 0.6c11
|
||||
|
||||
* Added the --distribute option
|
||||
|
||||
* Fixed packaging problem of support-files
|
||||
|
||||
1.3.4
|
||||
~~~~~
|
||||
|
||||
* Virtualenv now copies the actual embedded Python binary on
|
||||
Mac OS X to fix a hang on Snow Leopard (10.6).
|
||||
|
||||
* Fail more gracefully on Windows when ``win32api`` is not installed.
|
||||
|
||||
* Fix site-packages taking precedent over Jython's ``__classpath__``
|
||||
and also specially handle the new ``__pyclasspath__`` entry in
|
||||
``sys.path``.
|
||||
|
||||
* Now copies Jython's ``registry`` file to the virtualenv if it exists.
|
||||
|
||||
* Better find libraries when compiling extensions on Windows.
|
||||
|
||||
* Create ``Scripts\pythonw.exe`` on Windows.
|
||||
|
||||
* Added support for the Debian/Ubuntu
|
||||
``/usr/lib/pythonX.Y/dist-packages`` directory.
|
||||
|
||||
* Set ``distutils.sysconfig.get_config_vars()['LIBDIR']`` (based on
|
||||
``sys.real_prefix``) which is reported to help building on Windows.
|
||||
|
||||
* Make ``deactivate`` work on ksh
|
||||
|
||||
* Fixes for ``--python``: make it work with ``--relocatable`` and the
|
||||
symlink created to the exact Python version.
|
||||
|
||||
1.3.3
|
||||
~~~~~
|
||||
|
||||
* Use Windows newlines in ``activate.bat``, which has been reported to help
|
||||
when using non-ASCII directory names.
|
||||
|
||||
* Fixed compatibility with Jython 2.5b1.
|
||||
|
||||
* Added a function ``virtualenv.install_python`` for more fine-grained
|
||||
access to what ``virtualenv.create_environment`` does.
|
||||
|
||||
* Fix `a problem <https://bugs.launchpad.net/virtualenv/+bug/241581>`_
|
||||
with Windows and paths that contain spaces.
|
||||
|
||||
* If ``/path/to/env/.pydistutils.cfg`` exists (or
|
||||
``/path/to/env/pydistutils.cfg`` on Windows systems) then ignore
|
||||
``~/.pydistutils.cfg`` and use that other file instead.
|
||||
|
||||
* Fix ` a problem
|
||||
<https://bugs.launchpad.net/virtualenv/+bug/340050>`_ picking up
|
||||
some ``.so`` libraries in ``/usr/local``.
|
||||
|
||||
1.3.2
|
||||
~~~~~
|
||||
|
||||
* Remove the ``[install] prefix = ...`` setting from the virtualenv
|
||||
``distutils.cfg`` -- this has been causing problems for a lot of
|
||||
people, in rather obscure ways.
|
||||
|
||||
* If you use a `boot script <./index.html#boot-script>`_ it will attempt to import ``virtualenv``
|
||||
and find a pre-downloaded Setuptools egg using that.
|
||||
|
||||
* Added platform-specific paths, like ``/usr/lib/pythonX.Y/plat-linux2``
|
||||
|
||||
1.3.1
|
||||
~~~~~
|
||||
|
||||
* Real Python 2.6 compatibility. Backported the Python 2.6 updates to
|
||||
``site.py``, including `user directories
|
||||
<http://docs.python.org/dev/whatsnew/2.6.html#pep-370-per-user-site-packages-directory>`_
|
||||
(this means older versions of Python will support user directories,
|
||||
whether intended or not).
|
||||
|
||||
* Always set ``[install] prefix`` in ``distutils.cfg`` -- previously
|
||||
on some platforms where a system-wide ``distutils.cfg`` was present
|
||||
with a ``prefix`` setting, packages would be installed globally
|
||||
(usually in ``/usr/local/lib/pythonX.Y/site-packages``).
|
||||
|
||||
* Sometimes Cygwin seems to leave ``.exe`` off ``sys.executable``; a
|
||||
workaround is added.
|
||||
|
||||
* Fix ``--python`` option.
|
||||
|
||||
* Fixed handling of Jython environments that use a
|
||||
jython-complete.jar.
|
||||
|
||||
1.3
|
||||
~~~
|
||||
|
||||
* Update to Setuptools 0.6c9
|
||||
* Added an option ``virtualenv --relocatable EXISTING_ENV``, which
|
||||
will make an existing environment "relocatable" -- the paths will
|
||||
not be absolute in scripts, ``.egg-info`` and ``.pth`` files. This
|
||||
may assist in building environments that can be moved and copied.
|
||||
You have to run this *after* any new packages installed.
|
||||
* Added ``bin/activate_this.py``, a file you can use like
|
||||
``execfile("path_to/activate_this.py",
|
||||
dict(__file__="path_to/activate_this.py"))`` -- this will activate
|
||||
the environment in place, similar to what `the mod_wsgi example
|
||||
does <http://code.google.com/p/modwsgi/wiki/VirtualEnvironments>`_.
|
||||
* For Mac framework builds of Python, the site-packages directory
|
||||
``/Library/Python/X.Y/site-packages`` is added to ``sys.path``, from
|
||||
Andrea Rech.
|
||||
* Some platform-specific modules in Macs are added to the path now
|
||||
(``plat-darwin/``, ``plat-mac/``, ``plat-mac/lib-scriptpackages``),
|
||||
from Andrea Rech.
|
||||
* Fixed a small Bashism in the ``bin/activate`` shell script.
|
||||
* Added ``__future__`` to the list of required modules, for Python
|
||||
2.3. You'll still need to backport your own ``subprocess`` module.
|
||||
* Fixed the ``__classpath__`` entry in Jython's ``sys.path`` taking
|
||||
precedent over virtualenv's libs.
|
||||
|
||||
1.2
|
||||
~~~
|
||||
|
||||
* Added a ``--python`` option to select the Python interpreter.
|
||||
* Add ``warnings`` to the modules copied over, for Python 2.6 support.
|
||||
* Add ``sets`` to the module copied over for Python 2.3 (though Python
|
||||
2.3 still probably doesn't work).
|
||||
|
||||
1.1.1
|
||||
~~~~~
|
||||
|
||||
* Added support for Jython 2.5.
|
||||
|
||||
1.1
|
||||
~~~
|
||||
|
||||
* Added support for Python 2.6.
|
||||
* Fix a problem with missing ``DLLs/zlib.pyd`` on Windows. Create
|
||||
* ``bin/python`` (or ``bin/python.exe``) even when you run virtualenv
|
||||
with an interpreter named, e.g., ``python2.4``
|
||||
* Fix MacPorts Python
|
||||
* Added --unzip-setuptools option
|
||||
* Update to Setuptools 0.6c8
|
||||
* If the current directory is not writable, run ez_setup.py in ``/tmp``
|
||||
* Copy or symlink over the ``include`` directory so that packages will
|
||||
more consistently compile.
|
||||
|
||||
1.0
|
||||
~~~
|
||||
|
||||
* Fix build on systems that use ``/usr/lib64``, distinct from
|
||||
``/usr/lib`` (specifically CentOS x64).
|
||||
* Fixed bug in ``--clear``.
|
||||
* Fixed typos in ``deactivate.bat``.
|
||||
* Preserve ``$PYTHONPATH`` when calling subprocesses.
|
||||
|
||||
0.9.2
|
||||
~~~~~
|
||||
|
||||
* Fix include dir copying on Windows (makes compiling possible).
|
||||
* Include the main ``lib-tk`` in the path.
|
||||
* Patch ``distutils.sysconfig``: ``get_python_inc`` and
|
||||
``get_python_lib`` to point to the global locations.
|
||||
* Install ``distutils.cfg`` before Setuptools, so that system
|
||||
customizations of ``distutils.cfg`` won't effect the installation.
|
||||
* Add ``bin/pythonX.Y`` to the virtualenv (in addition to
|
||||
``bin/python``).
|
||||
* Fixed an issue with Mac Framework Python builds, and absolute paths
|
||||
(from Ronald Oussoren).
|
||||
|
||||
0.9.1
|
||||
~~~~~
|
||||
|
||||
* Improve ability to create a virtualenv from inside a virtualenv.
|
||||
* Fix a little bug in ``bin/activate``.
|
||||
* Actually get ``distutils.cfg`` to work reliably.
|
||||
|
||||
0.9
|
||||
~~~
|
||||
|
||||
* Added ``lib-dynload`` and ``config`` to things that need to be
|
||||
copied over in an environment.
|
||||
* Copy over or symlink the ``include`` directory, so that you can
|
||||
build packages that need the C headers.
|
||||
* Include a ``distutils`` package, so you can locally update
|
||||
``distutils.cfg`` (in ``lib/pythonX.Y/distutils/distutils.cfg``).
|
||||
* Better avoid downloading Setuptools, and hitting PyPI on environment
|
||||
creation.
|
||||
* Fix a problem creating a ``lib64/`` directory.
|
||||
* Should work on MacOSX Framework builds (the default Python
|
||||
installations on Mac). Thanks to Ronald Oussoren.
|
||||
|
||||
0.8.4
|
||||
~~~~~
|
||||
|
||||
* Windows installs would sometimes give errors about ``sys.prefix`` that
|
||||
were inaccurate.
|
||||
* Slightly prettier output.
|
||||
|
||||
0.8.3
|
||||
~~~~~
|
||||
|
||||
* Added support for Windows.
|
||||
|
||||
0.8.2
|
||||
~~~~~
|
||||
|
||||
* Give a better warning if you are on an unsupported platform (Mac
|
||||
Framework Pythons, and Windows).
|
||||
* Give error about running while inside a workingenv.
|
||||
* Give better error message about Python 2.3.
|
||||
|
||||
0.8.1
|
||||
~~~~~
|
||||
|
||||
Fixed packaging of the library.
|
||||
|
||||
0.8
|
||||
~~~
|
||||
|
||||
Initial release. Everything is changed and new!
|
||||
@@ -1,3 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
import virtualenv
|
||||
virtualenv.main()
|
||||
@@ -1,5 +0,0 @@
|
||||
[egg_info]
|
||||
tag_build =
|
||||
tag_date = 0
|
||||
tag_svn_revision = 0
|
||||
|
||||
@@ -1,58 +0,0 @@
|
||||
import sys, os
|
||||
try:
|
||||
from setuptools import setup
|
||||
kw = {'entry_points':
|
||||
"""[console_scripts]\nvirtualenv = virtualenv:main\n""",
|
||||
'zip_safe': False}
|
||||
except ImportError:
|
||||
from distutils.core import setup
|
||||
if sys.platform == 'win32':
|
||||
print('Note: without Setuptools installed you will have to use "python -m virtualenv ENV"')
|
||||
kw = {}
|
||||
else:
|
||||
kw = {'scripts': ['scripts/virtualenv']}
|
||||
|
||||
here = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
## Get long_description from index.txt:
|
||||
f = open(os.path.join(here, 'docs', 'index.txt'))
|
||||
long_description = f.read().strip()
|
||||
long_description = long_description.split('split here', 1)[1]
|
||||
f.close()
|
||||
f = open(os.path.join(here, 'docs', 'news.txt'))
|
||||
long_description += "\n\n" + f.read()
|
||||
f.close()
|
||||
|
||||
setup(name='virtualenv',
|
||||
# If you change the version here, change it in virtualenv.py and
|
||||
# docs/conf.py as well
|
||||
version="1.7",
|
||||
description="Virtual Python Environment builder",
|
||||
long_description=long_description,
|
||||
classifiers=[
|
||||
'Development Status :: 4 - Beta',
|
||||
'Intended Audience :: Developers',
|
||||
'License :: OSI Approved :: MIT License',
|
||||
'Programming Language :: Python :: 2',
|
||||
'Programming Language :: Python :: 2.4',
|
||||
'Programming Language :: Python :: 2.5',
|
||||
'Programming Language :: Python :: 2.6',
|
||||
'Programming Language :: Python :: 2.7',
|
||||
'Programming Language :: Python :: 3',
|
||||
'Programming Language :: Python :: 3.1',
|
||||
'Programming Language :: Python :: 3.2',
|
||||
],
|
||||
keywords='setuptools deployment installation distutils',
|
||||
author='Ian Bicking',
|
||||
author_email='ianb@colorstudy.com',
|
||||
maintainer='Jannis Leidel, Carl Meyer and Brian Rosner',
|
||||
maintainer_email='python-virtualenv@groups.google.com',
|
||||
url='http://www.virtualenv.org',
|
||||
license='MIT',
|
||||
py_modules=['virtualenv'],
|
||||
packages=['virtualenv_support'],
|
||||
package_data={'virtualenv_support': ['*-py%s.egg' % sys.version[:3], '*.tar.gz']},
|
||||
test_suite='nose.collector',
|
||||
tests_require=['nose', 'Mock'],
|
||||
**kw
|
||||
)
|
||||
@@ -1,50 +0,0 @@
|
||||
import virtualenv
|
||||
from mock import patch, Mock
|
||||
|
||||
|
||||
def test_version():
|
||||
"""Should have a version string"""
|
||||
assert virtualenv.virtualenv_version == "1.7", "Should have version"
|
||||
|
||||
|
||||
@patch('os.path.exists')
|
||||
def test_resolve_interpreter_with_absolute_path(mock_exists):
|
||||
"""Should return absolute path if given and exists"""
|
||||
mock_exists.return_value = True
|
||||
virtualenv.is_executable = Mock(return_value=True)
|
||||
|
||||
exe = virtualenv.resolve_interpreter("/usr/bin/python42")
|
||||
|
||||
assert exe == "/usr/bin/python42", "Absolute path should return as is"
|
||||
mock_exists.assert_called_with("/usr/bin/python42")
|
||||
virtualenv.is_executable.assert_called_with("/usr/bin/python42")
|
||||
|
||||
|
||||
@patch('os.path.exists')
|
||||
def test_resolve_intepreter_with_nonexistant_interpreter(mock_exists):
|
||||
"""Should exit when with absolute path if not exists"""
|
||||
mock_exists.return_value = False
|
||||
|
||||
try:
|
||||
virtualenv.resolve_interpreter("/usr/bin/python42")
|
||||
assert False, "Should raise exception"
|
||||
except SystemExit:
|
||||
pass
|
||||
|
||||
mock_exists.assert_called_with("/usr/bin/python42")
|
||||
|
||||
|
||||
@patch('os.path.exists')
|
||||
def test_resolve_intepreter_with_invalid_interpreter(mock_exists):
|
||||
"""Should exit when with absolute path if not exists"""
|
||||
mock_exists.return_value = True
|
||||
virtualenv.is_executable = Mock(return_value=False)
|
||||
|
||||
try:
|
||||
virtualenv.resolve_interpreter("/usr/bin/python42")
|
||||
assert False, "Should raise exception"
|
||||
except SystemExit:
|
||||
pass
|
||||
|
||||
mock_exists.assert_called_with("/usr/bin/python42")
|
||||
virtualenv.is_executable.assert_called_with("/usr/bin/python42")
|
||||
@@ -1,906 +0,0 @@
|
||||
Metadata-Version: 1.0
|
||||
Name: virtualenv
|
||||
Version: 1.7
|
||||
Summary: Virtual Python Environment builder
|
||||
Home-page: http://www.virtualenv.org
|
||||
Author: Jannis Leidel, Carl Meyer and Brian Rosner
|
||||
Author-email: python-virtualenv@groups.google.com
|
||||
License: MIT
|
||||
Description:
|
||||
|
||||
Status and License
|
||||
------------------
|
||||
|
||||
``virtualenv`` is a successor to `workingenv
|
||||
<http://cheeseshop.python.org/pypi/workingenv.py>`_, and an extension
|
||||
of `virtual-python
|
||||
<http://peak.telecommunity.com/DevCenter/EasyInstall#creating-a-virtual-python>`_.
|
||||
|
||||
It was written by Ian Bicking, sponsored by the `Open Planning
|
||||
Project <http://openplans.org>`_ and is now maintained by a
|
||||
`group of developers <https://github.com/pypa/virtualenv/raw/master/AUTHORS.txt>`_.
|
||||
It is licensed under an
|
||||
`MIT-style permissive license <https://github.com/pypa/virtualenv/raw/master/LICENSE.txt>`_.
|
||||
|
||||
You can install it with ``pip install virtualenv``, or the `latest
|
||||
development version <https://github.com/pypa/virtualenv/tarball/develop#egg=virtualenv-dev>`_
|
||||
with ``pip install virtualenv==dev``.
|
||||
|
||||
You can also use ``easy_install``, or if you have no Python package manager
|
||||
available at all, you can just grab the single file `virtualenv.py`_ and run
|
||||
it with ``python virtualenv.py``.
|
||||
|
||||
.. _virtualenv.py: https://raw.github.com/pypa/virtualenv/master/virtualenv.py
|
||||
|
||||
|
||||
What It Does
|
||||
------------
|
||||
|
||||
``virtualenv`` is a tool to create isolated Python environments.
|
||||
|
||||
The basic problem being addressed is one of dependencies and versions,
|
||||
and indirectly permissions. Imagine you have an application that
|
||||
needs version 1 of LibFoo, but another application requires version
|
||||
2. How can you use both these applications? If you install
|
||||
everything into ``/usr/lib/python2.7/site-packages`` (or whatever your
|
||||
platform's standard location is), it's easy to end up in a situation
|
||||
where you unintentionally upgrade an application that shouldn't be
|
||||
upgraded.
|
||||
|
||||
Or more generally, what if you want to install an application *and
|
||||
leave it be*? If an application works, any change in its libraries or
|
||||
the versions of those libraries can break the application.
|
||||
|
||||
Also, what if you can't install packages into the global
|
||||
``site-packages`` directory? For instance, on a shared host.
|
||||
|
||||
In all these cases, ``virtualenv`` can help you. It creates an
|
||||
environment that has its own installation directories, that doesn't
|
||||
share libraries with other virtualenv environments (and optionally
|
||||
doesn't access the globally installed libraries either).
|
||||
|
||||
The basic usage is::
|
||||
|
||||
$ python virtualenv.py ENV
|
||||
|
||||
If you install it you can also just do ``virtualenv ENV``.
|
||||
|
||||
This creates ``ENV/lib/pythonX.X/site-packages``, where any libraries you
|
||||
install will go. It also creates ``ENV/bin/python``, which is a Python
|
||||
interpreter that uses this environment. Anytime you use that interpreter
|
||||
(including when a script has ``#!/path/to/ENV/bin/python`` in it) the libraries
|
||||
in that environment will be used.
|
||||
|
||||
It also installs either `Setuptools
|
||||
<http://peak.telecommunity.com/DevCenter/setuptools>`_ or `distribute
|
||||
<http://pypi.python.org/pypi/distribute>`_ into the environment. To use
|
||||
Distribute instead of setuptools, just call virtualenv like this::
|
||||
|
||||
$ python virtualenv.py --distribute ENV
|
||||
|
||||
You can also set the environment variable VIRTUALENV_USE_DISTRIBUTE.
|
||||
|
||||
A new virtualenv also includes the `pip <http://pypy.python.org/pypi/pip>`_
|
||||
installer, so you can use ``ENV/bin/pip`` to install additional packages into
|
||||
the environment.
|
||||
|
||||
Environment variables and configuration files
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
virtualenv can not only be configured by passing command line options such as
|
||||
``--distribute`` but also by two other means:
|
||||
|
||||
- Environment variables
|
||||
|
||||
Each command line option is automatically used to look for environment
|
||||
variables with the name format ``VIRTUALENV_<UPPER_NAME>``. That means
|
||||
the name of the command line options are capitalized and have dashes
|
||||
(``'-'``) replaced with underscores (``'_'``).
|
||||
|
||||
For example, to automatically install Distribute instead of setuptools
|
||||
you can also set an environment variable::
|
||||
|
||||
$ export VIRTUALENV_USE_DISTRIBUTE=true
|
||||
$ python virtualenv.py ENV
|
||||
|
||||
It's the same as passing the option to virtualenv directly::
|
||||
|
||||
$ python virtualenv.py --distribute ENV
|
||||
|
||||
This also works for appending command line options, like ``--find-links``.
|
||||
Just leave an empty space between the passsed values, e.g.::
|
||||
|
||||
$ export VIRTUALENV_EXTRA_SEARCH_DIR="/path/to/dists /path/to/other/dists"
|
||||
$ virtualenv ENV
|
||||
|
||||
is the same as calling::
|
||||
|
||||
$ python virtualenv.py --extra-search-dir=/path/to/dists --extra-search-dir=/path/to/other/dists ENV
|
||||
|
||||
- Config files
|
||||
|
||||
virtualenv also looks for a standard ini config file. On Unix and Mac OS X
|
||||
that's ``$HOME/.virtualenv/virtualenv.ini`` and on Windows, it's
|
||||
``%HOME%\\virtualenv\\virtualenv.ini``.
|
||||
|
||||
The names of the settings are derived from the long command line option,
|
||||
e.g. the option ``--distribute`` would look like this::
|
||||
|
||||
[virtualenv]
|
||||
distribute = true
|
||||
|
||||
Appending options like ``--extra-search-dir`` can be written on multiple
|
||||
lines::
|
||||
|
||||
[virtualenv]
|
||||
extra-search-dir =
|
||||
/path/to/dists
|
||||
/path/to/other/dists
|
||||
|
||||
Please have a look at the output of ``virtualenv --help`` for a full list
|
||||
of supported options.
|
||||
|
||||
Windows Notes
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
Some paths within the virtualenv are slightly different on Windows: scripts and
|
||||
executables on Windows go in ``ENV\Scripts\`` instead of ``ENV/bin/`` and
|
||||
libraries go in ``ENV\Lib\`` rather than ``ENV/lib/``.
|
||||
|
||||
To create a virtualenv under a path with spaces in it on Windows, you'll need
|
||||
the `win32api <http://sourceforge.net/projects/pywin32/>`_ library installed.
|
||||
|
||||
PyPy Support
|
||||
~~~~~~~~~~~~
|
||||
|
||||
Beginning with virtualenv version 1.5 `PyPy <http://pypy.org>`_ is
|
||||
supported. To use PyPy 1.4 or 1.4.1, you need a version of virtualenv >= 1.5.
|
||||
To use PyPy 1.5, you need a version of virtualenv >= 1.6.1.
|
||||
|
||||
Creating Your Own Bootstrap Scripts
|
||||
-----------------------------------
|
||||
|
||||
While this creates an environment, it doesn't put anything into the
|
||||
environment. Developers may find it useful to distribute a script
|
||||
that sets up a particular environment, for example a script that
|
||||
installs a particular web application.
|
||||
|
||||
To create a script like this, call
|
||||
``virtualenv.create_bootstrap_script(extra_text)``, and write the
|
||||
result to your new bootstrapping script. Here's the documentation
|
||||
from the docstring:
|
||||
|
||||
Creates a bootstrap script, which is like this script but with
|
||||
extend_parser, adjust_options, and after_install hooks.
|
||||
|
||||
This returns a string that (written to disk of course) can be used
|
||||
as a bootstrap script with your own customizations. The script
|
||||
will be the standard virtualenv.py script, with your extra text
|
||||
added (your extra text should be Python code).
|
||||
|
||||
If you include these functions, they will be called:
|
||||
|
||||
``extend_parser(optparse_parser)``:
|
||||
You can add or remove options from the parser here.
|
||||
|
||||
``adjust_options(options, args)``:
|
||||
You can change options here, or change the args (if you accept
|
||||
different kinds of arguments, be sure you modify ``args`` so it is
|
||||
only ``[DEST_DIR]``).
|
||||
|
||||
``after_install(options, home_dir)``:
|
||||
|
||||
After everything is installed, this function is called. This
|
||||
is probably the function you are most likely to use. An
|
||||
example would be::
|
||||
|
||||
def after_install(options, home_dir):
|
||||
if sys.platform == 'win32':
|
||||
bin = 'Scripts'
|
||||
else:
|
||||
bin = 'bin'
|
||||
subprocess.call([join(home_dir, bin, 'easy_install'),
|
||||
'MyPackage'])
|
||||
subprocess.call([join(home_dir, bin, 'my-package-script'),
|
||||
'setup', home_dir])
|
||||
|
||||
This example immediately installs a package, and runs a setup
|
||||
script from that package.
|
||||
|
||||
Bootstrap Example
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
Here's a more concrete example of how you could use this::
|
||||
|
||||
import virtualenv, textwrap
|
||||
output = virtualenv.create_bootstrap_script(textwrap.dedent("""
|
||||
import os, subprocess
|
||||
def after_install(options, home_dir):
|
||||
etc = join(home_dir, 'etc')
|
||||
if not os.path.exists(etc):
|
||||
os.makedirs(etc)
|
||||
subprocess.call([join(home_dir, 'bin', 'easy_install'),
|
||||
'BlogApplication'])
|
||||
subprocess.call([join(home_dir, 'bin', 'paster'),
|
||||
'make-config', 'BlogApplication',
|
||||
join(etc, 'blog.ini')])
|
||||
subprocess.call([join(home_dir, 'bin', 'paster'),
|
||||
'setup-app', join(etc, 'blog.ini')])
|
||||
"""))
|
||||
f = open('blog-bootstrap.py', 'w').write(output)
|
||||
|
||||
Another example is available `here
|
||||
<https://github.com/socialplanning/fassembler/blob/master/fassembler/create-venv-script.py>`_.
|
||||
|
||||
activate script
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
In a newly created virtualenv there will be a ``bin/activate`` shell
|
||||
script, or a ``Scripts/activate.bat`` batch file on Windows.
|
||||
|
||||
On Posix systems you can do::
|
||||
|
||||
$ source bin/activate
|
||||
|
||||
This will change your ``$PATH`` to point to the virtualenv's ``bin/``
|
||||
directory. (You have to use ``source`` because it changes your shell
|
||||
environment in-place.) This is all it does; it's purely a convenience. If
|
||||
you directly run a script or the python interpreter from the virtualenv's
|
||||
``bin/`` directory (e.g. ``path/to/env/bin/pip`` or
|
||||
``/path/to/env/bin/python script.py``) there's no need for activation.
|
||||
|
||||
After activating an environment you can use the function ``deactivate`` to
|
||||
undo the changes to your ``$PATH``.
|
||||
|
||||
The ``activate`` script will also modify your shell prompt to indicate
|
||||
which environment is currently active. You can disable this behavior,
|
||||
which can be useful if you have your own custom prompt that already
|
||||
displays the active environment name. To do so, set the
|
||||
``VIRTUAL_ENV_DISABLE_PROMPT`` environment variable to any non-empty
|
||||
value before running the ``activate`` script.
|
||||
|
||||
On Windows you just do::
|
||||
|
||||
> \path\to\env\Scripts\activate.bat
|
||||
|
||||
And use ``deactivate.bat`` to undo the changes.
|
||||
|
||||
The ``--system-site-packages`` Option
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
If you build with ``virtualenv --system-site-packages ENV``, your virtual
|
||||
environment will inherit packages from ``/usr/lib/python2.7/site-packages``
|
||||
(or wherever your global site-packages directory is).
|
||||
|
||||
This can be used if you have control over the global site-packages directory,
|
||||
and you want to depend on the packages there. If you want isolation from the
|
||||
global system, do not use this flag.
|
||||
|
||||
Using Virtualenv without ``bin/python``
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Sometimes you can't or don't want to use the Python interpreter
|
||||
created by the virtualenv. For instance, in a `mod_python
|
||||
<http://www.modpython.org/>`_ or `mod_wsgi <http://www.modwsgi.org/>`_
|
||||
environment, there is only one interpreter.
|
||||
|
||||
Luckily, it's easy. You must use the custom Python interpreter to
|
||||
*install* libraries. But to *use* libraries, you just have to be sure
|
||||
the path is correct. A script is available to correct the path. You
|
||||
can setup the environment like::
|
||||
|
||||
activate_this = '/path/to/env/bin/activate_this.py'
|
||||
execfile(activate_this, dict(__file__=activate_this))
|
||||
|
||||
This will change ``sys.path`` and even change ``sys.prefix``, but also allow
|
||||
you to use an existing interpreter. Items in your environment will show up
|
||||
first on ``sys.path``, before global items. However, global items will
|
||||
always be accessible (as if the ``--system-site-packages`` flag had been used
|
||||
in creating the environment, whether it was or not). Also, this cannot undo
|
||||
the activation of other environments, or modules that have been imported.
|
||||
You shouldn't try to, for instance, activate an environment before a web
|
||||
request; you should activate *one* environment as early as possible, and not
|
||||
do it again in that process.
|
||||
|
||||
Making Environments Relocatable
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Note: this option is somewhat experimental, and there are probably
|
||||
caveats that have not yet been identified. Also this does not
|
||||
currently work on Windows.
|
||||
|
||||
Normally environments are tied to a specific path. That means that
|
||||
you cannot move an environment around or copy it to another computer.
|
||||
You can fix up an environment to make it relocatable with the
|
||||
command::
|
||||
|
||||
$ virtualenv --relocatable ENV
|
||||
|
||||
This will make some of the files created by setuptools or distribute
|
||||
use relative paths, and will change all the scripts to use ``activate_this.py``
|
||||
instead of using the location of the Python interpreter to select the
|
||||
environment.
|
||||
|
||||
**Note:** you must run this after you've installed *any* packages into
|
||||
the environment. If you make an environment relocatable, then
|
||||
install a new package, you must run ``virtualenv --relocatable``
|
||||
again.
|
||||
|
||||
Also, this **does not make your packages cross-platform**. You can
|
||||
move the directory around, but it can only be used on other similar
|
||||
computers. Some known environmental differences that can cause
|
||||
incompatibilities: a different version of Python, when one platform
|
||||
uses UCS2 for its internal unicode representation and another uses
|
||||
UCS4 (a compile-time option), obvious platform changes like Windows
|
||||
vs. Linux, or Intel vs. ARM, and if you have libraries that bind to C
|
||||
libraries on the system, if those C libraries are located somewhere
|
||||
different (either different versions, or a different filesystem
|
||||
layout).
|
||||
|
||||
If you use this flag to create an environment, currently, the
|
||||
``--system-site-packages`` option will be implied.
|
||||
|
||||
The ``--extra-search-dir`` Option
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
When it creates a new environment, virtualenv installs either
|
||||
setuptools or distribute, and pip. In normal operation, the latest
|
||||
releases of these packages are fetched from the `Python Package Index
|
||||
<http://pypi.python.org>`_ (PyPI). In some circumstances, this
|
||||
behavior may not be wanted, for example if you are using virtualenv
|
||||
during a deployment and do not want to depend on Internet access and
|
||||
PyPI availability.
|
||||
|
||||
As an alternative, you can provide your own versions of setuptools,
|
||||
distribute and/or pip on the filesystem, and tell virtualenv to use
|
||||
those distributions instead of downloading them from the Internet. To
|
||||
use this feature, pass one or more ``--extra-search-dir`` options to
|
||||
virtualenv like this::
|
||||
|
||||
$ virtualenv --extra-search-dir=/path/to/distributions ENV
|
||||
|
||||
The ``/path/to/distributions`` path should point to a directory that
|
||||
contains setuptools, distribute and/or pip distributions. Setuptools
|
||||
distributions must be ``.egg`` files; distribute and pip distributions
|
||||
should be `.tar.gz` source distributions.
|
||||
|
||||
Virtualenv will still download these packages if no satisfactory local
|
||||
distributions are found.
|
||||
|
||||
If you are really concerned about virtualenv fetching these packages
|
||||
from the Internet and want to ensure that it never will, you can also
|
||||
provide an option ``--never-download`` like so::
|
||||
|
||||
$ virtualenv --extra-search-dir=/path/to/distributions --never-download ENV
|
||||
|
||||
If this option is provided, virtualenv will never try to download
|
||||
setuptools/distribute or pip. Instead, it will exit with status code 1
|
||||
if it fails to find local distributions for any of these required
|
||||
packages.
|
||||
|
||||
Compare & Contrast with Alternatives
|
||||
------------------------------------
|
||||
|
||||
There are several alternatives that create isolated environments:
|
||||
|
||||
* ``workingenv`` (which I do not suggest you use anymore) is the
|
||||
predecessor to this library. It used the main Python interpreter,
|
||||
but relied on setting ``$PYTHONPATH`` to activate the environment.
|
||||
This causes problems when running Python scripts that aren't part of
|
||||
the environment (e.g., a globally installed ``hg`` or ``bzr``). It
|
||||
also conflicted a lot with Setuptools.
|
||||
|
||||
* `virtual-python
|
||||
<http://peak.telecommunity.com/DevCenter/EasyInstall#creating-a-virtual-python>`_
|
||||
is also a predecessor to this library. It uses only symlinks, so it
|
||||
couldn't work on Windows. It also symlinks over the *entire*
|
||||
standard library and global ``site-packages``. As a result, it
|
||||
won't see new additions to the global ``site-packages``.
|
||||
|
||||
This script only symlinks a small portion of the standard library
|
||||
into the environment, and so on Windows it is feasible to simply
|
||||
copy these files over. Also, it creates a new/empty
|
||||
``site-packages`` and also adds the global ``site-packages`` to the
|
||||
path, so updates are tracked separately. This script also installs
|
||||
Setuptools automatically, saving a step and avoiding the need for
|
||||
network access.
|
||||
|
||||
* `zc.buildout <http://pypi.python.org/pypi/zc.buildout>`_ doesn't
|
||||
create an isolated Python environment in the same style, but
|
||||
achieves similar results through a declarative config file that sets
|
||||
up scripts with very particular packages. As a declarative system,
|
||||
it is somewhat easier to repeat and manage, but more difficult to
|
||||
experiment with. ``zc.buildout`` includes the ability to setup
|
||||
non-Python systems (e.g., a database server or an Apache instance).
|
||||
|
||||
I *strongly* recommend anyone doing application development or
|
||||
deployment use one of these tools.
|
||||
|
||||
Contributing
|
||||
------------
|
||||
|
||||
Refer to the `contributing to pip`_ documentation - it applies equally to
|
||||
virtualenv.
|
||||
|
||||
Virtualenv's release schedule is tied to pip's -- each time there's a new pip
|
||||
release, there will be a new virtualenv release that bundles the new version of
|
||||
pip.
|
||||
|
||||
.. _contributing to pip: http://www.pip-installer.org/en/latest/how-to-contribute.html
|
||||
|
||||
Running the tests
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
Virtualenv's test suite is small and not yet at all comprehensive, but we aim
|
||||
to grow it.
|
||||
|
||||
The easy way to run tests (handles test dependencies automatically)::
|
||||
|
||||
$ python setup.py test
|
||||
|
||||
If you want to run only a selection of the tests, you'll need to run them
|
||||
directly with nose instead. Create a virtualenv, and install required
|
||||
packages::
|
||||
|
||||
$ pip install nose mock
|
||||
|
||||
Run nosetests::
|
||||
|
||||
$ nosetests
|
||||
|
||||
Or select just a single test file to run::
|
||||
|
||||
$ nosetests tests.test_virtualenv
|
||||
|
||||
|
||||
Other Documentation and Links
|
||||
-----------------------------
|
||||
|
||||
* James Gardner has written a tutorial on using `virtualenv with
|
||||
Pylons
|
||||
<http://wiki.pylonshq.com/display/pylonscookbook/Using+a+Virtualenv+Sandbox>`_.
|
||||
|
||||
* `Blog announcement
|
||||
<http://blog.ianbicking.org/2007/10/10/workingenv-is-dead-long-live-virtualenv/>`_.
|
||||
|
||||
* Doug Hellmann wrote a description of his `command-line work flow
|
||||
using virtualenv (virtualenvwrapper)
|
||||
<http://www.doughellmann.com/articles/CompletelyDifferent-2008-05-virtualenvwrapper/index.html>`_
|
||||
including some handy scripts to make working with multiple
|
||||
environments easier. He also wrote `an example of using virtualenv
|
||||
to try IPython
|
||||
<http://www.doughellmann.com/articles/CompletelyDifferent-2008-02-ipython-and-virtualenv/index.html>`_.
|
||||
|
||||
* Chris Perkins created a `showmedo video including virtualenv
|
||||
<http://showmedo.com/videos/video?name=2910000&fromSeriesID=291>`_.
|
||||
|
||||
* `Using virtualenv with mod_wsgi
|
||||
<http://code.google.com/p/modwsgi/wiki/VirtualEnvironments>`_.
|
||||
|
||||
* `virtualenv commands
|
||||
<http://thisismedium.com/tech/extending-virtualenv/>`_ for some more
|
||||
workflow-related tools around virtualenv.
|
||||
|
||||
Changes & News
|
||||
--------------
|
||||
|
||||
1.7 (2011-11-30)
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
* Updated embedded Distribute release to 0.6.24. Thanks Alex Grönholm.
|
||||
|
||||
* Made ``--no-site-packages`` behavior the default behavior. The
|
||||
``--no-site-packages`` flag is still permitted, but displays a warning when
|
||||
used. Thanks Chris McDonough.
|
||||
|
||||
* New flag: ``--system-site-packages``; this flag should be passed to get the
|
||||
previous default global-site-package-including behavior back.
|
||||
|
||||
* Added ability to set command options as environment variables and options
|
||||
in a ``virtualenv.ini`` file.
|
||||
|
||||
* Fixed various encoding related issues with paths. Thanks Gunnlaugur Thor Briem.
|
||||
|
||||
* Made ``virtualenv.py`` script executable.
|
||||
|
||||
1.6.4 (2011-07-21)
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Restored ability to run on Python 2.4, too.
|
||||
|
||||
1.6.3 (2011-07-16)
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Restored ability to run on Python < 2.7.
|
||||
|
||||
1.6.2 (2011-07-16)
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Updated embedded distribute release to 0.6.19.
|
||||
|
||||
* Updated embedded pip release to 1.0.2.
|
||||
|
||||
* Fixed #141 - Be smarter about finding pkg_resources when using the
|
||||
non-default Python intepreter (by using the ``-p`` option).
|
||||
|
||||
* Fixed #112 - Fixed path in docs.
|
||||
|
||||
* Fixed #109 - Corrected doctests of a Logger method.
|
||||
|
||||
* Fixed #118 - Fixed creating virtualenvs on platforms that use the
|
||||
"posix_local" install scheme, such as Ubuntu with Python 2.7.
|
||||
|
||||
* Add missing library to Python 3 virtualenvs (``_dummy_thread``).
|
||||
|
||||
|
||||
1.6.1 (2011-04-30)
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Start to use git-flow.
|
||||
|
||||
* Added support for PyPy 1.5
|
||||
|
||||
* Fixed #121 -- added sanity-checking of the -p argument. Thanks Paul Nasrat.
|
||||
|
||||
* Added progress meter for pip installation as well as setuptools. Thanks Ethan
|
||||
Jucovy.
|
||||
|
||||
* Added --never-download and --search-dir options. Thanks Ethan Jucovy.
|
||||
|
||||
1.6
|
||||
~~~
|
||||
|
||||
* Added Python 3 support! Huge thanks to Vinay Sajip and Vitaly Babiy.
|
||||
|
||||
* Fixed creation of virtualenvs on Mac OS X when standard library modules
|
||||
(readline) are installed outside the standard library.
|
||||
|
||||
* Updated bundled pip to 1.0.
|
||||
|
||||
1.5.2
|
||||
~~~~~
|
||||
|
||||
* Moved main repository to Github: https://github.com/pypa/virtualenv
|
||||
|
||||
* Transferred primary maintenance from Ian to Jannis Leidel, Carl Meyer and Brian Rosner
|
||||
|
||||
* Fixed a few more pypy related bugs.
|
||||
|
||||
* Updated bundled pip to 0.8.2.
|
||||
|
||||
* Handed project over to new team of maintainers.
|
||||
|
||||
* Moved virtualenv to Github at https://github.com/pypa/virtualenv
|
||||
|
||||
1.5.1
|
||||
~~~~~
|
||||
|
||||
* Added ``_weakrefset`` requirement for Python 2.7.1.
|
||||
|
||||
* Fixed Windows regression in 1.5
|
||||
|
||||
1.5
|
||||
~~~
|
||||
|
||||
* Include pip 0.8.1.
|
||||
|
||||
* Add support for PyPy.
|
||||
|
||||
* Uses a proper temporary dir when installing environment requirements.
|
||||
|
||||
* Add ``--prompt`` option to be able to override the default prompt prefix.
|
||||
|
||||
* Fix an issue with ``--relocatable`` on Windows.
|
||||
|
||||
* Fix issue with installing the wrong version of distribute.
|
||||
|
||||
* Add fish and csh activate scripts.
|
||||
|
||||
1.4.9
|
||||
~~~~~
|
||||
|
||||
* Include pip 0.7.2
|
||||
|
||||
1.4.8
|
||||
~~~~~
|
||||
|
||||
* Fix for Mac OS X Framework builds that use
|
||||
``--universal-archs=intel``
|
||||
|
||||
* Fix ``activate_this.py`` on Windows.
|
||||
|
||||
* Allow ``$PYTHONHOME`` to be set, so long as you use ``source
|
||||
bin/activate`` it will get unset; if you leave it set and do not
|
||||
activate the environment it will still break the environment.
|
||||
|
||||
* Include pip 0.7.1
|
||||
|
||||
1.4.7
|
||||
~~~~~
|
||||
|
||||
* Include pip 0.7
|
||||
|
||||
1.4.6
|
||||
~~~~~
|
||||
|
||||
* Allow ``activate.sh`` to skip updating the prompt (by setting
|
||||
``$VIRTUAL_ENV_DISABLE_PROMPT``).
|
||||
|
||||
1.4.5
|
||||
~~~~~
|
||||
|
||||
* Include pip 0.6.3
|
||||
|
||||
* Fix ``activate.bat`` and ``deactivate.bat`` under Windows when
|
||||
``PATH`` contained a parenthesis
|
||||
|
||||
1.4.4
|
||||
~~~~~
|
||||
|
||||
* Include pip 0.6.2 and Distribute 0.6.10
|
||||
|
||||
* Create the ``virtualenv`` script even when Setuptools isn't
|
||||
installed
|
||||
|
||||
* Fix problem with ``virtualenv --relocate`` when ``bin/`` has
|
||||
subdirectories (e.g., ``bin/.svn/``); from Alan Franzoni.
|
||||
|
||||
* If you set ``$VIRTUALENV_USE_DISTRIBUTE`` then virtualenv will use
|
||||
Distribute by default (so you don't have to remember to use
|
||||
``--distribute``).
|
||||
|
||||
1.4.3
|
||||
~~~~~
|
||||
|
||||
* Include pip 0.6.1
|
||||
|
||||
1.4.2
|
||||
~~~~~
|
||||
|
||||
* Fix pip installation on Windows
|
||||
|
||||
* Fix use of stand-alone ``virtualenv.py`` (and boot scripts)
|
||||
|
||||
* Exclude ~/.local (user site-packages) from environments when using
|
||||
``--no-site-packages``
|
||||
|
||||
1.4.1
|
||||
~~~~~
|
||||
|
||||
* Include pip 0.6
|
||||
|
||||
1.4
|
||||
~~~
|
||||
|
||||
* Updated setuptools to 0.6c11
|
||||
|
||||
* Added the --distribute option
|
||||
|
||||
* Fixed packaging problem of support-files
|
||||
|
||||
1.3.4
|
||||
~~~~~
|
||||
|
||||
* Virtualenv now copies the actual embedded Python binary on
|
||||
Mac OS X to fix a hang on Snow Leopard (10.6).
|
||||
|
||||
* Fail more gracefully on Windows when ``win32api`` is not installed.
|
||||
|
||||
* Fix site-packages taking precedent over Jython's ``__classpath__``
|
||||
and also specially handle the new ``__pyclasspath__`` entry in
|
||||
``sys.path``.
|
||||
|
||||
* Now copies Jython's ``registry`` file to the virtualenv if it exists.
|
||||
|
||||
* Better find libraries when compiling extensions on Windows.
|
||||
|
||||
* Create ``Scripts\pythonw.exe`` on Windows.
|
||||
|
||||
* Added support for the Debian/Ubuntu
|
||||
``/usr/lib/pythonX.Y/dist-packages`` directory.
|
||||
|
||||
* Set ``distutils.sysconfig.get_config_vars()['LIBDIR']`` (based on
|
||||
``sys.real_prefix``) which is reported to help building on Windows.
|
||||
|
||||
* Make ``deactivate`` work on ksh
|
||||
|
||||
* Fixes for ``--python``: make it work with ``--relocatable`` and the
|
||||
symlink created to the exact Python version.
|
||||
|
||||
1.3.3
|
||||
~~~~~
|
||||
|
||||
* Use Windows newlines in ``activate.bat``, which has been reported to help
|
||||
when using non-ASCII directory names.
|
||||
|
||||
* Fixed compatibility with Jython 2.5b1.
|
||||
|
||||
* Added a function ``virtualenv.install_python`` for more fine-grained
|
||||
access to what ``virtualenv.create_environment`` does.
|
||||
|
||||
* Fix `a problem <https://bugs.launchpad.net/virtualenv/+bug/241581>`_
|
||||
with Windows and paths that contain spaces.
|
||||
|
||||
* If ``/path/to/env/.pydistutils.cfg`` exists (or
|
||||
``/path/to/env/pydistutils.cfg`` on Windows systems) then ignore
|
||||
``~/.pydistutils.cfg`` and use that other file instead.
|
||||
|
||||
* Fix ` a problem
|
||||
<https://bugs.launchpad.net/virtualenv/+bug/340050>`_ picking up
|
||||
some ``.so`` libraries in ``/usr/local``.
|
||||
|
||||
1.3.2
|
||||
~~~~~
|
||||
|
||||
* Remove the ``[install] prefix = ...`` setting from the virtualenv
|
||||
``distutils.cfg`` -- this has been causing problems for a lot of
|
||||
people, in rather obscure ways.
|
||||
|
||||
* If you use a `boot script <./index.html#boot-script>`_ it will attempt to import ``virtualenv``
|
||||
and find a pre-downloaded Setuptools egg using that.
|
||||
|
||||
* Added platform-specific paths, like ``/usr/lib/pythonX.Y/plat-linux2``
|
||||
|
||||
1.3.1
|
||||
~~~~~
|
||||
|
||||
* Real Python 2.6 compatibility. Backported the Python 2.6 updates to
|
||||
``site.py``, including `user directories
|
||||
<http://docs.python.org/dev/whatsnew/2.6.html#pep-370-per-user-site-packages-directory>`_
|
||||
(this means older versions of Python will support user directories,
|
||||
whether intended or not).
|
||||
|
||||
* Always set ``[install] prefix`` in ``distutils.cfg`` -- previously
|
||||
on some platforms where a system-wide ``distutils.cfg`` was present
|
||||
with a ``prefix`` setting, packages would be installed globally
|
||||
(usually in ``/usr/local/lib/pythonX.Y/site-packages``).
|
||||
|
||||
* Sometimes Cygwin seems to leave ``.exe`` off ``sys.executable``; a
|
||||
workaround is added.
|
||||
|
||||
* Fix ``--python`` option.
|
||||
|
||||
* Fixed handling of Jython environments that use a
|
||||
jython-complete.jar.
|
||||
|
||||
1.3
|
||||
~~~
|
||||
|
||||
* Update to Setuptools 0.6c9
|
||||
* Added an option ``virtualenv --relocatable EXISTING_ENV``, which
|
||||
will make an existing environment "relocatable" -- the paths will
|
||||
not be absolute in scripts, ``.egg-info`` and ``.pth`` files. This
|
||||
may assist in building environments that can be moved and copied.
|
||||
You have to run this *after* any new packages installed.
|
||||
* Added ``bin/activate_this.py``, a file you can use like
|
||||
``execfile("path_to/activate_this.py",
|
||||
dict(__file__="path_to/activate_this.py"))`` -- this will activate
|
||||
the environment in place, similar to what `the mod_wsgi example
|
||||
does <http://code.google.com/p/modwsgi/wiki/VirtualEnvironments>`_.
|
||||
* For Mac framework builds of Python, the site-packages directory
|
||||
``/Library/Python/X.Y/site-packages`` is added to ``sys.path``, from
|
||||
Andrea Rech.
|
||||
* Some platform-specific modules in Macs are added to the path now
|
||||
(``plat-darwin/``, ``plat-mac/``, ``plat-mac/lib-scriptpackages``),
|
||||
from Andrea Rech.
|
||||
* Fixed a small Bashism in the ``bin/activate`` shell script.
|
||||
* Added ``__future__`` to the list of required modules, for Python
|
||||
2.3. You'll still need to backport your own ``subprocess`` module.
|
||||
* Fixed the ``__classpath__`` entry in Jython's ``sys.path`` taking
|
||||
precedent over virtualenv's libs.
|
||||
|
||||
1.2
|
||||
~~~
|
||||
|
||||
* Added a ``--python`` option to select the Python interpreter.
|
||||
* Add ``warnings`` to the modules copied over, for Python 2.6 support.
|
||||
* Add ``sets`` to the module copied over for Python 2.3 (though Python
|
||||
2.3 still probably doesn't work).
|
||||
|
||||
1.1.1
|
||||
~~~~~
|
||||
|
||||
* Added support for Jython 2.5.
|
||||
|
||||
1.1
|
||||
~~~
|
||||
|
||||
* Added support for Python 2.6.
|
||||
* Fix a problem with missing ``DLLs/zlib.pyd`` on Windows. Create
|
||||
* ``bin/python`` (or ``bin/python.exe``) even when you run virtualenv
|
||||
with an interpreter named, e.g., ``python2.4``
|
||||
* Fix MacPorts Python
|
||||
* Added --unzip-setuptools option
|
||||
* Update to Setuptools 0.6c8
|
||||
* If the current directory is not writable, run ez_setup.py in ``/tmp``
|
||||
* Copy or symlink over the ``include`` directory so that packages will
|
||||
more consistently compile.
|
||||
|
||||
1.0
|
||||
~~~
|
||||
|
||||
* Fix build on systems that use ``/usr/lib64``, distinct from
|
||||
``/usr/lib`` (specifically CentOS x64).
|
||||
* Fixed bug in ``--clear``.
|
||||
* Fixed typos in ``deactivate.bat``.
|
||||
* Preserve ``$PYTHONPATH`` when calling subprocesses.
|
||||
|
||||
0.9.2
|
||||
~~~~~
|
||||
|
||||
* Fix include dir copying on Windows (makes compiling possible).
|
||||
* Include the main ``lib-tk`` in the path.
|
||||
* Patch ``distutils.sysconfig``: ``get_python_inc`` and
|
||||
``get_python_lib`` to point to the global locations.
|
||||
* Install ``distutils.cfg`` before Setuptools, so that system
|
||||
customizations of ``distutils.cfg`` won't effect the installation.
|
||||
* Add ``bin/pythonX.Y`` to the virtualenv (in addition to
|
||||
``bin/python``).
|
||||
* Fixed an issue with Mac Framework Python builds, and absolute paths
|
||||
(from Ronald Oussoren).
|
||||
|
||||
0.9.1
|
||||
~~~~~
|
||||
|
||||
* Improve ability to create a virtualenv from inside a virtualenv.
|
||||
* Fix a little bug in ``bin/activate``.
|
||||
* Actually get ``distutils.cfg`` to work reliably.
|
||||
|
||||
0.9
|
||||
~~~
|
||||
|
||||
* Added ``lib-dynload`` and ``config`` to things that need to be
|
||||
copied over in an environment.
|
||||
* Copy over or symlink the ``include`` directory, so that you can
|
||||
build packages that need the C headers.
|
||||
* Include a ``distutils`` package, so you can locally update
|
||||
``distutils.cfg`` (in ``lib/pythonX.Y/distutils/distutils.cfg``).
|
||||
* Better avoid downloading Setuptools, and hitting PyPI on environment
|
||||
creation.
|
||||
* Fix a problem creating a ``lib64/`` directory.
|
||||
* Should work on MacOSX Framework builds (the default Python
|
||||
installations on Mac). Thanks to Ronald Oussoren.
|
||||
|
||||
0.8.4
|
||||
~~~~~
|
||||
|
||||
* Windows installs would sometimes give errors about ``sys.prefix`` that
|
||||
were inaccurate.
|
||||
* Slightly prettier output.
|
||||
|
||||
0.8.3
|
||||
~~~~~
|
||||
|
||||
* Added support for Windows.
|
||||
|
||||
0.8.2
|
||||
~~~~~
|
||||
|
||||
* Give a better warning if you are on an unsupported platform (Mac
|
||||
Framework Pythons, and Windows).
|
||||
* Give error about running while inside a workingenv.
|
||||
* Give better error message about Python 2.3.
|
||||
|
||||
0.8.1
|
||||
~~~~~
|
||||
|
||||
Fixed packaging of the library.
|
||||
|
||||
0.8
|
||||
~~~
|
||||
|
||||
Initial release. Everything is changed and new!
|
||||
|
||||
Keywords: setuptools deployment installation distutils
|
||||
Platform: UNKNOWN
|
||||
Classifier: Development Status :: 4 - Beta
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: MIT License
|
||||
Classifier: Programming Language :: Python :: 2
|
||||
Classifier: Programming Language :: Python :: 2.4
|
||||
Classifier: Programming Language :: Python :: 2.5
|
||||
Classifier: Programming Language :: Python :: 2.6
|
||||
Classifier: Programming Language :: Python :: 2.7
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3.1
|
||||
Classifier: Programming Language :: Python :: 3.2
|
||||
@@ -1,38 +0,0 @@
|
||||
AUTHORS.txt
|
||||
HACKING
|
||||
LICENSE.txt
|
||||
MANIFEST.in
|
||||
setup.py
|
||||
virtualenv.py
|
||||
bin/rebuild-script.py
|
||||
bin/refresh-support-files.py
|
||||
docs/Makefile
|
||||
docs/conf.py
|
||||
docs/index.txt
|
||||
docs/make.bat
|
||||
docs/news.txt
|
||||
docs/_theme/nature/theme.conf
|
||||
docs/_theme/nature/static/nature.css_t
|
||||
docs/_theme/nature/static/pygments.css
|
||||
scripts/virtualenv
|
||||
tests/__init__.py
|
||||
tests/test_virtualenv.py
|
||||
virtualenv.egg-info/PKG-INFO
|
||||
virtualenv.egg-info/SOURCES.txt
|
||||
virtualenv.egg-info/dependency_links.txt
|
||||
virtualenv.egg-info/entry_points.txt
|
||||
virtualenv.egg-info/not-zip-safe
|
||||
virtualenv.egg-info/top_level.txt
|
||||
virtualenv_support/__init__.py
|
||||
virtualenv_support/activate.bat
|
||||
virtualenv_support/activate.csh
|
||||
virtualenv_support/activate.fish
|
||||
virtualenv_support/activate.sh
|
||||
virtualenv_support/deactivate.bat
|
||||
virtualenv_support/distribute-0.6.24.tar.gz
|
||||
virtualenv_support/distutils.cfg
|
||||
virtualenv_support/pip-1.0.2.tar.gz
|
||||
virtualenv_support/setuptools-0.6c11-py2.4.egg
|
||||
virtualenv_support/setuptools-0.6c11-py2.5.egg
|
||||
virtualenv_support/setuptools-0.6c11-py2.6.egg
|
||||
virtualenv_support/setuptools-0.6c11-py2.7.egg
|
||||
@@ -1 +0,0 @@
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
[console_scripts]
|
||||
virtualenv = virtualenv:main
|
||||
@@ -1 +0,0 @@
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
virtualenv_support
|
||||
virtualenv
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,31 +0,0 @@
|
||||
@echo off
|
||||
set VIRTUAL_ENV=__VIRTUAL_ENV__
|
||||
|
||||
if not defined PROMPT (
|
||||
set PROMPT=$P$G
|
||||
)
|
||||
|
||||
if defined _OLD_VIRTUAL_PROMPT (
|
||||
set PROMPT=%_OLD_VIRTUAL_PROMPT%
|
||||
)
|
||||
|
||||
if defined _OLD_VIRTUAL_PYTHONHOME (
|
||||
set PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%
|
||||
)
|
||||
|
||||
set _OLD_VIRTUAL_PROMPT=%PROMPT%
|
||||
set PROMPT=__VIRTUAL_WINPROMPT__ %PROMPT%
|
||||
|
||||
if defined PYTHONHOME (
|
||||
set _OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME%
|
||||
set PYTHONHOME=
|
||||
)
|
||||
|
||||
if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH%; goto SKIPPATH
|
||||
|
||||
set _OLD_VIRTUAL_PATH=%PATH%
|
||||
|
||||
:SKIPPATH
|
||||
set PATH=%VIRTUAL_ENV%\__BIN_NAME__;%PATH%
|
||||
|
||||
:END
|
||||
@@ -1,32 +0,0 @@
|
||||
# This file must be used with "source bin/activate.csh" *from csh*.
|
||||
# You cannot run it directly.
|
||||
# Created by Davide Di Blasi <davidedb@gmail.com>.
|
||||
|
||||
alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate'
|
||||
|
||||
# Unset irrelavent variables.
|
||||
deactivate nondestructive
|
||||
|
||||
setenv VIRTUAL_ENV "__VIRTUAL_ENV__"
|
||||
|
||||
set _OLD_VIRTUAL_PATH="$PATH"
|
||||
setenv PATH "$VIRTUAL_ENV/__BIN_NAME__:$PATH"
|
||||
|
||||
set _OLD_VIRTUAL_PROMPT="$prompt"
|
||||
|
||||
if ("__VIRTUAL_PROMPT__" != "") then
|
||||
set env_name = "__VIRTUAL_PROMPT__"
|
||||
else
|
||||
if (`basename "$VIRTUAL_ENV"` == "__") then
|
||||
# special case for Aspen magic directories
|
||||
# see http://www.zetadev.com/software/aspen/
|
||||
set env_name = `basename \`dirname "$VIRTUAL_ENV"\``
|
||||
else
|
||||
set env_name = `basename "$VIRTUAL_ENV"`
|
||||
endif
|
||||
endif
|
||||
set prompt = "[$env_name] $prompt"
|
||||
unset env_name
|
||||
|
||||
rehash
|
||||
|
||||
@@ -1,79 +0,0 @@
|
||||
# This file must be used with ". bin/activate.fish" *from fish* (http://fishshell.org)
|
||||
# you cannot run it directly
|
||||
|
||||
function deactivate -d "Exit virtualenv and return to normal shell environment"
|
||||
# reset old environment variables
|
||||
if test -n "$_OLD_VIRTUAL_PATH"
|
||||
set -gx PATH $_OLD_VIRTUAL_PATH
|
||||
set -e _OLD_VIRTUAL_PATH
|
||||
end
|
||||
if test -n "$_OLD_VIRTUAL_PYTHONHOME"
|
||||
set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME
|
||||
set -e _OLD_VIRTUAL_PYTHONHOME
|
||||
end
|
||||
|
||||
if test -n "$_OLD_FISH_PROMPT_OVERRIDE"
|
||||
functions -e fish_prompt
|
||||
set -e _OLD_FISH_PROMPT_OVERRIDE
|
||||
end
|
||||
|
||||
set -e VIRTUAL_ENV
|
||||
if test "$argv[1]" != "nondestructive"
|
||||
# Self destruct!
|
||||
functions -e deactivate
|
||||
end
|
||||
end
|
||||
|
||||
# unset irrelavent variables
|
||||
deactivate nondestructive
|
||||
|
||||
set -gx VIRTUAL_ENV "__VIRTUAL_ENV__"
|
||||
|
||||
set -gx _OLD_VIRTUAL_PATH $PATH
|
||||
set -gx PATH "$VIRTUAL_ENV/__BIN_NAME__" $PATH
|
||||
|
||||
# unset PYTHONHOME if set
|
||||
if set -q PYTHONHOME
|
||||
set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME
|
||||
set -e PYTHONHOME
|
||||
end
|
||||
|
||||
if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
|
||||
# fish shell uses a function, instead of env vars,
|
||||
# to produce the prompt. Overriding the existing function is easy.
|
||||
# However, adding to the current prompt, instead of clobbering it,
|
||||
# is a little more work.
|
||||
set -l oldpromptfile (tempfile)
|
||||
if test $status
|
||||
# save the current fish_prompt function...
|
||||
echo "function _old_fish_prompt" >> $oldpromptfile
|
||||
echo -n \# >> $oldpromptfile
|
||||
functions fish_prompt >> $oldpromptfile
|
||||
# we've made the "_old_fish_prompt" file, source it.
|
||||
. $oldpromptfile
|
||||
rm -f $oldpromptfile
|
||||
|
||||
if test -n "__VIRTUAL_PROMPT__"
|
||||
# We've been given us a prompt override.
|
||||
#
|
||||
# FIXME: Unsure how to handle this *safely*. We could just eval()
|
||||
# whatever is given, but the risk is a bit much.
|
||||
echo "activate.fish: Alternative prompt prefix is not supported under fish-shell." 1>&2
|
||||
echo "activate.fish: Alter the fish_prompt in this file as needed." 1>&2
|
||||
end
|
||||
|
||||
# with the original prompt function renamed, we can override with our own.
|
||||
function fish_prompt
|
||||
set -l _checkbase (basename "$VIRTUAL_ENV")
|
||||
if test $_checkbase = "__"
|
||||
# special case for Aspen magic directories
|
||||
# see http://www.zetadev.com/software/aspen/
|
||||
printf "%s[%s]%s %s" (set_color -b blue white) (basename (dirname "$VIRTUAL_ENV")) (set_color normal) (_old_fish_prompt)
|
||||
else
|
||||
printf "%s(%s)%s%s" (set_color -b blue white) (basename "$VIRTUAL_ENV") (set_color normal) (_old_fish_prompt)
|
||||
end
|
||||
end
|
||||
set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV"
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,76 +0,0 @@
|
||||
# This file must be used with "source bin/activate" *from bash*
|
||||
# you cannot run it directly
|
||||
|
||||
deactivate () {
|
||||
# reset old environment variables
|
||||
if [ -n "$_OLD_VIRTUAL_PATH" ] ; then
|
||||
PATH="$_OLD_VIRTUAL_PATH"
|
||||
export PATH
|
||||
unset _OLD_VIRTUAL_PATH
|
||||
fi
|
||||
if [ -n "$_OLD_VIRTUAL_PYTHONHOME" ] ; then
|
||||
PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME"
|
||||
export PYTHONHOME
|
||||
unset _OLD_VIRTUAL_PYTHONHOME
|
||||
fi
|
||||
|
||||
# This should detect bash and zsh, which have a hash command that must
|
||||
# be called to get it to forget past commands. Without forgetting
|
||||
# past commands the $PATH changes we made may not be respected
|
||||
if [ -n "$BASH" -o -n "$ZSH_VERSION" ] ; then
|
||||
hash -r
|
||||
fi
|
||||
|
||||
if [ -n "$_OLD_VIRTUAL_PS1" ] ; then
|
||||
PS1="$_OLD_VIRTUAL_PS1"
|
||||
export PS1
|
||||
unset _OLD_VIRTUAL_PS1
|
||||
fi
|
||||
|
||||
unset VIRTUAL_ENV
|
||||
if [ ! "$1" = "nondestructive" ] ; then
|
||||
# Self destruct!
|
||||
unset -f deactivate
|
||||
fi
|
||||
}
|
||||
|
||||
# unset irrelavent variables
|
||||
deactivate nondestructive
|
||||
|
||||
VIRTUAL_ENV="__VIRTUAL_ENV__"
|
||||
export VIRTUAL_ENV
|
||||
|
||||
_OLD_VIRTUAL_PATH="$PATH"
|
||||
PATH="$VIRTUAL_ENV/__BIN_NAME__:$PATH"
|
||||
export PATH
|
||||
|
||||
# unset PYTHONHOME if set
|
||||
# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
|
||||
# could use `if (set -u; : $PYTHONHOME) ;` in bash
|
||||
if [ -n "$PYTHONHOME" ] ; then
|
||||
_OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME"
|
||||
unset PYTHONHOME
|
||||
fi
|
||||
|
||||
if [ -z "$VIRTUAL_ENV_DISABLE_PROMPT" ] ; then
|
||||
_OLD_VIRTUAL_PS1="$PS1"
|
||||
if [ "x__VIRTUAL_PROMPT__" != x ] ; then
|
||||
PS1="__VIRTUAL_PROMPT__$PS1"
|
||||
else
|
||||
if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then
|
||||
# special case for Aspen magic directories
|
||||
# see http://www.zetadev.com/software/aspen/
|
||||
PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1"
|
||||
else
|
||||
PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1"
|
||||
fi
|
||||
fi
|
||||
export PS1
|
||||
fi
|
||||
|
||||
# This should detect bash and zsh, which have a hash command that must
|
||||
# be called to get it to forget past commands. Without forgetting
|
||||
# past commands the $PATH changes we made may not be respected
|
||||
if [ -n "$BASH" -o -n "$ZSH_VERSION" ] ; then
|
||||
hash -r
|
||||
fi
|
||||
@@ -1,17 +0,0 @@
|
||||
@echo off
|
||||
|
||||
if defined _OLD_VIRTUAL_PROMPT (
|
||||
set PROMPT=%_OLD_VIRTUAL_PROMPT%
|
||||
)
|
||||
set _OLD_VIRTUAL_PROMPT=
|
||||
|
||||
if defined _OLD_VIRTUAL_PYTHONHOME (
|
||||
set PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%
|
||||
set _OLD_VIRTUAL_PYTHONHOME=
|
||||
)
|
||||
|
||||
if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH%
|
||||
|
||||
set _OLD_VIRTUAL_PATH=
|
||||
|
||||
:END
|
||||
Binary file not shown.
@@ -1,6 +0,0 @@
|
||||
# This is a config file local to this virtualenv installation
|
||||
# You may include options that will be used by all distutils commands,
|
||||
# and by easy_install. For instance:
|
||||
#
|
||||
# [easy_install]
|
||||
# find_links = http://mylocalsite
|
||||
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user