mirror of
https://github.com/kennethreitz/heroku-buildpack-python.git
synced 2026-06-05 23:10:16 +00:00
Compare commits
614 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3b2c0b5df9 | |||
| 49b9eaa93e | |||
| 677dfeec11 | |||
| c77a1877d3 | |||
| 1c51f5d84e | |||
| 6922a82536 | |||
| 9cc5bf1a85 | |||
| 012cb8a4df | |||
| fab60ae6ab | |||
| cd52da6155 | |||
| acd9347930 | |||
| d7e2f0fb08 | |||
| a3ed9c7155 | |||
| 8db1f07fba | |||
| 17081d0328 | |||
| 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 |
+6
-6
@@ -1,6 +1,6 @@
|
|||||||
language: python
|
language: bash
|
||||||
python:
|
sudo: required
|
||||||
- 2.7
|
services:
|
||||||
script: make tests
|
- docker
|
||||||
notifications:
|
install: docker pull heroku/cedar:14
|
||||||
email: false
|
script: make test
|
||||||
|
|||||||
+204
@@ -0,0 +1,204 @@
|
|||||||
|
# Python Buildpack Changelog
|
||||||
|
|
||||||
|
## 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
|
||||||
-130
@@ -1,130 +0,0 @@
|
|||||||
## v14
|
|
||||||
|
|
||||||
Features:
|
|
||||||
|
|
||||||
* Full removal of Django settings injection for new apps.
|
|
||||||
* Support for profile.d
|
|
||||||
* Fresh app detection.
|
|
||||||
* Update to Virtualenv v1.7.2
|
|
||||||
* Updated to Pip v1.1 (patched)
|
|
||||||
|
|
||||||
Bugfixes:
|
|
||||||
|
|
||||||
* Default pip path exists action.
|
|
||||||
|
|
||||||
## v13
|
|
||||||
|
|
||||||
Bugfixes:
|
|
||||||
|
|
||||||
* Fix pip quoting error.
|
|
||||||
* Only talk about collectstatic in buildpack output when it's configured.
|
|
||||||
|
|
||||||
## v12
|
|
||||||
|
|
||||||
Bugfixes:
|
|
||||||
|
|
||||||
* Catch database setting corner case.
|
|
||||||
|
|
||||||
## v11
|
|
||||||
|
|
||||||
Bugfixes:
|
|
||||||
|
|
||||||
* Cleanup collectstatic output.
|
|
||||||
|
|
||||||
|
|
||||||
## v10
|
|
||||||
|
|
||||||
Bugfixes:
|
|
||||||
|
|
||||||
* Check for collectstatic validity with --dry-run instead of --help for Django 1.4.
|
|
||||||
|
|
||||||
## v9
|
|
||||||
|
|
||||||
Bugfixes:
|
|
||||||
|
|
||||||
* Unset PYTHONHOME in buildpack for [user_env_compile](http://devcenter.heroku.com/articles/labs-user-env-compile).
|
|
||||||
|
|
||||||
## v8
|
|
||||||
|
|
||||||
Features:
|
|
||||||
|
|
||||||
* Disable Django collectstatic with `$DISABLE_COLLECTSTATIC` + [user_env_compile](http://devcenter.heroku.com/articles/labs-user-env-compile).
|
|
||||||
|
|
||||||
Bugfixes:
|
|
||||||
|
|
||||||
* Don't disbable injection for new Django apps.
|
|
||||||
* Inform user of July 1, 2012 deprecation of Django injection.
|
|
||||||
|
|
||||||
## v7
|
|
||||||
|
|
||||||
Features:
|
|
||||||
|
|
||||||
* Full removal of Django setting injection for new apps.
|
|
||||||
* Automatic execution of collectstatic.
|
|
||||||
* Suppress collectstatic errors via env SILENCE_COLLECTSTATIC.
|
|
||||||
* Increase settings.py search depth to 3.
|
|
||||||
* Search recursively from included requirements.txt files.
|
|
||||||
|
|
||||||
|
|
||||||
## v6 (03/23/2012)
|
|
||||||
|
|
||||||
Features:
|
|
||||||
|
|
||||||
* Dist packages (setup.py) support.
|
|
||||||
* Move new virtualenvs to `/app/.heroku/venv`.
|
|
||||||
* Heavily improved Django app detection, accounting for `Django` in `requirements.txt`.
|
|
||||||
* Literate [documentation](http://python-buildpack.herokuapp.com).
|
|
||||||
* Default `$PYTHONHOME`, `$PYTHONPATH`, and `$LANG` configurations.
|
|
||||||
* Disable Django setting injection with `$DISABLE_INJECTION` + [user_env_compile](http://devcenter.heroku.com/articles/labs-user-env-compile).
|
|
||||||
* General code refactor and improved messaging.
|
|
||||||
* Unit tests.
|
|
||||||
|
|
||||||
Bugfixes:
|
|
||||||
|
|
||||||
* Django 1.4 startproject template layout support.
|
|
||||||
* Django `manage.py` location can now be independent from `settings.py`.
|
|
||||||
|
|
||||||
## 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.
|
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
FROM heroku/heroku:16-build
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
ENV WORKSPACE_DIR=/app/builds
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y python-pip
|
||||||
|
|
||||||
|
# Install bob-builder application
|
||||||
|
RUN pip install bob-builder==0.0.5
|
||||||
|
|
||||||
|
COPY . /app
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
MIT License:
|
MIT License:
|
||||||
|
|
||||||
Copyright (C) 2013 Heroku, Inc.
|
Copyright (C) 2016 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:
|
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:
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,14 @@
|
|||||||
# These targets are not files
|
# These targets are not files
|
||||||
.PHONY: tests
|
.PHONY: tests
|
||||||
|
|
||||||
tests:
|
test: test-cedar-14
|
||||||
./bin/test
|
|
||||||
|
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 ""
|
||||||
|
|
||||||
|
tools:
|
||||||
|
git clone https://github.com/kennethreitz/pip-pop.git
|
||||||
|
mv pip-pop/bin/* vendor/pip-pop/
|
||||||
|
rm -fr pip-pop
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|

|
||||||
|
|
||||||
|
# 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 [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.
|
||||||
|
|
||||||
|
Some Python packages with obscure C dependencies (e.g. scipy) are [not compatible](https://devcenter.heroku.com/articles/python-c-deps).
|
||||||
|
|
||||||
|
See it in Action
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Deploying a Python application couldn't be easier:
|
||||||
|
|
||||||
|
$ ls
|
||||||
|
Procfile requirements.txt web.py
|
||||||
|
|
||||||
|
$ heroku create --buildpack heroku/python
|
||||||
|
|
||||||
|
$ git push heroku master
|
||||||
|
...
|
||||||
|
-----> Python app detected
|
||||||
|
-----> Installing python-2.7.13
|
||||||
|
$ pip install -r requirements.txt
|
||||||
|
Collecting requests (from -r requirements.txt (line 1))
|
||||||
|
Downloading requests-2.12.4-py2.py3-none-any.whl (576KB)
|
||||||
|
Installing collected packages: requests
|
||||||
|
Successfully installed requests-2.12.4
|
||||||
|
|
||||||
|
-----> Discovering process types
|
||||||
|
Procfile declares types -> (none)
|
||||||
|
|
||||||
|
A `requirements.txt` file 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 with a `runtime.txt` file:
|
||||||
|
|
||||||
|
$ cat runtime.txt
|
||||||
|
python-3.6.0
|
||||||
|
|
||||||
|
Runtime options include:
|
||||||
|
|
||||||
|
- `python-2.7.13`
|
||||||
|
- `python-3.6.0`
|
||||||
|
- `pypy-5.6.0` (unsupported, experimental)
|
||||||
|
- `pypy3-5.5.0` (unsupported, experimental)
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
Heroku buildpack: Python
|
|
||||||
========================
|
|
||||||
|
|
||||||
This is a [Heroku buildpack](http://devcenter.heroku.com/articles/buildpacks) for Python apps, powered by [pip](http://www.pip-installer.org/).
|
|
||||||
|
|
||||||
|
|
||||||
Usage
|
|
||||||
-----
|
|
||||||
|
|
||||||
Example usage:
|
|
||||||
|
|
||||||
$ ls
|
|
||||||
Procfile requirements.txt web.py
|
|
||||||
|
|
||||||
$ heroku create --buildpack git://github.com/heroku/heroku-buildpack-python.git
|
|
||||||
|
|
||||||
$ git push heroku master
|
|
||||||
...
|
|
||||||
-----> Python app detected
|
|
||||||
-----> No runtime.txt provided; assuming python-2.7.8.
|
|
||||||
-----> Preparing Python runtime (python-2.7.8)
|
|
||||||
-----> Installing Setuptools (3.6)
|
|
||||||
-----> Installing Pip (1.5.6)
|
|
||||||
-----> Installing dependencies using Pip (1.5.6)
|
|
||||||
Downloading/unpacking requests (from -r requirements.txt (line 1))
|
|
||||||
Installing collected packages: requests
|
|
||||||
Successfully installed requests
|
|
||||||
Cleaning up...
|
|
||||||
-----> Discovering process types
|
|
||||||
Procfile declares types -> (none)
|
|
||||||
|
|
||||||
You can also add it to upcoming builds of an existing application:
|
|
||||||
|
|
||||||
$ heroku config:add BUILDPACK_URL=git://github.com/heroku/heroku-buildpack-python.git
|
|
||||||
|
|
||||||
The buildpack will detect your app as Python if it has the file `requirements.txt` in the root.
|
|
||||||
|
|
||||||
It will use Pip to install your dependencies, vendoring a copy of the Python runtime into your slug.
|
|
||||||
|
|
||||||
Specify a Runtime
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
You can also provide arbitrary releases Python with a `runtime.txt` file.
|
|
||||||
|
|
||||||
$ cat runtime.txt
|
|
||||||
python-3.4.1
|
|
||||||
|
|
||||||
Runtime options include:
|
|
||||||
|
|
||||||
- python-2.7.8
|
|
||||||
- python-3.4.1
|
|
||||||
- pypy-1.9 (experimental)
|
|
||||||
|
|
||||||
Other [unsupported runtimes](https://github.com/heroku/heroku-buildpack-python/tree/master/builds/runtimes) are available as well.
|
|
||||||
+124
-162
@@ -1,5 +1,13 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# 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:
|
# Usage:
|
||||||
#
|
#
|
||||||
# $ bin/compile <build-dir> <cache-dir> <env-path>
|
# $ bin/compile <build-dir> <cache-dir> <env-path>
|
||||||
@@ -7,6 +15,8 @@
|
|||||||
# Fail fast and fail hard.
|
# Fail fast and fail hard.
|
||||||
set -eo pipefail
|
set -eo pipefail
|
||||||
|
|
||||||
|
[ "$BUILDPACK_XTRACE" ] && set -o xtrace
|
||||||
|
|
||||||
# Prepend proper path for virtualenv hackery. This will be deprecated soon.
|
# Prepend proper path for virtualenv hackery. This will be deprecated soon.
|
||||||
export PATH=:/usr/local/bin:$PATH
|
export PATH=:/usr/local/bin:$PATH
|
||||||
|
|
||||||
@@ -17,19 +27,19 @@ BUILD_DIR=$1
|
|||||||
CACHE_DIR=$2
|
CACHE_DIR=$2
|
||||||
ENV_DIR=$3
|
ENV_DIR=$3
|
||||||
|
|
||||||
|
|
||||||
CACHED_DIRS=".heroku"
|
|
||||||
|
|
||||||
# Static configurations for virtualenv caches.
|
# Static configurations for virtualenv caches.
|
||||||
VIRTUALENV_LOC=".heroku/venv"
|
VIRTUALENV_LOC=".heroku/venv"
|
||||||
LEGACY_TRIGGER="lib/python2.7"
|
LEGACY_TRIGGER="lib/python2.7"
|
||||||
PROFILE_PATH="$BUILD_DIR/.profile.d/python.sh"
|
|
||||||
|
|
||||||
DEFAULT_PYTHON_VERSION="python-2.7.8"
|
DEFAULT_PYTHON_VERSION="python-2.7.13"
|
||||||
DEFAULT_PYTHON_STACK="cedar"
|
DEFAULT_PYTHON_STACK="cedar-14"
|
||||||
PYTHON_EXE="/app/.heroku/python/bin/python"
|
PYTHON_EXE="/app/.heroku/python/bin/python"
|
||||||
PIP_VERSION="1.5.6"
|
PIP_VERSION="9.0.1"
|
||||||
SETUPTOOLS_VERSION="5.4.1"
|
SETUPTOOLS_VERSION="32.1.0"
|
||||||
|
|
||||||
|
# Common Problem Warnings
|
||||||
|
export WARNINGS_LOG=$(mktemp)
|
||||||
|
export RECOMMENDED_PYTHON_VERSION=$DEFAULT_PYTHON_VERSION
|
||||||
|
|
||||||
# Setup bpwatch
|
# Setup bpwatch
|
||||||
export PATH=$PATH:$ROOT_DIR/vendor/bpwatch
|
export PATH=$PATH:$ROOT_DIR/vendor/bpwatch
|
||||||
@@ -37,73 +47,72 @@ LOGPLEX_KEY="t.b90d9d29-5388-4908-9737-b4576af1d4ce"
|
|||||||
export BPWATCH_STORE_PATH=$CACHE_DIR/bpwatch.json
|
export BPWATCH_STORE_PATH=$CACHE_DIR/bpwatch.json
|
||||||
BUILDPACK_VERSION=v28
|
BUILDPACK_VERSION=v28
|
||||||
|
|
||||||
|
# Setup pip-pop (pip-diff)
|
||||||
|
export PATH=$PATH:$ROOT_DIR/vendor/pip-pop
|
||||||
|
|
||||||
# Support Anvil Build_IDs
|
# Support Anvil Build_IDs
|
||||||
[ ! "$SLUG_ID" ] && SLUG_ID="defaultslug"
|
[ ! "$SLUG_ID" ] && SLUG_ID="defaultslug"
|
||||||
[ ! "$REQUEST_ID" ] && REQUEST_ID=$SLUG_ID
|
[ ! "$REQUEST_ID" ] && REQUEST_ID=$SLUG_ID
|
||||||
[ ! "$STACK" ] && STACK=$DEFAULT_PYTHON_STACK
|
[ ! "$STACK" ] && STACK=$DEFAULT_PYTHON_STACK
|
||||||
|
|
||||||
# Sanitizing environment variables.
|
# Sanitizing environment variables.
|
||||||
unset GIT_DIR PYTHONHOME PYTHONPATH LD_LIBRARY_PATH LIBRARY_PATH
|
unset GIT_DIR PYTHONHOME PYTHONPATH
|
||||||
|
unset RECEIVE_DATA RUN_KEY BUILD_INFO DEPLOY LOG_TOKEN DYNO
|
||||||
|
unset CYTOKINE_LOG_FILE GEM_PATH
|
||||||
|
|
||||||
|
# Setup buildpack instrumentation.
|
||||||
bpwatch init $LOGPLEX_KEY
|
bpwatch init $LOGPLEX_KEY
|
||||||
bpwatch build python $BUILDPACK_VERSION $REQUEST_ID
|
bpwatch build python $BUILDPACK_VERSION $REQUEST_ID
|
||||||
TMP_APP_DIR=$CACHE_DIR/tmp_app_dir
|
|
||||||
|
|
||||||
bpwatch start compile
|
bpwatch start compile
|
||||||
|
|
||||||
|
|
||||||
# We'll need to send these statics to other scripts we `source`.
|
|
||||||
export BUILD_DIR CACHE_DIR BIN_DIR PROFILE_PATH
|
|
||||||
|
|
||||||
# Syntax sugar.
|
# Syntax sugar.
|
||||||
source $BIN_DIR/utils
|
source $BIN_DIR/utils
|
||||||
|
|
||||||
# Directory Hacks for path consistiency.
|
# Import collection of warnings.
|
||||||
APP_DIR='/app'
|
source $BIN_DIR/warnings
|
||||||
TMP_APP_DIR=$CACHE_DIR/tmp_app_dir
|
|
||||||
|
|
||||||
# Copy Anvil app dir to temporary storage...
|
# we need to put a bunch of symlinks in there later
|
||||||
bpwatch start anvil_appdir_stage
|
mkdir -p /app/.heroku
|
||||||
if [ "$SLUG_ID" ]; then
|
|
||||||
mkdir -p $TMP_APP_DIR
|
|
||||||
deep-mv $APP_DIR $TMP_APP_DIR
|
|
||||||
else
|
|
||||||
deep-rm $APP_DIR
|
|
||||||
fi
|
|
||||||
bpwatch stop anvil_appdir_stage
|
|
||||||
|
|
||||||
# Copy Application code in.
|
# Set up outputs under new context
|
||||||
bpwatch start appdir_stage
|
PROFILE_PATH="$BUILD_DIR/.profile.d/python.sh"
|
||||||
deep-mv $BUILD_DIR $APP_DIR
|
EXPORT_PATH="$BIN_DIR/../export"
|
||||||
bpwatch stop appdir_stage
|
GUNICORN_PROFILE_PATH="$BUILD_DIR/.profile.d/python.gunicorn.sh"
|
||||||
|
|
||||||
# Set new context.
|
# We'll need to send these statics to other scripts we `source`.
|
||||||
ORIG_BUILD_DIR=$BUILD_DIR
|
export BUILD_DIR CACHE_DIR BIN_DIR PROFILE_PATH EXPORT_PATH
|
||||||
BUILD_DIR=$APP_DIR
|
|
||||||
|
|
||||||
# Prepend proper path buildpack use.
|
# Prepend proper environment variables for Python use.
|
||||||
export PATH=$BUILD_DIR/.heroku/python/bin:$BUILD_DIR/.heroku/vendor/bin:$PATH
|
export PATH=/app/.heroku/python/bin:/app/.heroku/vendor/bin:$PATH
|
||||||
export PYTHONUNBUFFERED=1
|
export PYTHONUNBUFFERED=1
|
||||||
export LANG=en_US.UTF-8
|
export LANG=en_US.UTF-8
|
||||||
export C_INCLUDE_PATH=/app/.heroku/vendor/include:$BUILD_DIR/.heroku/vendor/include:/app/.heroku/python/include
|
export C_INCLUDE_PATH=/app/.heroku/vendor/include:/app/.heroku/python/include:$C_INCLUDE_PATH
|
||||||
export CPLUS_INCLUDE_PATH=/app/.heroku/vendor/include:$BUILD_DIR/.heroku/vendor/include:/app/.heroku/python/include
|
export CPLUS_INCLUDE_PATH=/app/.heroku/vendor/include:/app/.heroku/python/include:$CPLUS_INCLUDE_PATH
|
||||||
export LIBRARY_PATH=/app/.heroku/vendor/lib:$BUILD_DIR/.heroku/vendor/lib:/app/.heroku/python/lib
|
export LIBRARY_PATH=/app/.heroku/vendor/lib:/app/.heroku/python/lib:$LIBRARY_PATH
|
||||||
export LD_LIBRARY_PATH=/app/.heroku/vendor/lib:$BUILD_DIR/.heroku/vendor/lib:/app/.heroku/python/lib
|
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:$BUILD_DIR/.heroku/vendor/lib/pkg-config:/app/.heroku/python/lib/pkg-config
|
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.
|
# Switch to the repo's context.
|
||||||
cd $BUILD_DIR
|
cd $BUILD_DIR
|
||||||
|
|
||||||
|
# Warn for lack of Procfile.
|
||||||
|
if [[ ! -f Procfile ]]; then
|
||||||
|
puts-warn 'Warning: Your application is missing a Procfile. This file tells Heroku how to run your application.'
|
||||||
|
puts-warn 'Learn more: https://devcenter.heroku.com/articles/procfile'
|
||||||
|
fi
|
||||||
|
|
||||||
# Experimental pre_compile hook.
|
# Experimental pre_compile hook.
|
||||||
bpwatch start pre_compile
|
bpwatch start pre_compile
|
||||||
source $BIN_DIR/steps/hooks/pre_compile
|
source $BIN_DIR/steps/hooks/pre_compile
|
||||||
bpwatch stop pre_compile
|
bpwatch stop pre_compile
|
||||||
|
|
||||||
# If no requirements given, assume `setup.py develop`.
|
# If no requirements.txt file given, assume `setup.py develop` is intended.
|
||||||
if [ ! -f requirements.txt ]; then
|
if [ ! -f requirements.txt ]; then
|
||||||
echo "-e ." > requirements.txt
|
echo "-e ." > requirements.txt
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
# Sticky runtimes.
|
# Sticky runtimes.
|
||||||
if [ -f $CACHE_DIR/.heroku/python-version ]; then
|
if [ -f $CACHE_DIR/.heroku/python-version ]; then
|
||||||
DEFAULT_PYTHON_VERSION=$(cat $CACHE_DIR/.heroku/python-version)
|
DEFAULT_PYTHON_VERSION=$(cat $CACHE_DIR/.heroku/python-version)
|
||||||
@@ -113,7 +122,7 @@ fi
|
|||||||
if [ -f $CACHE_DIR/.heroku/python-stack ]; then
|
if [ -f $CACHE_DIR/.heroku/python-stack ]; then
|
||||||
CACHED_PYTHON_STACK=$(cat $CACHE_DIR/.heroku/python-stack)
|
CACHED_PYTHON_STACK=$(cat $CACHE_DIR/.heroku/python-stack)
|
||||||
else
|
else
|
||||||
CACHED_PYTHON_STACK=$DEFAULT_PYTHON_STACK
|
CACHED_PYTHON_STACK=$STACK
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# If no runtime given, assume default version.
|
# If no runtime given, assume default version.
|
||||||
@@ -121,7 +130,7 @@ if [ ! -f runtime.txt ]; then
|
|||||||
echo $DEFAULT_PYTHON_VERSION > runtime.txt
|
echo $DEFAULT_PYTHON_VERSION > runtime.txt
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ### The Cache
|
# Prepare the cache.
|
||||||
mkdir -p $CACHE_DIR
|
mkdir -p $CACHE_DIR
|
||||||
|
|
||||||
# Purge "old-style" virtualenvs.
|
# Purge "old-style" virtualenvs.
|
||||||
@@ -132,164 +141,117 @@ bpwatch stop clear_old_venvs
|
|||||||
|
|
||||||
# Restore old artifacts from the cache.
|
# Restore old artifacts from the cache.
|
||||||
bpwatch start restore_cache
|
bpwatch start restore_cache
|
||||||
for dir in $CACHED_DIRS; do
|
mkdir -p .heroku
|
||||||
cp -R $CACHE_DIR/$dir . &> /dev/null || true
|
|
||||||
done
|
|
||||||
bpwatch stop restore_cache
|
|
||||||
|
|
||||||
set +e
|
cp -R $CACHE_DIR/.heroku/python .heroku/ &> /dev/null || true
|
||||||
# Create set-aside `.heroku` folder.
|
cp -R $CACHE_DIR/.heroku/python-stack .heroku/ &> /dev/null || true
|
||||||
mkdir .heroku &> /dev/null
|
cp -R $CACHE_DIR/.heroku/python-version .heroku/ &> /dev/null || true
|
||||||
set -e
|
cp -R $CACHE_DIR/.heroku/vendor .heroku/ &> /dev/null || true
|
||||||
|
cp -R $CACHE_DIR/.heroku/venv .heroku/ &> /dev/null || true
|
||||||
mkdir -p $(dirname $PROFILE_PATH)
|
if [[ -d $CACHE_DIR/.heroku/src ]]; then
|
||||||
|
cp -R $CACHE_DIR/.heroku/src .heroku/ &> /dev/null || true
|
||||||
set +e
|
|
||||||
PYTHON_VERSION=$(cat runtime.txt)
|
|
||||||
|
|
||||||
# Install Python.
|
|
||||||
if [ -f .heroku/python-version ]; then
|
|
||||||
if [ ! $(cat .heroku/python-version) = $PYTHON_VERSION ]; then
|
|
||||||
bpwatch start uninstall_python
|
|
||||||
puts-step "Found runtime $(cat .heroku/python-version), removing"
|
|
||||||
rm -fr .heroku/python
|
|
||||||
bpwatch stop uninstall_python
|
|
||||||
else
|
|
||||||
SKIP_INSTALL=1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! $STACK = $CACHED_PYTHON_STACK ]; then
|
|
||||||
bpwatch start uninstall_python
|
|
||||||
puts-step "Stack changed, re-installing runtime"
|
|
||||||
rm -fr .heroku/python
|
|
||||||
unset SKIP_INSTALL
|
|
||||||
bpwatch stop uninstall_python
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if [ ! "$SKIP_INSTALL" ]; then
|
|
||||||
bpwatch start install_python
|
|
||||||
puts-step "Installing runtime ($PYTHON_VERSION)"
|
|
||||||
|
|
||||||
# Prepare destination directory.
|
|
||||||
mkdir -p .heroku/python
|
|
||||||
|
|
||||||
curl http://lang-python.s3.amazonaws.com/$STACK/runtimes/$PYTHON_VERSION.tar.gz -s | tar zxv -C .heroku/python &> /dev/null
|
|
||||||
if [[ $? != 0 ]] ; 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
|
fi
|
||||||
|
|
||||||
bpwatch stop install_python
|
bpwatch stop restore_cache
|
||||||
|
|
||||||
# Record for future reference.
|
mkdir -p $(dirname $PROFILE_PATH)
|
||||||
echo $PYTHON_VERSION > .heroku/python-version
|
mkdir -p /app/.heroku/src
|
||||||
echo $STACK > .heroku/python-stack
|
|
||||||
FRESH_PYTHON=true
|
|
||||||
|
|
||||||
hash -r
|
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
|
||||||
|
ln -nsf $BUILD_DIR/.heroku/venv /app/.heroku/venv
|
||||||
|
# Note: .heroku/src is copied in later.
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# If Pip isn't up to date:
|
# Install Python.
|
||||||
if [ "$FRESH_PYTHON" ] || [[ ! $(pip --version) == *$PIP_VERSION* ]]; then
|
source $BIN_DIR/steps/python
|
||||||
WORKING_DIR=$(pwd)
|
|
||||||
|
|
||||||
bpwatch start prepare_environment
|
# Sanity check for setuptools/distribute.
|
||||||
|
source $BIN_DIR/steps/setuptools
|
||||||
|
|
||||||
bpwatch start install_setuptools
|
# Uninstall removed dependencies with Pip.
|
||||||
# Prepare it for the real world
|
source $BIN_DIR/steps/pip-uninstall
|
||||||
# puts-step "Installing Setuptools ($SETUPTOOLS_VERSION)"
|
|
||||||
cd $ROOT_DIR/vendor/
|
|
||||||
tar zxf setuptools-$SETUPTOOLS_VERSION.tar.gz
|
|
||||||
cd $ROOT_DIR/vendor/setuptools-$SETUPTOOLS_VERSION/
|
|
||||||
python setup.py install &> /dev/null
|
|
||||||
cd $WORKING_DIR
|
|
||||||
bpwatch stop install_setuptoools
|
|
||||||
|
|
||||||
bpwatch start install_pip
|
# Mercurial support.
|
||||||
# puts-step "Installing Pip ($PIP_VERSION)"
|
source $BIN_DIR/steps/mercurial
|
||||||
|
|
||||||
cd $ROOT_DIR/vendor/
|
|
||||||
tar zxf pip-$PIP_VERSION.tar.gz
|
|
||||||
cd $ROOT_DIR/vendor/pip-$PIP_VERSION/
|
|
||||||
python setup.py install &> /dev/null
|
|
||||||
cd $WORKING_DIR
|
|
||||||
|
|
||||||
bpwatch stop install_pip
|
|
||||||
bpwatch stop prepare_environment
|
|
||||||
fi
|
|
||||||
|
|
||||||
set -e
|
|
||||||
hash -r
|
|
||||||
|
|
||||||
# Pylibmc support.
|
# Pylibmc support.
|
||||||
# See [`bin/steps/pylibmc`](pylibmc.html).
|
source $BIN_DIR/steps/pylibmc
|
||||||
bpwatch start pylibmc_install
|
|
||||||
source $BIN_DIR/steps/pylibmc
|
|
||||||
bpwatch stop pylibmc_install
|
|
||||||
|
|
||||||
# Install Mercurial if it appears to be required.
|
# Libffi support.
|
||||||
if (grep -Fiq "hg+" requirements.txt) then
|
source $BIN_DIR/steps/cryptography
|
||||||
bpwatch start mercurial_install
|
|
||||||
/app/.heroku/python/bin/pip install mercurial | cleanup | indent
|
|
||||||
bpwatch stop mercurial_install
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Install dependencies with Pip.
|
# Support for Geo libraries.
|
||||||
puts-step "Installing dependencies with pip"
|
sub-env $BIN_DIR/steps/geo-libs
|
||||||
|
|
||||||
|
# GDAL support.
|
||||||
|
source $BIN_DIR/steps/gdal
|
||||||
|
|
||||||
[ ! "$FRESH_PYTHON" ] && bpwatch start pip_install
|
# Install dependencies with Pip (where the magic happens).
|
||||||
[ "$FRESH_PYTHON" ] && bpwatch start pip_install_first
|
source $BIN_DIR/steps/pip-install
|
||||||
|
|
||||||
/app/.heroku/python/bin/pip install -r requirements.txt --exists-action=w --src=./.heroku/src --allow-all-external | cleanup | indent
|
# Support for NLTK corpora.
|
||||||
|
sub-env $BIN_DIR/steps/nltk
|
||||||
|
|
||||||
[ ! "$FRESH_PYTHON" ] && bpwatch stop pip_install
|
# Support for pip install -e.
|
||||||
[ "$FRESH_PYTHON" ] && bpwatch stop pip_install_first
|
rm -fr $BUILD_DIR/.heroku/src
|
||||||
|
deep-cp /app/.heroku/src $BUILD_DIR/.heroku/src
|
||||||
|
|
||||||
# Django collectstatic support.
|
# Django collectstatic support.
|
||||||
bpwatch start collectstatic
|
sub-env $BIN_DIR/steps/collectstatic
|
||||||
sub-env $BIN_DIR/steps/collectstatic
|
|
||||||
bpwatch stop collectstatic
|
|
||||||
|
|
||||||
# ### Finalize
|
# Create .profile script for application runtime environment variables.
|
||||||
#
|
|
||||||
|
|
||||||
# Set context environment variables.
|
|
||||||
set-env PATH '$HOME/.heroku/python/bin:$PATH'
|
set-env PATH '$HOME/.heroku/python/bin:$PATH'
|
||||||
set-env PYTHONUNBUFFERED true
|
set-env PYTHONUNBUFFERED true
|
||||||
set-env PYTHONHOME /app/.heroku/python
|
set-env PYTHONHOME /app/.heroku/python
|
||||||
set-env LIBRARY_PATH /app/.heroku/vendor/lib:/app/.heroku/python/lib
|
set-env LIBRARY_PATH '/app/.heroku/vendor/lib:/app/.heroku/python/lib:$LIBRARY_PATH'
|
||||||
set-env LD_LIBRARY_PATH '/app/.heroku/vendor/lib:/app/.heroku/python/lib:$LD_LIBRARY_PATH'
|
set-env LD_LIBRARY_PATH '/app/.heroku/vendor/lib:/app/.heroku/python/lib:$LD_LIBRARY_PATH'
|
||||||
set-default-env LANG en_US.UTF-8
|
set-default-env LANG en_US.UTF-8
|
||||||
set-default-env PYTHONHASHSEED random
|
set-default-env PYTHONHASHSEED random
|
||||||
set-default-env PYTHONPATH /app/
|
set-default-env PYTHONPATH /app/
|
||||||
|
|
||||||
|
# Install sane-default script for $WEB_CONCURRENCY and $FORWARDED_ALLOW_IPS.
|
||||||
|
cp $ROOT_DIR/vendor/python.gunicorn.sh $GUNICORN_PROFILE_PATH
|
||||||
|
|
||||||
# Experimental post_compile hook.
|
# Experimental post_compile hook.
|
||||||
bpwatch start post_compile
|
bpwatch start post_compile
|
||||||
source $BIN_DIR/steps/hooks/post_compile
|
source $BIN_DIR/steps/hooks/post_compile
|
||||||
bpwatch stop post_compile
|
bpwatch stop post_compile
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
# Store new artifacts in cache.
|
# Store new artifacts in cache.
|
||||||
bpwatch start dump_cache
|
bpwatch start dump_cache
|
||||||
for dir in $CACHED_DIRS; do
|
|
||||||
rm -rf $CACHE_DIR/$dir
|
|
||||||
cp -R $dir $CACHE_DIR/
|
|
||||||
done
|
|
||||||
bpwatch stop dump_cache
|
|
||||||
|
|
||||||
# ### Fin.
|
rm -rf $CACHE_DIR/.heroku/python
|
||||||
bpwatch start appdir_commit
|
rm -rf $CACHE_DIR/.heroku/python-version
|
||||||
deep-mv $BUILD_DIR $ORIG_BUILD_DIR
|
rm -rf $CACHE_DIR/.heroku/python-stack
|
||||||
bpwatch stop appdir_commit
|
rm -rf $CACHE_DIR/.heroku/vendor
|
||||||
|
rm -rf $CACHE_DIR/.heroku/venv
|
||||||
|
rm -rf $CACHE_DIR/.heroku/src
|
||||||
|
|
||||||
bpwatch start anvil_appdir_commit
|
mkdir -p $CACHE_DIR/.heroku
|
||||||
if [ "$SLUG_ID" ]; then
|
cp -R .heroku/python $CACHE_DIR/.heroku/
|
||||||
deep-mv $TMP_APP_DIR $APP_DIR
|
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
|
||||||
|
cp -R .heroku/venv $CACHE_DIR/.heroku/ &> /dev/null || true
|
||||||
|
if [[ -d .heroku/src ]]; then
|
||||||
|
cp -R .heroku/src $CACHE_DIR/.heroku/ &> /dev/null || true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
bpwatch stop anvil_appdir_commit
|
bpwatch stop dump_cache
|
||||||
|
|
||||||
|
# Fin.
|
||||||
bpwatch stop compile
|
bpwatch stop compile
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@
|
|||||||
# [**Python Buildpack**](https://github.com/heroku/heroku-buildpack-python)
|
# [**Python Buildpack**](https://github.com/heroku/heroku-buildpack-python)
|
||||||
# detector.
|
# detector.
|
||||||
#
|
#
|
||||||
# A [buildpack](http://devcenter.heroku.com/articles/buildpacks) is an
|
# A [buildpack](https://devcenter.heroku.com/articles/buildpacks) is an
|
||||||
# adapter between a Python application and Heroku's runtime.
|
# adapter between a Python application and Heroku's runtime.
|
||||||
|
|
||||||
# ## Usage
|
# ## Usage
|
||||||
|
|||||||
+1
-1
@@ -18,6 +18,6 @@ if [[ $MANAGE_FILE ]]; then
|
|||||||
cat <<EOF
|
cat <<EOF
|
||||||
|
|
||||||
addons:
|
addons:
|
||||||
heroku-postgresql:hobby-dev
|
- heroku-postgresql
|
||||||
EOF
|
EOF
|
||||||
fi
|
fi
|
||||||
|
|||||||
+50
-19
@@ -1,36 +1,67 @@
|
|||||||
#!/usr/bin/env bash
|
#!/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.
|
||||||
|
|
||||||
source $BIN_DIR/utils
|
source $BIN_DIR/utils
|
||||||
|
|
||||||
MANAGE_FILE=$(find . -maxdepth 3 -type f -name 'manage.py' | head -1)
|
# 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}
|
MANAGE_FILE=${MANAGE_FILE:-fakepath}
|
||||||
|
|
||||||
|
# Legacy file-based support for $DISABLE_COLLECTSTATIC
|
||||||
[ -f .heroku/collectstatic_disabled ] && DISABLE_COLLECTSTATIC=1
|
[ -f .heroku/collectstatic_disabled ] && DISABLE_COLLECTSTATIC=1
|
||||||
|
|
||||||
if [ ! "$DISABLE_COLLECTSTATIC" ] && [ -f "$MANAGE_FILE" ]; then
|
# Ensure that Django is explicitly specified in requirements.txt
|
||||||
|
pip-grep -s requirements.txt django Django && DJANGO_INSTALLED=1
|
||||||
|
|
||||||
|
bpwatch start collectstatic # metrics collection
|
||||||
|
|
||||||
|
if [ ! "$DISABLE_COLLECTSTATIC" ] && [ -f "$MANAGE_FILE" ] && [ "$DJANGO_INSTALLED" ]; then
|
||||||
set +e
|
set +e
|
||||||
|
|
||||||
echo "-----> Preparing static assets"
|
puts-cmd "python $MANAGE_FILE collectstatic --noinput"
|
||||||
# Check if collectstatic is configured properly.
|
|
||||||
python $MANAGE_FILE collectstatic --dry-run --noinput &> /dev/null && RUN_COLLECTSTATIC=true
|
|
||||||
|
|
||||||
# Compile assets if collectstatic appears to be kosher.
|
# Run collectstatic, cleanup some of the noisy output.
|
||||||
if [ "$RUN_COLLECTSTATIC" ]; then
|
python $MANAGE_FILE collectstatic --noinput --traceback 2>&1 | sed '/^Post-processed/d;/^Copying/d;/^$/d' | indent
|
||||||
|
COLLECTSTATIC_STATUS="${PIPESTATUS[0]}"
|
||||||
|
|
||||||
echo " Running collectstatic..."
|
set -e
|
||||||
python $MANAGE_FILE collectstatic --noinput 2>&1 | sed '/^Copying/d;/^$/d;/^ /d' | indent
|
|
||||||
|
|
||||||
[ $? -ne 0 ] && {
|
# Display a warning if collectstatic failed.
|
||||||
echo " ! Error running 'manage.py collectstatic'. More info:"
|
[ $COLLECTSTATIC_STATUS -ne 0 ] && {
|
||||||
echo " http://devcenter.heroku.com/articles/django-assets"
|
|
||||||
}
|
echo
|
||||||
else
|
echo " ! Error while running '$ python $MANAGE_FILE collectstatic --noinput'."
|
||||||
echo " Collectstatic configuration error. To debug, run:"
|
echo " See traceback above for details."
|
||||||
echo " $ heroku run python $MANAGE_FILE collectstatic --noinput"
|
echo
|
||||||
fi
|
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
|
echo
|
||||||
|
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
bpwatch stop collectstatic # metrics collection
|
||||||
|
|||||||
Executable
+35
@@ -0,0 +1,35 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# This script serves as the Cryptography 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 libffi binary.
|
||||||
|
VENDORED_LIBFFI="https://lang-python.s3.amazonaws.com/$STACK/libraries/vendor/libffi.tar.gz"
|
||||||
|
|
||||||
|
PKG_CONFIG_PATH="/app/.heroku/vendor/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||||
|
|
||||||
|
# Syntax sugar.
|
||||||
|
source $BIN_DIR/utils
|
||||||
|
|
||||||
|
bpwatch start libffi_install
|
||||||
|
|
||||||
|
# If a package using cffi exists within requirements, use vendored libffi.
|
||||||
|
if (pip-grep -s requirements.txt argon2-cffi bcrypt cffi cryptography django[argon2] Django[argon2] django[bcrypt] Django[bcrypt] PyNaCl pyOpenSSL PyOpenSSL requests[security] misaka &> /dev/null) then
|
||||||
|
|
||||||
|
if [ ! -d ".heroku/vendor/lib/libffi-3.1" ]; then
|
||||||
|
echo "-----> Noticed cffi. Bootstrapping libffi."
|
||||||
|
mkdir -p .heroku/vendor
|
||||||
|
# Download and extract libffi into target vendor directory.
|
||||||
|
curl $VENDORED_LIBFFI -s | tar zxv -C .heroku/vendor &> /dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
export LIBFFI=$(pwd)/vendor
|
||||||
|
fi
|
||||||
|
|
||||||
|
bpwatch stop libffi_install
|
||||||
Executable
+35
@@ -0,0 +1,35 @@
|
|||||||
|
#!/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="https://lang-python.s3.amazonaws.com/$STACK/libraries/vendor/gdal.tar.gz"
|
||||||
|
|
||||||
|
PKG_CONFIG_PATH="/app/.heroku/vendor/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||||
|
|
||||||
|
# Syntax sugar.
|
||||||
|
source $BIN_DIR/utils
|
||||||
|
|
||||||
|
bpwatch start gdal_install
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
export GDAL=$(pwd)/vendor
|
||||||
|
fi
|
||||||
|
|
||||||
|
bpwatch stop gdal_install
|
||||||
Executable
+39
@@ -0,0 +1,39 @@
|
|||||||
|
#!/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="https://lang-python.s3.amazonaws.com/$STACK/libraries/vendor/gdal.tar.gz"
|
||||||
|
VENDORED_GEOS="https://lang-python.s3.amazonaws.com/$STACK/libraries/vendor/geos.tar.gz"
|
||||||
|
VENDORED_PROJ="https://lang-python.s3.amazonaws.com/$STACK/libraries/vendor/proj.tar.gz"
|
||||||
|
|
||||||
|
PKG_CONFIG_PATH="/app/.heroku/vendor/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||||
|
|
||||||
|
# Syntax sugar.
|
||||||
|
source $BIN_DIR/utils
|
||||||
|
|
||||||
|
bpwatch start geo_libs_install
|
||||||
|
|
||||||
|
# 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
|
||||||
|
fi
|
||||||
|
|
||||||
|
export GDAL=$(pwd)/vendor
|
||||||
|
fi
|
||||||
|
|
||||||
|
bpwatch stop geo_libs_install
|
||||||
Executable
+6
@@ -0,0 +1,6 @@
|
|||||||
|
# Install Mercurial if it appears to be required.
|
||||||
|
if (grep -Fiq "hg+" requirements.txt) then
|
||||||
|
bpwatch start mercurial_install
|
||||||
|
/app/.heroku/python/bin/pip install mercurial | cleanup | indent
|
||||||
|
bpwatch stop mercurial_install
|
||||||
|
fi
|
||||||
Executable
+33
@@ -0,0 +1,33 @@
|
|||||||
|
#!/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.
|
||||||
|
source $BIN_DIR/utils
|
||||||
|
|
||||||
|
bpwatch start nltk_download
|
||||||
|
|
||||||
|
# Check that nltk was installed by pip, otherwise obviously not needed
|
||||||
|
python -m nltk.downloader -h >/dev/null 2>&1
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
puts-step "Downloading NLTK corpora..."
|
||||||
|
nltk_packages_definition="$BUILD_DIR/nltk.txt"
|
||||||
|
if [ -f "$nltk_packages_definition" ]; then
|
||||||
|
nltk_packages=$(tr "\n" " " < "$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"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
bpwatch stop nltk_download
|
||||||
Executable
+38
@@ -0,0 +1,38 @@
|
|||||||
|
# Install dependencies with Pip.
|
||||||
|
puts-cmd "pip install -r requirements.txt"
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
[ ! "$FRESH_PYTHON" ] && bpwatch start pip_install
|
||||||
|
[ "$FRESH_PYTHON" ] && bpwatch start pip_install_first
|
||||||
|
|
||||||
|
set +e
|
||||||
|
/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
|
||||||
|
|
||||||
|
[ ! "$FRESH_PYTHON" ] && bpwatch stop pip_install
|
||||||
|
[ "$FRESH_PYTHON" ] && bpwatch stop pip_install_first
|
||||||
|
|
||||||
|
echo
|
||||||
Executable
+18
@@ -0,0 +1,18 @@
|
|||||||
|
set +e
|
||||||
|
# Install dependencies with Pip.
|
||||||
|
bpwatch start pip_uninstall
|
||||||
|
if [[ -f .heroku/python/requirements-declared.txt ]]; then
|
||||||
|
|
||||||
|
cp .heroku/python/requirements-declared.txt requirements-declared.txt
|
||||||
|
|
||||||
|
pip-diff --stale requirements-declared.txt requirements.txt --exclude setuptools pip wheel > .heroku/python/requirements-stale.txt
|
||||||
|
|
||||||
|
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
|
||||||
|
bpwatch stop pip_uninstall
|
||||||
|
set -e
|
||||||
+12
-16
@@ -4,35 +4,31 @@
|
|||||||
# [**Python Buildpack**](https://github.com/heroku/heroku-buildpack-python)
|
# [**Python Buildpack**](https://github.com/heroku/heroku-buildpack-python)
|
||||||
# compiler.
|
# compiler.
|
||||||
#
|
#
|
||||||
# A [buildpack](http://devcenter.heroku.com/articles/buildpacks) is an
|
# A [buildpack](https://devcenter.heroku.com/articles/buildpacks) is an
|
||||||
# adapter between a Python application and Heroku's runtime.
|
# adapter between a Python application and Heroku's runtime.
|
||||||
#
|
#
|
||||||
# This script is invoked by [`bin/compile`](/).
|
# This script is invoked by [`bin/compile`](/).
|
||||||
|
|
||||||
# The location of the pre-compiled libmemcached binary.
|
# The location of the pre-compiled libmemcached binary.
|
||||||
VENDORED_MEMCACHED="http://cl.ly/0a191R3K160t1w1P0N25/vendor-libmemcached.tar.gz"
|
VENDORED_MEMCACHED="https://lang-python.s3.amazonaws.com/$STACK/libraries/vendor/libmemcache.tar.gz"
|
||||||
|
|
||||||
# Syntax sugar.
|
# Syntax sugar.
|
||||||
source $BIN_DIR/utils
|
source $BIN_DIR/utils
|
||||||
|
|
||||||
# If pylibmc exists within requirements, use vendored libmemcached.
|
|
||||||
if (grep -Eiq "\s*pylibmc" requirements.txt) then
|
|
||||||
echo "-----> Noticed pylibmc. Bootstrapping libmemcached."
|
|
||||||
cd .heroku
|
|
||||||
|
|
||||||
if [ -d "vendor/lib/sasl2" ]; then
|
bpwatch start pylibmc_install
|
||||||
export LIBMEMCACHED=$(pwd)/vendor
|
|
||||||
else
|
# 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.
|
# Download and extract libmemcached into target vendor directory.
|
||||||
curl -s -L -o tmp-libmemcached.tar.gz $VENDORED_MEMCACHED
|
curl $VENDORED_MEMCACHED -s | tar zxv -C .heroku/vendor &> /dev/null
|
||||||
tar -zxvf tmp-libmemcached.tar.gz > /dev/null
|
|
||||||
rm tmp-libmemcached.tar.gz
|
|
||||||
export LIBMEMCACHED=$(pwd)/vendor
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
export LIBMEMCACHED=$(pwd)/vendor
|
export LIBMEMCACHED=$(pwd)/vendor
|
||||||
cd ..
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
bpwatch stop pylibmc_install
|
||||||
|
|
||||||
|
|||||||
Executable
+78
@@ -0,0 +1,78 @@
|
|||||||
|
set +e
|
||||||
|
PYTHON_VERSION=$(cat runtime.txt)
|
||||||
|
|
||||||
|
# Install Python.
|
||||||
|
if [ -f .heroku/python-version ]; then
|
||||||
|
if [ ! $(cat .heroku/python-version) = $PYTHON_VERSION ]; then
|
||||||
|
bpwatch start uninstall_python
|
||||||
|
puts-step "Found $(cat .heroku/python-version), removing"
|
||||||
|
rm -fr .heroku/python
|
||||||
|
bpwatch stop uninstall_python
|
||||||
|
else
|
||||||
|
SKIP_INSTALL=1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! $STACK = $CACHED_PYTHON_STACK ]; then
|
||||||
|
bpwatch start uninstall_python
|
||||||
|
rm -fr .heroku/python .heroku/python-stack .heroku/vendor
|
||||||
|
unset SKIP_INSTALL
|
||||||
|
bpwatch stop uninstall_python
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ ! "$SKIP_INSTALL" ]; then
|
||||||
|
bpwatch start install_python
|
||||||
|
puts-step "Installing $PYTHON_VERSION"
|
||||||
|
|
||||||
|
# Prepare destination directory.
|
||||||
|
mkdir -p .heroku/python
|
||||||
|
|
||||||
|
curl https://lang-python.s3.amazonaws.com/$STACK/runtimes/$PYTHON_VERSION.tar.gz -s | tar zxv -C .heroku/python &> /dev/null
|
||||||
|
if [[ $? != 0 ]] ; 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
|
||||||
|
|
||||||
|
bpwatch stop install_python
|
||||||
|
|
||||||
|
# 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_VERSION* ]]; then
|
||||||
|
WORKING_DIR=$(pwd)
|
||||||
|
|
||||||
|
bpwatch start prepare_environment
|
||||||
|
|
||||||
|
TMPTARDIR=$(mktemp -d)
|
||||||
|
trap "rm -rf $TMPTARDIR" RETURN
|
||||||
|
|
||||||
|
bpwatch start install_setuptools
|
||||||
|
# Prepare it for the real world
|
||||||
|
# puts-step "Installing Setuptools ($SETUPTOOLS_VERSION)"
|
||||||
|
tar zxf $ROOT_DIR/vendor/setuptools-$SETUPTOOLS_VERSION.tar.gz -C $TMPTARDIR
|
||||||
|
cd $TMPTARDIR/setuptools-$SETUPTOOLS_VERSION/
|
||||||
|
python setup.py install &> /dev/null
|
||||||
|
cd $WORKING_DIR
|
||||||
|
bpwatch stop install_setuptoools
|
||||||
|
|
||||||
|
bpwatch start install_pip
|
||||||
|
# puts-step "Installing Pip ($PIP_VERSION)"
|
||||||
|
tar zxf $ROOT_DIR/vendor/pip-$PIP_VERSION.tar.gz -C $TMPTARDIR
|
||||||
|
cd $TMPTARDIR/pip-$PIP_VERSION/
|
||||||
|
python setup.py install &> /dev/null
|
||||||
|
cd $WORKING_DIR
|
||||||
|
|
||||||
|
bpwatch stop install_pip
|
||||||
|
bpwatch stop prepare_environment
|
||||||
|
fi
|
||||||
|
|
||||||
|
set -e
|
||||||
|
hash -r
|
||||||
Executable
+11
@@ -0,0 +1,11 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Syntax sugar.
|
||||||
|
source $BIN_DIR/utils
|
||||||
|
|
||||||
|
if (pip-grep -s requirements.txt setuptools distribute &> /dev/null) then
|
||||||
|
|
||||||
|
puts-warn 'The package setuptools/distribute is listed in requirements.txt.'
|
||||||
|
puts-warn 'Please remove to ensure expected behavior. '
|
||||||
|
|
||||||
|
fi
|
||||||
@@ -1,106 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
#
|
|
||||||
# Create a Heroku app with the following buildpack:
|
|
||||||
# https://github.com/ddollar/buildpack-test
|
|
||||||
#
|
|
||||||
# Push this Python buildpack to that Heroku app to
|
|
||||||
# run the tests.
|
|
||||||
#
|
|
||||||
|
|
||||||
testDetectWithReqs() {
|
|
||||||
detect "simple-requirements"
|
|
||||||
assertCapturedEquals "Python"
|
|
||||||
assertCapturedSuccess
|
|
||||||
}
|
|
||||||
|
|
||||||
testDetectWithEmptyReqs() {
|
|
||||||
detect "empty-requirements"
|
|
||||||
assertCapturedEquals "Python"
|
|
||||||
assertCapturedSuccess
|
|
||||||
}
|
|
||||||
|
|
||||||
testDetectDjango16() {
|
|
||||||
detect "django-1.6-skeleton"
|
|
||||||
assertCapturedEquals "Python"
|
|
||||||
assertCapturedSuccess
|
|
||||||
}
|
|
||||||
|
|
||||||
testDetectDjango15() {
|
|
||||||
detect "django-1.5-skeleton"
|
|
||||||
assertCapturedEquals "Python"
|
|
||||||
assertCapturedSuccess
|
|
||||||
}
|
|
||||||
|
|
||||||
testDetectDjango14() {
|
|
||||||
detect "django-1.4-skeleton"
|
|
||||||
assertCapturedEquals "Python"
|
|
||||||
assertCapturedSuccess
|
|
||||||
}
|
|
||||||
|
|
||||||
testDetectDjango13() {
|
|
||||||
detect "django-1.3-skeleton"
|
|
||||||
assertCapturedEquals "Python"
|
|
||||||
assertCapturedSuccess
|
|
||||||
}
|
|
||||||
|
|
||||||
testDetectNotDjangoWithSettings() {
|
|
||||||
detect "not-django"
|
|
||||||
assertCapturedEquals "Python"
|
|
||||||
assertCapturedSuccess
|
|
||||||
}
|
|
||||||
|
|
||||||
testDetectWithSetupPy() {
|
|
||||||
detect "distutils"
|
|
||||||
assertCapturedEquals "Python"
|
|
||||||
assertCapturedSuccess
|
|
||||||
}
|
|
||||||
|
|
||||||
testDetectWithSetupRequires() {
|
|
||||||
detect "no-requirements"
|
|
||||||
assertCapturedEquals "Python"
|
|
||||||
assertCapturedSuccess
|
|
||||||
}
|
|
||||||
|
|
||||||
testDetectNotPython() {
|
|
||||||
detect "not-python"
|
|
||||||
assertNotCaptured "Python"
|
|
||||||
assertEquals "1" "${RETURN}"
|
|
||||||
}
|
|
||||||
|
|
||||||
testDetectSimpleRuntimePypy2() {
|
|
||||||
detect "simple-runtime-pypy2"
|
|
||||||
assertCapturedEquals "Python"
|
|
||||||
assertCapturedSuccess
|
|
||||||
}
|
|
||||||
|
|
||||||
testDetectSimpleRuntimePython2() {
|
|
||||||
detect "simple-runtime-python2"
|
|
||||||
assertCapturedEquals "Python"
|
|
||||||
assertCapturedSuccess
|
|
||||||
}
|
|
||||||
|
|
||||||
testDetectSimpleRuntimePython3() {
|
|
||||||
detect "simple-runtime" # should probably be renamed simple-runtime-python3
|
|
||||||
assertCapturedEquals "Python"
|
|
||||||
assertCapturedSuccess
|
|
||||||
}
|
|
||||||
|
|
||||||
## utils ########################################
|
|
||||||
|
|
||||||
pushd $(dirname 0) >/dev/null
|
|
||||||
BASE=$(pwd)
|
|
||||||
popd >/dev/null
|
|
||||||
|
|
||||||
source ${BASE}/vendor/test-utils
|
|
||||||
|
|
||||||
detect() {
|
|
||||||
capture ${BASE}/bin/detect ${BASE}/test/$1
|
|
||||||
}
|
|
||||||
|
|
||||||
compile() {
|
|
||||||
capture ${BASE}/bin/compile ${BASE}/test/$1
|
|
||||||
}
|
|
||||||
|
|
||||||
source ${BASE}/vendor/shunit2
|
|
||||||
|
|
||||||
Executable
+11
@@ -0,0 +1,11 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Syntax sugar.
|
||||||
|
BIN_DIR=$(cd $(dirname $0); pwd) # absolute path
|
||||||
|
source $BIN_DIR/utils
|
||||||
|
|
||||||
|
DISABLE_COLLECTSTATIC=1 "$(dirname ${0:-})/compile" "$1" "$2" "$3"
|
||||||
|
|
||||||
|
if [[ -f "$1/requirements-test.txt" ]]; then
|
||||||
|
/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
|
||||||
@@ -13,7 +13,12 @@ indent() {
|
|||||||
|
|
||||||
# Clean up pip output
|
# Clean up pip output
|
||||||
cleanup() {
|
cleanup() {
|
||||||
sed -e 's/\.\.\.\+/.../g' | sed -e '/already satisfied/Id' | sed -e '/Overwriting/Id' | sed -e '/python executable/Id' | sed -e '/no previously-included files/Id'
|
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 Indented line.
|
||||||
|
puts-line() {
|
||||||
|
echo " $@"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Buildpack Steps.
|
# Buildpack Steps.
|
||||||
@@ -26,17 +31,24 @@ puts-warn() {
|
|||||||
echo " ! $@"
|
echo " ! $@"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Buildpack Commands.
|
||||||
|
puts-cmd() {
|
||||||
|
echo " $ $@"
|
||||||
|
}
|
||||||
|
|
||||||
# Usage: $ set-env key value
|
# Usage: $ set-env key value
|
||||||
set-env() {
|
set-env() {
|
||||||
echo "export $1=$2" >> $PROFILE_PATH
|
echo "export $1=$2" >> $PROFILE_PATH
|
||||||
|
echo "export $1=$2" >> $EXPORT_PATH
|
||||||
}
|
}
|
||||||
|
|
||||||
# Usage: $ set-default-env key value
|
# Usage: $ set-default-env key value
|
||||||
set-default-env() {
|
set-default-env() {
|
||||||
echo "export $1=\${$1:-$2}" >> $PROFILE_PATH
|
echo "export $1=\${$1:-$2}" >> $PROFILE_PATH
|
||||||
|
echo "export $1=\${$1:-$2}" >> $EXPORT_PATH
|
||||||
}
|
}
|
||||||
|
|
||||||
# Usage: $ set-default-env key value
|
# Usage: $ un-set-env key
|
||||||
un-set-env() {
|
un-set-env() {
|
||||||
echo "unset $1" >> $PROFILE_PATH
|
echo "unset $1" >> $PROFILE_PATH
|
||||||
}
|
}
|
||||||
@@ -68,7 +80,7 @@ deep-rm() {
|
|||||||
# subshell to avoid surprising caller with shopts.
|
# subshell to avoid surprising caller with shopts.
|
||||||
(
|
(
|
||||||
shopt -s dotglob
|
shopt -s dotglob
|
||||||
rm -rf "$1"/!(tmp|.|..)
|
rm -rf "$1"/!(.curlrc|.netrc|tmp|.|..)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,6 +90,10 @@ sub-env() {
|
|||||||
WHITELIST=${2:-''}
|
WHITELIST=${2:-''}
|
||||||
BLACKLIST=${3:-'^(GIT_DIR|PYTHONHOME|LD_LIBRARY_PATH|LIBRARY_PATH|PATH)$'}
|
BLACKLIST=${3:-'^(GIT_DIR|PYTHONHOME|LD_LIBRARY_PATH|LIBRARY_PATH|PATH)$'}
|
||||||
|
|
||||||
|
# Python-specific variables.
|
||||||
|
export PYHONHOME=$BUILD_DIR/.heroku/python
|
||||||
|
export PYTHONPATH=$BUILD_DIR/
|
||||||
|
|
||||||
(
|
(
|
||||||
if [ -d "$ENV_DIR" ]; then
|
if [ -d "$ENV_DIR" ]; then
|
||||||
for e in $(ls $ENV_DIR); do
|
for e in $(ls $ENV_DIR); do
|
||||||
@@ -91,3 +107,4 @@ sub-env() {
|
|||||||
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Executable
+49
@@ -0,0 +1,49 @@
|
|||||||
|
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."
|
||||||
|
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."
|
||||||
|
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."
|
||||||
|
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."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
show-warnings() {
|
||||||
|
old-platform
|
||||||
|
pylibmc-missing
|
||||||
|
scipy-included
|
||||||
|
distribute-included
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
echo "Building autoconf..."
|
|
||||||
|
|
||||||
|
|
||||||
SOURCE_TARBALL='http://ftp.gnu.org/gnu/autoconf/autoconf-2.68.tar.gz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
|
|
||||||
cd autoconf-2.68
|
|
||||||
./configure --prefix=$OUT_PREFIX
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/autoconf
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
# Use new path, containing autoconf.
|
|
||||||
export PATH="/app/.heroku/python/bin/:$PATH"
|
|
||||||
hash -r
|
|
||||||
|
|
||||||
|
|
||||||
echo "Building libffi..."
|
|
||||||
|
|
||||||
SOURCE_TARBALL='https://github.com/atgreen/libffi/archive/master.tar.gz'
|
|
||||||
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv libffi-master libffi
|
|
||||||
|
|
||||||
cd libffi
|
|
||||||
./autogen.sh
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
|
|
||||||
# Cleanup
|
|
||||||
cd ..
|
|
||||||
@@ -6,7 +6,7 @@ OUT_PREFIX=$1
|
|||||||
echo "Building SQLite..."
|
echo "Building SQLite..."
|
||||||
|
|
||||||
|
|
||||||
SOURCE_TARBALL='http://www.sqlite.org/sqlite-autoconf-3070900.tar.gz'
|
SOURCE_TARBALL='https://www.sqlite.org/sqlite-autoconf-3070900.tar.gz'
|
||||||
|
|
||||||
curl $SOURCE_TARBALL | tar xz
|
curl $SOURCE_TARBALL | tar xz
|
||||||
# jx
|
# jx
|
||||||
|
|||||||
+23
@@ -0,0 +1,23 @@
|
|||||||
|
#!/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..."
|
||||||
|
|
||||||
|
SOURCE_TARBALL='http://download.osgeo.org/gdal/1.11.1/gdal-1.11.1.tar.gz'
|
||||||
|
|
||||||
|
curl -L $SOURCE_TARBALL | tar zx
|
||||||
|
|
||||||
|
cd gdal-1.11.1
|
||||||
|
./configure --prefix=$OUT_PREFIX &&
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
cd ..
|
||||||
+23
@@ -0,0 +1,23 @@
|
|||||||
|
#!/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..."
|
||||||
|
|
||||||
|
SOURCE_TARBALL='http://download.osgeo.org/geos/geos-3.4.2.tar.bz2'
|
||||||
|
|
||||||
|
curl -L $SOURCE_TARBALL | tar xj
|
||||||
|
|
||||||
|
cd geos-3.4.2
|
||||||
|
./configure --prefix=$OUT_PREFIX &&
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
cd ..
|
||||||
+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."
|
||||||
+23
@@ -0,0 +1,23 @@
|
|||||||
|
#!/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..."
|
||||||
|
|
||||||
|
SOURCE_TARBALL='http://download.osgeo.org/proj/proj-4.8.0.tar.gz'
|
||||||
|
|
||||||
|
curl -L $SOURCE_TARBALL | tar zx
|
||||||
|
|
||||||
|
cd proj-4.8.0
|
||||||
|
./configure --prefix=$OUT_PREFIX &&
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
cd ..
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
#!/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/pypy-1.7-linux64.tar.bz2'
|
|
||||||
curl -L $SOURCE_TARBALL | tar jx
|
|
||||||
cp -R pypy-1.7/* $OUT_PREFIX
|
|
||||||
|
|
||||||
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
|
|
||||||
@@ -2,11 +2,13 @@
|
|||||||
# Build Path: /app/.heroku/python/
|
# Build Path: /app/.heroku/python/
|
||||||
# Build Deps: libraries/sqlite
|
# Build Deps: libraries/sqlite
|
||||||
|
|
||||||
|
# NOTICE: This formula only works for the cedar-14 stack, not cedar.
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
OUT_PREFIX=$1
|
||||||
|
|
||||||
echo "Building PyPy..."
|
echo "Building PyPy..."
|
||||||
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy-1.9-linux64.tar.bz2'
|
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.3.1-linux64.tar.bz2'
|
||||||
curl -L $SOURCE_TARBALL | tar jx
|
curl -L $SOURCE_TARBALL | tar jx
|
||||||
cp -R pypy-1.9/* $OUT_PREFIX
|
cp -R pypy2-v5.3.1-linux64/* $OUT_PREFIX
|
||||||
|
|
||||||
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
|
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
|
||||||
@@ -2,11 +2,13 @@
|
|||||||
# Build Path: /app/.heroku/python/
|
# Build Path: /app/.heroku/python/
|
||||||
# Build Deps: libraries/sqlite
|
# Build Deps: libraries/sqlite
|
||||||
|
|
||||||
|
# NOTICE: This formula only works for the cedar-14 stack, not cedar.
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
OUT_PREFIX=$1
|
||||||
|
|
||||||
echo "Building PyPy..."
|
echo "Building PyPy..."
|
||||||
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy-1.8-linux64.tar.bz2'
|
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.6.0-linux64.tar.bz2'
|
||||||
curl -L $SOURCE_TARBALL | tar jx
|
curl -L $SOURCE_TARBALL | tar jx
|
||||||
cp -R pypy-1.8/* $OUT_PREFIX
|
cp -R pypy2-v5.6.0-linux64/* $OUT_PREFIX
|
||||||
|
|
||||||
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
|
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
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
# Protect 2.4 builds from parent Python (causes segfault during build).
|
|
||||||
unset LANG PYTHONHOME PYTHONPATH
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.4.4/Python-2.4.4.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-2.4.4 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
# Protect 2.4 builds from parent Python (causes segfault during build).
|
|
||||||
unset LANG PYTHONHOME PYTHONPATH
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.4.5/Python-2.4.5.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-2.4.5 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
# Protect 2.4 builds from parent Python (causes segfault during build).
|
|
||||||
unset LANG PYTHONHOME PYTHONPATH
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.4.6/Python-2.4.6.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-2.4.6 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
# Protect 2.5 builds from parent Python (causes segfault during build).
|
|
||||||
unset LANG PYTHONHOME PYTHONPATH
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.5/Python-2.5.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-2.5 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
# Protect 2.5 builds from parent Python (causes segfault during build).
|
|
||||||
unset LANG PYTHONHOME PYTHONPATH
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.5.1/Python-2.5.1.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-2.5.1 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
# Protect 2.5 builds from parent Python (causes segfault during build).
|
|
||||||
unset LANG PYTHONHOME PYTHONPATH
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.5.2/Python-2.5.2.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-2.5.2 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
# Protect 2.5 builds from parent Python (causes segfault during build).
|
|
||||||
unset LANG PYTHONHOME PYTHONPATH
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.5.3/Python-2.5.3.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-2.5.3 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
# Protect 2.5 builds from parent Python (causes segfault during build).
|
|
||||||
unset LANG PYTHONHOME PYTHONPATH
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.5.4/Python-2.5.4.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-2.5.4 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
# Protect 2.6 builds from parent Python (causes segfault during build).
|
|
||||||
unset LANG PYTHONHOME PYTHONPATH
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.5.5/Python-2.5.5.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-2.5.5 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
# Protect 2.5 builds from parent Python (causes segfault during build).
|
|
||||||
unset LANG PYTHONHOME PYTHONPATH
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.5.6/Python-2.5.6.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-2.5.6 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
# NOTICE: This formula only works for the cedar stack, not cedar-14.
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
# Protect 2.6 builds from parent Python (causes segfault during build).
|
|
||||||
unset LANG PYTHONHOME PYTHONPATH
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://www.python.org/ftp/python/2.6/Python-2.6.tar.bz2'
|
|
||||||
curl -L $SOURCE_TARBALL | tar jx
|
|
||||||
mv Python-2.6 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
# NOTICE: This formula only works for the cedar stack, not cedar-14.
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
# Protect 2.6 builds from parent Python (causes segfault during build).
|
|
||||||
unset LANG PYTHONHOME PYTHONPATH
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.6.1/Python-2.6.1.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-2.6.1 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
# Protect 2.6 builds from parent Python (causes segfault during build).
|
|
||||||
unset LANG PYTHONHOME PYTHONPATH
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.6.2/Python-2.6.2.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-2.6.2 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
# Protect 2.6 builds from parent Python (causes segfault during build).
|
|
||||||
unset LANG PYTHONHOME PYTHONPATH
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.6.3/Python-2.6.3.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-2.6.3 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
# Protect 2.6 builds from parent Python (causes segfault during build).
|
|
||||||
unset LANG PYTHONHOME PYTHONPATH
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.6.4/Python-2.6.4.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-2.6.4 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
# Protect 2.6 builds from parent Python (causes segfault during build).
|
|
||||||
unset LANG PYTHONHOME PYTHONPATH
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.6.5/Python-2.6.5.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-2.6.5 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
# Protect 2.6 builds from parent Python (causes segfault during build).
|
|
||||||
unset LANG PYTHONHOME PYTHONPATH
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.6.6/Python-2.6.6.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-2.6.6 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
# Protect 2.6 builds from parent Python (causes segfault during build).
|
|
||||||
unset LANG PYTHONHOME PYTHONPATH
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.6.7/Python-2.6.7.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-2.6.7 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
# Protect 2.6 builds from parent Python (causes segfault during build).
|
|
||||||
unset LANG PYTHONHOME PYTHONPATH
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.6.8/Python-2.6.8.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-2.6.8 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
# Protect 2.6 builds from parent Python (causes segfault during build).
|
|
||||||
unset LANG PYTHONHOME PYTHONPATH
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.6.9/Python-2.6.9.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-2.6.9 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
@@ -5,11 +5,11 @@
|
|||||||
OUT_PREFIX=$1
|
OUT_PREFIX=$1
|
||||||
|
|
||||||
echo "Building Python..."
|
echo "Building Python..."
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.7.1/Python-2.7.1.tgz'
|
SOURCE_TARBALL='https://python.org/ftp/python/2.7.10/Python-2.7.10.tgz'
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
curl -L $SOURCE_TARBALL | tar xz
|
||||||
mv Python-2.7.1 src
|
mv Python-2.7.10 src
|
||||||
cd src
|
cd src
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||||
make
|
make
|
||||||
make install
|
make install
|
||||||
@@ -5,11 +5,11 @@
|
|||||||
OUT_PREFIX=$1
|
OUT_PREFIX=$1
|
||||||
|
|
||||||
echo "Building Python..."
|
echo "Building Python..."
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.7.2/Python-2.7.2.tgz'
|
SOURCE_TARBALL='https://python.org/ftp/python/2.7.11/Python-2.7.11.tgz'
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
curl -L $SOURCE_TARBALL | tar xz
|
||||||
mv Python-2.7.2 src
|
mv Python-2.7.11 src
|
||||||
cd src
|
cd src
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||||
make
|
make
|
||||||
make install
|
make install
|
||||||
@@ -5,11 +5,11 @@
|
|||||||
OUT_PREFIX=$1
|
OUT_PREFIX=$1
|
||||||
|
|
||||||
echo "Building Python..."
|
echo "Building Python..."
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.7.3/Python-2.7.3.tgz'
|
SOURCE_TARBALL='https://python.org/ftp/python/2.7.12/Python-2.7.12.tgz'
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
curl -L $SOURCE_TARBALL | tar xz
|
||||||
mv Python-2.7.3 src
|
mv Python-2.7.12 src
|
||||||
cd src
|
cd src
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||||
make
|
make
|
||||||
make install
|
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.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
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.7.4/Python-2.7.4.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-2.7.4 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.7.5/Python-2.7.5.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-2.7.5 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.7.6/Python-2.7.6.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-2.7.6 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.7.7/Python-2.7.7.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-2.7.7 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.7.7/Python-2.7.7.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-2.7.7 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.7.8/Python-2.7.8.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-2.7.8 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.7.8/Python-2.7.8.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-2.7.8 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
@@ -5,11 +5,11 @@
|
|||||||
OUT_PREFIX=$1
|
OUT_PREFIX=$1
|
||||||
|
|
||||||
echo "Building Python..."
|
echo "Building Python..."
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/2.7/Python-2.7.tgz'
|
SOURCE_TARBALL='https://python.org/ftp/python/2.7.9/Python-2.7.9.tgz'
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
curl -L $SOURCE_TARBALL | tar xz
|
||||||
mv Python-2.7 src
|
mv Python-2.7.9 src
|
||||||
cd src
|
cd src
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||||
make
|
make
|
||||||
make install
|
make install
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/3.1/Python-3.1.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-3.1 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
|
|
||||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/3.1.1/Python-3.1.1.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-3.1.1 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
|
|
||||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/3.1.2/Python-3.1.2.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-3.1.2 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
|
|
||||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/3.1.3/Python-3.1.3.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-3.1.3 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
|
|
||||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/3.1.4/Python-3.1.4.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-3.1.4 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
|
|
||||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/3.1.5/Python-3.1.5.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-3.1.5 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
|
|
||||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/3.2.1/Python-3.2.1.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-3.2.1 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
|
|
||||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/3.2.2/Python-3.2.2.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-3.2.2 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
|
|
||||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/3.2.3/Python-3.2.3.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-3.2.3 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
|
|
||||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/3.2.4/Python-3.2.4.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-3.2.4 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
|
|
||||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/3.2.5/Python-3.2.5.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-3.2.5 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
|
|
||||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/3.3.0/Python-3.3.0.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-3.3.0 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
|
|
||||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/3.3.1/Python-3.3.1.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-3.3.1 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
|
|
||||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/3.3.2/Python-3.3.2.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-3.3.2 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
|
|
||||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/3.3.3/Python-3.3.3.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-3.3.3 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
|
|
||||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/3.3.4/Python-3.3.4.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-3.3.4 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
|
|
||||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/3.3.5/Python-3.3.5.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-3.3.5 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
|
|
||||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/3.4.0/Python-3.4.0.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-3.4.0 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no --enable-shared
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
|
|
||||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Build Path: /app/.heroku/python/
|
|
||||||
# Build Deps: libraries/sqlite
|
|
||||||
|
|
||||||
OUT_PREFIX=$1
|
|
||||||
|
|
||||||
echo "Building Python..."
|
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/3.4.1/Python-3.4.1.tgz'
|
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
|
||||||
mv Python-3.4.1 src
|
|
||||||
cd src
|
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no --enable-shared
|
|
||||||
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.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
|
||||||
|
|
||||||
@@ -5,13 +5,14 @@
|
|||||||
OUT_PREFIX=$1
|
OUT_PREFIX=$1
|
||||||
|
|
||||||
echo "Building Python..."
|
echo "Building Python..."
|
||||||
SOURCE_TARBALL='http://python.org/ftp/python/3.2/Python-3.2.tgz'
|
SOURCE_TARBALL='https://python.org/ftp/python/3.6.0/Python-3.6.0.tgz'
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
curl -L $SOURCE_TARBALL | tar xz
|
||||||
mv Python-3.2 src
|
mv Python-3.6.0 src
|
||||||
cd src
|
cd src
|
||||||
|
|
||||||
./configure --prefix=$OUT_PREFIX --enable-shared
|
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||||
make
|
make
|
||||||
make install
|
make install
|
||||||
|
|
||||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
||||||
|
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
psycopg2
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
requests
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
python-2.7.13
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
requests
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
python-3.6.0
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
requests
|
||||||
Vendored
+114
@@ -0,0 +1,114 @@
|
|||||||
|
Maya: Datetime for Humans™
|
||||||
|
==========================
|
||||||
|
|
||||||
|
.. image:: https://img.shields.io/pypi/v/maya.svg
|
||||||
|
:target: https://pypi.python.org/pypi/maya
|
||||||
|
|
||||||
|
.. image:: https://travis-ci.org/kennethreitz/maya.svg?branch=master
|
||||||
|
:target: https://travis-ci.org/kennethreitz/maya
|
||||||
|
|
||||||
|
.. image:: https://img.shields.io/badge/SayThanks.io-☼-1EAEDB.svg
|
||||||
|
:target: https://saythanks.io/to/kennethreitz
|
||||||
|
|
||||||
|
|
||||||
|
Datetimes are very frustrating to work with in Python, especially when dealing
|
||||||
|
with different locales on different systems. This library exists to make the
|
||||||
|
simple things **much** easier, while admitting that time is an illusion
|
||||||
|
(timezones doubly so).
|
||||||
|
|
||||||
|
Datetimes should be interacted with via an API written for humans.
|
||||||
|
|
||||||
|
Maya is mostly built around the headaches and use-cases around parsing datetime data from websites.
|
||||||
|
|
||||||
|
|
||||||
|
☤ Basic Usage of Maya
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
Behold, datetimes for humans!
|
||||||
|
|
||||||
|
.. code-block:: pycon
|
||||||
|
|
||||||
|
>>> now = maya.now()
|
||||||
|
<MayaDT epoch=1481850660.9>
|
||||||
|
|
||||||
|
>>> tomorrow = maya.when('tomorrow')
|
||||||
|
<MayaDT epoch=1481919067.23>
|
||||||
|
|
||||||
|
>>> tomorrow.slang_date()
|
||||||
|
'tomorrow'
|
||||||
|
|
||||||
|
>>> tomorrow.slang_time()
|
||||||
|
'23 hours from now'
|
||||||
|
|
||||||
|
>>> tomorrow.iso8601()
|
||||||
|
'2016-12-16T15:11:30.263350Z'
|
||||||
|
|
||||||
|
>>> tomorrow.rfc2822()
|
||||||
|
'Fri, 16 Dec 2016 20:11:30 -0000'
|
||||||
|
|
||||||
|
>>> tomorrow.datetime()
|
||||||
|
datetime.datetime(2016, 12, 16, 15, 11, 30, 263350, tzinfo=<UTC>)
|
||||||
|
|
||||||
|
# Automatically parse datetime strings and generate naive datetimes.
|
||||||
|
>>> scraped = '2016-12-16 18:23:45.423992+00:00'
|
||||||
|
>>> maya.parse(scraped).datetime(to_timezone='US/Eastern', naive=True)
|
||||||
|
datetime.datetime(2016, 12, 16, 13, 23, 45, 423992)
|
||||||
|
|
||||||
|
>>> rand_day = maya.when('2011-02-07', timezone='US/Eastern')
|
||||||
|
<MayaDT epoch=1297036800.0>
|
||||||
|
|
||||||
|
# Note how this is the 6th, not the 7th.
|
||||||
|
>>> rand_day.day
|
||||||
|
6
|
||||||
|
|
||||||
|
# Always.
|
||||||
|
>>> rand_day.timezone
|
||||||
|
UTC
|
||||||
|
|
||||||
|
☤ Why is this useful?
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
- All timezone algebra will behave identically on all machines, regardless of system locale.
|
||||||
|
- Complete symmetric import and export of both ISO 8601 and RFC 2822 datetime stamps.
|
||||||
|
- Fantastic parsing of both dates written for/by humans and machines (``maya.when()`` vs ``maya.parse()``).
|
||||||
|
- Support for human slang, both import and export (e.g. `an hour ago`).
|
||||||
|
- Datetimes can very easily be generated, with or without tzinfo attached.
|
||||||
|
- This library is based around epoch time, but dates before Jan 1 1970 are indeed supported, via negative integers.
|
||||||
|
- Maya never panics, and always carries a towel.
|
||||||
|
|
||||||
|
|
||||||
|
☤ What about Delorean, Arrow, & Pendulum?
|
||||||
|
-----------------------------------------
|
||||||
|
|
||||||
|
Arrow, for example, is a fantastic library, but isn't what I wanted in a datetime library. In many ways, it's better than Maya for certain things. In some ways, in my opinion, it's not.
|
||||||
|
|
||||||
|
I simply desire a sane API for datetimes that made sense to me for all the things I'd ever want to do—especially when dealing with timezone algebra. Arrow doesn't do all of the things I need (but it does a lot more!). Maya does do exactly what I need.
|
||||||
|
|
||||||
|
I think these projects complement each-other, personally. Maya is great for parsing websites. For example- Arrow supports floors and ceilings and spans of dates, which Maya does not at all.
|
||||||
|
|
||||||
|
|
||||||
|
☤ Installing Maya
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
Installation is easy, with pip::
|
||||||
|
|
||||||
|
$ pip install maya
|
||||||
|
|
||||||
|
✨🍰✨
|
||||||
|
|
||||||
|
☤ Like it?
|
||||||
|
----------
|
||||||
|
|
||||||
|
`Say Thanks <https://saythanks.io/to/kennethreitz>`_!
|
||||||
|
|
||||||
|
|
||||||
|
How to Contribute
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
#. Check for open issues or open a fresh issue to start a discussion around a feature idea or a bug.
|
||||||
|
#. Fork `the repository`_ on GitHub to start making your changes to the **master** branch (or branch off of it).
|
||||||
|
#. Write a test which shows that the bug was fixed or that the feature works as expected.
|
||||||
|
#. Send a pull request and bug the maintainer until it gets merged and published. :) Make sure to add yourself to AUTHORS_.
|
||||||
|
|
||||||
|
.. _`the repository`: http://github.com/kennethreitz/maya
|
||||||
|
.. _AUTHORS: https://github.com/kennethreitz/maya/blob/master/AUTHORS.rst
|
||||||
Vendored
+273
@@ -0,0 +1,273 @@
|
|||||||
|
|
||||||
|
# ___ __ ___ _ _ ___
|
||||||
|
# || \/ | ||=|| \\// ||=||
|
||||||
|
# || | || || // || ||
|
||||||
|
|
||||||
|
# Ignore warnings for yaml usage.
|
||||||
|
import warnings
|
||||||
|
import ruamel.yaml
|
||||||
|
warnings.simplefilter('ignore', ruamel.yaml.error.UnsafeLoaderWarning)
|
||||||
|
|
||||||
|
|
||||||
|
import email.utils
|
||||||
|
import time
|
||||||
|
from datetime import datetime as Datetime
|
||||||
|
|
||||||
|
import pytz
|
||||||
|
import humanize
|
||||||
|
import dateparser
|
||||||
|
import iso8601
|
||||||
|
import dateutil.parser
|
||||||
|
from tzlocal import get_localzone
|
||||||
|
|
||||||
|
_EPOCH_START = (1970, 1, 1)
|
||||||
|
|
||||||
|
|
||||||
|
def validate_class_type_arguments(operator):
|
||||||
|
"""
|
||||||
|
Decorator to validate all the arguments to function
|
||||||
|
are of the type of calling class
|
||||||
|
"""
|
||||||
|
|
||||||
|
def inner(function):
|
||||||
|
def wrapper(self, *args, **kwargs):
|
||||||
|
for arg in args + tuple(kwargs.values()):
|
||||||
|
if not isinstance(arg, self.__class__):
|
||||||
|
raise TypeError('unorderable types: {}() {} {}()'.format(
|
||||||
|
type(self).__name__, operator, type(arg).__name__))
|
||||||
|
return function(self, *args, **kwargs)
|
||||||
|
|
||||||
|
return wrapper
|
||||||
|
|
||||||
|
return inner
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class MayaDT(object):
|
||||||
|
"""The Maya Datetime object."""
|
||||||
|
|
||||||
|
def __init__(self, epoch):
|
||||||
|
super(MayaDT, self).__init__()
|
||||||
|
self._epoch = epoch
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return '<MayaDT epoch={}>'.format(self._epoch)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.rfc2822()
|
||||||
|
|
||||||
|
def __format__(self, *args, **kwargs):
|
||||||
|
"""Return's the datetime's format"""
|
||||||
|
return format(self.datetime(), *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
@validate_class_type_arguments('==')
|
||||||
|
def __eq__(self, maya_dt):
|
||||||
|
return self._epoch == maya_dt._epoch
|
||||||
|
|
||||||
|
@validate_class_type_arguments('!=')
|
||||||
|
def __ne__(self, maya_dt):
|
||||||
|
return self._epoch != maya_dt._epoch
|
||||||
|
|
||||||
|
@validate_class_type_arguments('<')
|
||||||
|
def __lt__(self, maya_dt):
|
||||||
|
return self._epoch < maya_dt._epoch
|
||||||
|
|
||||||
|
@validate_class_type_arguments('<=')
|
||||||
|
def __le__(self, maya_dt):
|
||||||
|
return self._epoch <= maya_dt._epoch
|
||||||
|
|
||||||
|
@validate_class_type_arguments('>')
|
||||||
|
def __gt__(self, maya_dt):
|
||||||
|
return self._epoch > maya_dt._epoch
|
||||||
|
|
||||||
|
@validate_class_type_arguments('>=')
|
||||||
|
def __ge__(self, maya_dt):
|
||||||
|
return self._epoch >= maya_dt._epoch
|
||||||
|
|
||||||
|
|
||||||
|
# Timezone Crap
|
||||||
|
# -------------
|
||||||
|
|
||||||
|
@property
|
||||||
|
def timezone(self):
|
||||||
|
"""Returns the UTC tzinfo name. It's always UTC. Always."""
|
||||||
|
return 'UTC'
|
||||||
|
|
||||||
|
@property
|
||||||
|
def _tz(self):
|
||||||
|
"""Returns the UTC tzinfo object."""
|
||||||
|
return pytz.timezone(self.timezone)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def local_timezone(self):
|
||||||
|
"""Returns the name of the local timezone, for informational purposes."""
|
||||||
|
return self._local_tz.zone
|
||||||
|
|
||||||
|
@property
|
||||||
|
def _local_tz(self):
|
||||||
|
"""Returns the local timezone."""
|
||||||
|
return get_localzone()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def __dt_to_epoch(dt):
|
||||||
|
"""Converts a datetime into an epoch."""
|
||||||
|
|
||||||
|
# Assume UTC if no datetime is provided.
|
||||||
|
if dt.tzinfo is None:
|
||||||
|
dt = dt.replace(tzinfo=pytz.utc)
|
||||||
|
|
||||||
|
epoch_start = Datetime(*_EPOCH_START, tzinfo=pytz.timezone('UTC'))
|
||||||
|
return (dt - epoch_start).total_seconds()
|
||||||
|
|
||||||
|
# Importers
|
||||||
|
# ---------
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_datetime(klass, dt):
|
||||||
|
"""Returns MayaDT instance from datetime."""
|
||||||
|
return klass(klass.__dt_to_epoch(dt))
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_iso8601(klass, string):
|
||||||
|
"""Returns MayaDT instance from iso8601 string."""
|
||||||
|
dt = iso8601.parse_date(string)
|
||||||
|
return klass.from_datetime(dt)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def from_rfc2822(string):
|
||||||
|
"""Returns MayaDT instance from rfc2822 string."""
|
||||||
|
return parse(string)
|
||||||
|
|
||||||
|
# Exporters
|
||||||
|
# ---------
|
||||||
|
|
||||||
|
def datetime(self, to_timezone=None, naive=False):
|
||||||
|
"""Returns a timezone-aware datetime...
|
||||||
|
Defaulting to UTC (as it should).
|
||||||
|
|
||||||
|
Keyword Arguments:
|
||||||
|
to_timezone {string} -- timezone to convert to (default: None/UTC)
|
||||||
|
naive {boolean} -- if True, the tzinfo is simply dropped (default: False)
|
||||||
|
"""
|
||||||
|
if to_timezone:
|
||||||
|
dt = self.datetime().astimezone(pytz.timezone(to_timezone))
|
||||||
|
else:
|
||||||
|
dt = Datetime.utcfromtimestamp(self._epoch)
|
||||||
|
dt.replace(tzinfo=self._tz)
|
||||||
|
|
||||||
|
# Strip the timezone info if requested to do so.
|
||||||
|
if naive:
|
||||||
|
return dt.replace(tzinfo=None)
|
||||||
|
else:
|
||||||
|
if dt.tzinfo is None:
|
||||||
|
dt = dt.replace(tzinfo=self._tz)
|
||||||
|
|
||||||
|
return dt
|
||||||
|
|
||||||
|
def iso8601(self):
|
||||||
|
"""Returns an ISO 8601 representation of the MayaDT."""
|
||||||
|
# Get a timezone-naive datetime.
|
||||||
|
dt = self.datetime(naive=True)
|
||||||
|
return '{}Z'.format(dt.isoformat())
|
||||||
|
|
||||||
|
def rfc2822(self):
|
||||||
|
"""Returns an RFC 2822 representation of the MayaDT."""
|
||||||
|
return email.utils.formatdate(self.epoch, usegmt=True)
|
||||||
|
|
||||||
|
# Properties
|
||||||
|
# ----------
|
||||||
|
|
||||||
|
@property
|
||||||
|
def year(self):
|
||||||
|
return self.datetime().year
|
||||||
|
|
||||||
|
@property
|
||||||
|
def month(self):
|
||||||
|
return self.datetime().month
|
||||||
|
|
||||||
|
@property
|
||||||
|
def day(self):
|
||||||
|
return self.datetime().day
|
||||||
|
|
||||||
|
@property
|
||||||
|
def week(self):
|
||||||
|
return self.datetime().isocalendar()[1]
|
||||||
|
|
||||||
|
@property
|
||||||
|
def weekday(self):
|
||||||
|
"""Return the day of the week as an integer. Monday is 1 and Sunday is 7"""
|
||||||
|
return self.datetime().isoweekday()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def hour(self):
|
||||||
|
return self.datetime().hour
|
||||||
|
|
||||||
|
@property
|
||||||
|
def minute(self):
|
||||||
|
return self.datetime().minute
|
||||||
|
|
||||||
|
@property
|
||||||
|
def second(self):
|
||||||
|
return self.datetime().second
|
||||||
|
|
||||||
|
@property
|
||||||
|
def microsecond(self):
|
||||||
|
return self.datetime().microsecond
|
||||||
|
|
||||||
|
@property
|
||||||
|
def epoch(self):
|
||||||
|
return self._epoch
|
||||||
|
|
||||||
|
# Human Slang Extras
|
||||||
|
# ------------------
|
||||||
|
|
||||||
|
def slang_date(self):
|
||||||
|
""""Returns human slang representation of date."""
|
||||||
|
dt = self.datetime(naive=True, to_timezone=self.local_timezone)
|
||||||
|
return humanize.naturaldate(dt)
|
||||||
|
|
||||||
|
def slang_time(self):
|
||||||
|
""""Returns human slang representation of time."""
|
||||||
|
dt = self.datetime(naive=True, to_timezone=self.local_timezone)
|
||||||
|
return humanize.naturaltime(dt)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def now():
|
||||||
|
"""Returns a MayaDT instance for this exact moment."""
|
||||||
|
epoch = time.time()
|
||||||
|
return MayaDT(epoch=epoch)
|
||||||
|
|
||||||
|
def when(string, timezone='UTC'):
|
||||||
|
""""Returns a MayaDT instance for the human moment specified.
|
||||||
|
|
||||||
|
Powered by dateparser. Useful for scraping websites.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
'next week', 'now', 'tomorrow', '300 years ago', 'August 14, 2015'
|
||||||
|
|
||||||
|
Keyword Arguments:
|
||||||
|
string -- string to be parsed
|
||||||
|
timezone -- timezone referenced from (default: 'UTC')
|
||||||
|
|
||||||
|
"""
|
||||||
|
dt = dateparser.parse(string, settings={'TIMEZONE': timezone, 'RETURN_AS_TIMEZONE_AWARE': True, 'TO_TIMEZONE': 'UTC'})
|
||||||
|
|
||||||
|
if dt is None:
|
||||||
|
raise ValueError('invalid datetime input specified.')
|
||||||
|
|
||||||
|
return MayaDT.from_datetime(dt)
|
||||||
|
|
||||||
|
def parse(string, day_first=False):
|
||||||
|
""""Returns a MayaDT instance for the machine-produced moment specified.
|
||||||
|
|
||||||
|
Powered by dateutil. Accepts most known formats. Useful for working with data.
|
||||||
|
|
||||||
|
Keyword Arguments:
|
||||||
|
string -- string to be parsed
|
||||||
|
day_first -- if true, the first value (e.g. 01/05/2016) is parsed as day (default: False)
|
||||||
|
"""
|
||||||
|
dt = dateutil.parser.parse(string, dayfirst=day_first)
|
||||||
|
return MayaDT.from_datetime(dt)
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user