Add support for AWS S3 storage for ephemeral storage platforms

This commit is contained in:
Isaac Bythewood 2018-02-25 01:13:39 -05:00
parent 49742e6ced
commit 1b991a3798
5 changed files with 330 additions and 284 deletions

View File

@ -19,6 +19,8 @@ whitenoise = "*"
"psycopg2" = "*" "psycopg2" = "*"
easy-thumbnails = "*" easy-thumbnails = "*"
python-dotenv = "*" python-dotenv = "*"
django-storages = "*"
"boto3" = "*"
[dev-packages] [dev-packages]

391
Pipfile.lock generated
View File

@ -1,7 +1,7 @@
{ {
"_meta": { "_meta": {
"hash": { "hash": {
"sha256": "373fbe640544ca753429ea7bfcf590b3504860d60d3c92b58e283c21449db167" "sha256": "5c6e649c1ee522529906054b0c0ac0a0ccef79be069a3e8cab4ed3390ca2e729"
}, },
"host-environment-markers": { "host-environment-markers": {
"implementation_name": "cpython", "implementation_name": "cpython",
@ -9,9 +9,9 @@
"os_name": "posix", "os_name": "posix",
"platform_machine": "x86_64", "platform_machine": "x86_64",
"platform_python_implementation": "CPython", "platform_python_implementation": "CPython",
"platform_release": "4.4.0-101-generic", "platform_release": "4.4.0-43-Microsoft",
"platform_system": "Linux", "platform_system": "Linux",
"platform_version": "#124-Ubuntu SMP Fri Nov 10 18:29:59 UTC 2017", "platform_version": "#1-Microsoft Wed Dec 31 14:42:53 PST 2014",
"python_full_version": "3.5.2", "python_full_version": "3.5.2",
"python_version": "3.5", "python_version": "3.5",
"sys_platform": "linux" "sys_platform": "linux"
@ -26,12 +26,26 @@
] ]
}, },
"default": { "default": {
"boto3": {
"hashes": [
"sha256:3cebf92fbc65d190f7d5618d3a46de341e5800ed24bc982dc8bb3ad2fa9478d0",
"sha256:5d7c47dbd14e6bbf1bee26da878091f31320bbb58aa72c5b08a8bf13c644d66e"
],
"version": "==1.5.36"
},
"botocore": {
"hashes": [
"sha256:898f10e68a7a1c2be621caf046d29a8f782c0ea866d644d5be46472c00a3dee9",
"sha256:a80a23e080f4a93d11a1c067a69304dd407d18c358cba1e0df8c96f56c9e98b4"
],
"version": "==1.8.50"
},
"certifi": { "certifi": {
"hashes": [ "hashes": [
"sha256:244be0d93b71e93fc0a0a479862051414d0e00e16435707e5bf5000f92e04694", "sha256:14131608ad2fd56836d33a71ee60fa1c82bc9d2c8d98b7bdbc631fe1b3cd1296",
"sha256:5ec74291ca1136b40f0379e1128ff80e866597e4e2c1e755739a913bbc3613c0" "sha256:edbc3f203427eef571f79a7692bb160a2b0f7ccaa31953e99bd17e307cf63f7d"
], ],
"version": "==2017.11.5" "version": "==2018.1.18"
}, },
"chardet": { "chardet": {
"hashes": [ "hashes": [
@ -49,10 +63,10 @@
}, },
"decorator": { "decorator": {
"hashes": [ "hashes": [
"sha256:95a26b17806e284452bfd97fa20aa1e8cb4ee23542bda4dbac5e4562aa1642cd", "sha256:94d1d8905f5010d74bbbd86c30471255661a14187c45f8d7f3e5aa8540fdb2e5",
"sha256:7cb64d38cb8002971710c8899fbdfb859a23a364b7c99dab19d1f719c2ba16b5" "sha256:7d46dd9f3ea1cf5f06ee0e4e1277ae618cf48dfb10ada7c8427cd46c42702a0e"
], ],
"version": "==4.1.2" "version": "==4.2.1"
}, },
"dj-database-url": { "dj-database-url": {
"hashes": [ "hashes": [
@ -63,10 +77,10 @@
}, },
"django": { "django": {
"hashes": [ "hashes": [
"sha256:af18618ce3291be5092893d8522fe3919661bf3a1fb60e3858ae74865a4f07c2", "sha256:7c8ff92285406fb349e765e9ade685eec7271d6f5c3f918e495a74768b765c99",
"sha256:9614851d4a7ff8cbd32b73c6076441f377c45a5bbff7e771798fb02c43c31f47" "sha256:dc3b61d054f1bced64628c62025d480f655303aea9f408e5996c339a543b45f0"
], ],
"version": "==2.0" "version": "==2.0.2"
}, },
"django-filter": { "django-filter": {
"hashes": [ "hashes": [
@ -75,6 +89,13 @@
], ],
"version": "==1.1.0" "version": "==1.1.0"
}, },
"django-storages": {
"hashes": [
"sha256:ab6be1538cf29511400bce83d0e5ca74d2e935cad82086063bcf5e7edacc1661",
"sha256:bc8e4c1f483608c5dd1212072fd41042f3ef2d2a2896ec4fb12dbc62c82996a0"
],
"version": "==1.6.5"
},
"django-widget-tweaks": { "django-widget-tweaks": {
"hashes": [ "hashes": [
"sha256:0e8e3b7ebd1aafb2250d0f7614cfbad27017b3c727858ee3aee23748dd1f147d", "sha256:0e8e3b7ebd1aafb2250d0f7614cfbad27017b3c727858ee3aee23748dd1f147d",
@ -89,6 +110,14 @@
], ],
"version": "==3.7.7" "version": "==3.7.7"
}, },
"docutils": {
"hashes": [
"sha256:7a4bd47eaf6596e1295ecb11361139febe29b084a87bf005bf899f9a42edc3c6",
"sha256:02aec4bd92ab067f6ff27a38a38a41173bf01bed8f89157768c1573f53e474a6",
"sha256:51e64ef2ebfb29cae1faa133b3710143496eca21c530f3f71424d77687764274"
],
"version": "==0.14"
},
"easy-thumbnails": { "easy-thumbnails": {
"hashes": [ "hashes": [
"sha256:e244d1f26027fc32c6ca60ffb0169a39099446f614b0433e907a2588ae7d9b95" "sha256:e244d1f26027fc32c6ca60ffb0169a39099446f614b0433e907a2588ae7d9b95"
@ -97,10 +126,10 @@
}, },
"faker": { "faker": {
"hashes": [ "hashes": [
"sha256:2f6ccc9da046d4cd20401734cf6a1ac73a4e4d8256e7b283496ee6827ad2eb60", "sha256:732ae449678a5c205ebc99e7e816f12eba6d6d1b02bd04d27ccf7edb2f4e6250",
"sha256:e928cf853ef69d7471421f2a3716a1239e43de0fa9855f4016ee0c9f1057328a" "sha256:0857a92773c9cc6356c4c0c2aaa6f6ec83be94fc14fc0fd9e31904498d6fd388"
], ],
"version": "==0.8.8" "version": "==0.8.11"
}, },
"gunicorn": { "gunicorn": {
"hashes": [ "hashes": [
@ -123,6 +152,13 @@
], ],
"version": "==0.2.0" "version": "==0.2.0"
}, },
"jmespath": {
"hashes": [
"sha256:f11b4461f425740a1d908e9a3f7365c3d2e569f6ca68a2ff8bc5bcd9676edd63",
"sha256:6a81d4c9aa62caf061cb517b4d9ad1dd300374cd4706997aff9cd6aedd61fc64"
],
"version": "==0.9.3"
},
"jsonschema": { "jsonschema": {
"hashes": [ "hashes": [
"sha256:000e68abd33c972a5248544925a0cae7d1125f9bf6c58280d37546b946769a08", "sha256:000e68abd33c972a5248544925a0cae7d1125f9bf6c58280d37546b946769a08",
@ -146,37 +182,31 @@
}, },
"numpy": { "numpy": {
"hashes": [ "hashes": [
"sha256:910e7ae5eeee8d322775187692c5c66719cd58d230fbfd57245ea3cf75716910", "sha256:e2335d56d2fd9fc4e3a3f2d3148aafec4962682375f429f05c45a64dacf19436",
"sha256:f5c9ca457057cd5e12ddab36cded8b1f38bf1f45bf550d4ca2839b11ec57f597", "sha256:9b762e78739b6e021124adbea07611682db99cd3fca7f3c3a8b98b8f74ea5699",
"sha256:d29e72413b66df23c75b9b469253c823698ea2e00f58e9e0df64b7a50696e8ac", "sha256:7d4c549e41507db4f04ec7cfab5597de8acf7871b16c9cf64cebcb9d39031ca6",
"sha256:539345898a4ae17421c159ae2a350901a5e6ce3da8f24168c6c67b3536e13de8", "sha256:b803306c4c201e7dcda0ce1b9a9c87f61a7c7ce43de2c60c8e56147b76849a1a",
"sha256:929928932f91082a168e36984179deddd58f8e98822ad2f33a2955d7c4eec596", "sha256:2da8dff91d489fea3e20155d41f4cd680de7d01d9a89fdd0ebb1bee6e72d3800",
"sha256:62b09f3d1ea01d79c16a6642cb21599f53b9338c59971b2418a573155d2202ec", "sha256:6b8c2daacbbffc83b4a2ba83a61aa3ce60c66340b07b962bd27b6c6bb175bee1",
"sha256:c4b1914d86c43399438518a2ac8bcba2fb64dd5a18efddded3783b9daae70933", "sha256:89b9419019c47ec87cf4cfca77d85da4611cc0be636ec87b5290346490b98450",
"sha256:6c6feb0647380db6e1d5d49ef9fb59c42240f25fb8df8b6e82ecb436c7e0621a", "sha256:49880b47d7272f902946dd995f346842c95fe275e2deb3082ef0495f0c718a69",
"sha256:da2f47e46d7a93b73891d1981378717dc73c6ad5cc4fd23c934bfea7847fa958", "sha256:3d7ddd5bdfb12ec9668edf1aa49a4a3eddb0db4661b57ea431477eb9a2468894",
"sha256:4c767b6d9c9a071bb36ea34eb240ee5192fe0bc4c13be5e6c51e0350a30f7ac0", "sha256:788e1757f8e409cd805a7cd82993cd9252fa19e334758a4c6eb5a8b334abb084",
"sha256:b2f98838f4bbc3bf23af7e97ffcad18a2dc6bbb0726796781e02b9347af6685f", "sha256:377def0873bbb1fbdedb14b3275b10a29b1b55619a3f7f775c4e7f9ce2461b9c",
"sha256:11fcbed36c101a3b9c4636e791efccba82409ebbedaba938c97be8bdddd029cc", "sha256:9501c9ccd081977ca5579a3ec4009d6baff6bacb04bf07214aade3324734195a",
"sha256:8969c8f987f8bcc3e30c014532cfc20e4a8f86a50c361596e086310853adacb7", "sha256:a1f5173df8190ef9c6235d260d70ca70c6fb029683ceb66e244c5cc6e335947a",
"sha256:2875e8055a1ea8d933b1c9d0f8714c0aa11c097bfadfcb8564c4d868fbf09a41", "sha256:12cf4b27039b88e407ad66894d99a957ef60fea0eeb442026af325add2ab264d",
"sha256:09b87d652c03508447d0f618e1d3ae57595acd3e0f0c11ac91bf68ed7bdb3a28", "sha256:4e2fc841c8c642f7fd44591ef856ca409cedba6aea27928df34004c533839eee",
"sha256:9cad35b911e150f00bb8080950c7e9f172714bbd0234f5ab74b4e3e2d9288b37", "sha256:e5ade7a69dccbd99c4fdbb95b6d091d941e62ffa588b0ed8fb0a2854118fef3f",
"sha256:479863de17f66810db00bccf35289555365da45d3b053ccf539b95ab3b9c24f6", "sha256:6b1011ffc87d7e2b1b7bcc6dc21bdf177163658746ef778dcd21bf0516b9126c",
"sha256:b162c6b044960b4ea0f42be049ce2af1d18c60f82748f0a27bd5ad182a731bf3", "sha256:a8bc80f69570e11967763636db9b24c1e3e3689881d10ae793cec74cf7a627b6",
"sha256:fa656dccfa9141774440575a6e7875d08b93f4a332eb5ae40877b26bed291c01", "sha256:81b9d8f6450e752bd82e7d9618fa053df8db1725747880e76fb09710b57f78d0",
"sha256:7dfa5b49fb2a080bd0d39bfbcff1177bacb14fcb28c857fd65fd0c18938935de", "sha256:e8522cad377cc2ef20fe13aae742cc265172910c98e8a0d6014b1a8d564019e2",
"sha256:e8e0e75db757e41463888939d26c8058b4ecd25e563c597e9119f512dc0ee1da", "sha256:a3d5dd437112292c707e54f47141be2f1100221242f07eda7bd8477f3ddc2252",
"sha256:c8dc6aa96882df6323bf9545934e37c6e05959bd789ae4b14d50509b093907aa", "sha256:c8000a6cbc5140629be8c038c9c9cdb3a1c85ff90bd4180ec99f0f0c73050b5e",
"sha256:36ee86d5adbabc4fa2643a073f93d5504bdfed37a149a3a49f4dde259f35a750" "sha256:fa0944650d5d3fb95869eaacd8eedbd2d83610c85e271bd9d3495ffa9bc4dc9c"
], ],
"version": "==1.13.3" "version": "==1.14.1"
},
"olefile": {
"hashes": [
"sha256:61f2ca0cd0aa77279eb943c07f607438edf374096b66332fae1ee64a6f0f73ad"
],
"version": "==0.44"
}, },
"pandas": { "pandas": {
"hashes": [ "hashes": [
@ -209,97 +239,87 @@
}, },
"pillow": { "pillow": {
"hashes": [ "hashes": [
"sha256:cc6a5ed5b8f9d2f25e4e42d562e0ec4df3ce838f9e9b9d9d9b65fac6fe93a4cc", "sha256:718ec7a122b28d64afc5fbc3a9b99bb0545ef511373cac06fe7624520e82cb20",
"sha256:54898190b538a6c8fa4228e866ff2e7609da1ba9fd1d9cc5dc8ca591d37ce0a8", "sha256:801cca8923508311bf5d6d0f7da5362552e8208ebd8ec0d7b9f2cd2ff5705734",
"sha256:a336596b06e062b92eb8201a3b5dff07ae01c3a5d08ce5539d2da49b123f2be6", "sha256:43334f9581cd067945b8898cef9eb5714ee4883f8de0304c011f1dbdb1d4e2aa",
"sha256:922aeb050bd52d8ce9531ab57fd2440bfe975900e8700fec385fb741c3c557c7", "sha256:153ec6f18f7b61641e0e6e502acfaf4a06c9aba2ea11c0b4b3578ea9f13a4a4a",
"sha256:6d814aa655d94c63547fc3208cb6ab886ff1a64c543b31f52658663b1bb3f011", "sha256:25193f934d37d836a6b1f4c062ce574a96cbca7c6d9dc8ddfbbac7f9c54deaa4",
"sha256:e66080685863444738f08e13081c287e340b6e4f8bd674a2e0da967776ac6f46", "sha256:b85f703c2ffe539313e39ce0676bed0f355cec45a16e58c9ab7417445843047c",
"sha256:575a9b3468c82f38be0419cd39d35001ae95a0cc5226534e45430035fecef583", "sha256:8580fc58074a16b749905b26cf8363f7b628dd167ba0130f5382cdc91c86b509",
"sha256:4fb8ab0f8895fb946454ef6ffe806f49ee387095f2d6112ae24670e5fb8fbcd9", "sha256:2fcde9954c8882d1c7f93bb828caa34a4c5e3ee69dbc7895dc8652ad972b455a",
"sha256:1d742642d01914b7e0cf6fd597a51f57d21fd68f794cf84803e03e72db78a261", "sha256:1a5b93084e01328a1cb1ecdad99d11d75e881e89a95f88d85b523646553b36c2",
"sha256:59cef683d79b85d55a950c1e61dc7b6be0c45a5074692746354cd9a8ace1cd17", "sha256:b2240f298482f823576f397bb9f32ea913ad9456c526e141bc6f0a022b37a3e8",
"sha256:822e4fc261d12fa44d88dadee0e93d59663db94d962d4ffffbf09b1fe5e5be51", "sha256:b1d33c63a55d0d85df0ad02b2c16158fb4d8153afa7b908f1a67330fac694cd6",
"sha256:a6f43511c79bed431ec2b56e55150b5222c732cd9e5f80e77a44e068e94c71fc", "sha256:6977cf073d83358b34f93abf5c1f1193b88675fe0e4441e0e28318bc3dcba7a0",
"sha256:2046a2001e2c413998951cc28aa0dbfd4cff846a12e24c2145d42630d5104094", "sha256:1912b7230459fd53682dae32b83cbd8e5d642ba36d4be18566f00a9c063aa13d",
"sha256:39c7c9dcf64430091e30ef14d4191b4cae9b7b5ff29762357730aac4866fb189", "sha256:4bd4a71501b6d51db4abc07e1f43f5a6fed0a1a9583cca0b401d6af50284b0db",
"sha256:f2d71951f473744ac617b645b62d0c4df5372ef4618c425646bfe5e2e8878e61", "sha256:0013f590a8f260df60bcfd65db19d18efc04e7f046c3c82a40e2e2b3292a937c",
"sha256:9adcfa2477b7e279ebeee75b49f535518201bbd7d26ca2ef1cf6751cb6e658e8", "sha256:a224651a81e45ef4f1d0164e256c5f6b4abb49f2ae8f22ba2f3a9d0ff338e608",
"sha256:0e3b56364a2c772c961a8faad8a835d3f24d8848310de035c9e07cc006035cbc", "sha256:c793dfaa130847ccff958492b76ae8b9304e60b8a79a92962cb19e368276a22b",
"sha256:92087cb92a968421f42235f7d8153f4766b6ba213a6efb36b8060f3c9d294569", "sha256:0b899ee80920bb533f26581af9b4660bc12aff4562555afe74e429101ebf3c94",
"sha256:53eaec751151b5713a15b1cd62b06d0fc16d72f56623c15448728c554c30770b", "sha256:9525cd680a6f9e80c6c0af03cf973e6505c59f60b4745f682cd1a449e54b31bb",
"sha256:e595312f67962d6b4fde3b7dffaaaca4becefa522d677676bb57b0ec5f8f921a", "sha256:35f7d998b8e82fb3fb51ff88b30485eb81cd7dd56ec7e1a8deba23eb88532d44",
"sha256:dc32362d0cadf18c3aef7040455760106cafe7dd3c211dc27c507e746376bb56", "sha256:5b0d657460d9f3615876fec6306e97ca15a471f6169b622d76a47e270998acf1",
"sha256:759e5e3e99c4ac87b99e9288a75236c63173d1bb24c8d3f9d9d2c8332fceeb0a", "sha256:ddd16ab250b4fc97db1c47407e78c25216a75c29d29d10ad37e51b7a2ec7b2c3",
"sha256:b13106cb83a3b7d1a02fafb94bfafbc980465ba948b76ea1996245959c6783d2", "sha256:b9f63451084a718eccdeb1e382768c94647915653af4d6019f64560d9e98642b",
"sha256:9184b9788a9cf677e53626a4dc141136a22d349a5480479b98defd3cfb5015a4", "sha256:a370d1c570f1d72e877099651e752332444b1c5009381f043c9da5fd47f3ebae",
"sha256:be803fae6af36639524a0f6861a8cface67bbec66c3416c3eaf592f1d45b8b20", "sha256:dc4b018d5c9b636f7546583c5591b9ea00c328c3e5871992ef5b95bac353f097",
"sha256:effa82e72f5064439a3d2c7ff615b999eb1c4d65bb1f1e6ee6e2ddb345b3e81e", "sha256:e126ff4fed71e78333840c07279e1617f63cfca76d63ad5b27d65a7277206a3d",
"sha256:9dc002a914cefa710dcb9fb204d34f6cd822662047a6038178f5fc9bfa7be961", "sha256:fcf64c91fd44485100a2965d23bb0e227d093e91f7e776c5ca3b32574766eb56",
"sha256:7b3cf7a80608ed661b77793f64e1f2bd1e77136ad0b750aa2c81fac9c7e2c785", "sha256:2c042352b430d678db50c78c5214e19638eff8b688941271da2de21fd298dfe5",
"sha256:a9bad3405a642649e68568fe9832e8f6ae585354ab0b4ae250816ead11a553a2", "sha256:17fe25efc785194d48c38fad85dce470013ba19d2fb66639e149f14bccf1327f",
"sha256:4d3dbd93b131013a71b2e98530dd4945a03c7994d42381e44a921dd8bec300bc", "sha256:2e818dbe445e86fc6c266973fe540c35125c42eb2cf13a6095e9adaa89c0deb5",
"sha256:9a1514bee2e32e0d4c0f55ba7a20f4387f883e37c7d2db64ca50449ffebe86cc", "sha256:135e9aa65150c53f7db85bf2bebb8a0e1a48ea850e80cf66e16dd04fa09d309c",
"sha256:a9721fe1f6fdfe0c108ea81b1a05dc216f1ec5bb65ef1de1d85fd00494d019e0", "sha256:7dfbefdb3fb911ca9faed307bf309861e9995e36cca6b761c7ba6d9b77a9744a",
"sha256:e75d745306ec8aac0e6903358fdfc7fb6854febe551ed753ee7a1cad058b61bb", "sha256:12f29d6c23424f704c66b5b68c02fe0b571504459605cfe36ab8158359b0e1bb",
"sha256:ccc9c1f5ba413fc5ee09bc78de7dd2ad8e189edb48f3bc38acedd04a7f43a0c1", "sha256:f8d49be8c282df8d2e1ab6ab53ab8abd859b1fa6fed384457ee85c9eff64ef97",
"sha256:150e24462fd106074a9a63417a55fbb0c633716cef9511f1bd7a773972de14f4", "sha256:82b172e3264e62372c01b5b009b5b1a02fbb9276cbe5cc57ab00a6d6e5ed9a18",
"sha256:250d8470661fd657c2583672ab5139f40e7f2ef28ecdc90f87563af0b27f6fba", "sha256:57aa6198ba8acba1313c3b743e267d821a60cac77e6026caf0b55ca58d3d23be",
"sha256:a97c715d44efd5b4aa8d739b8fad88b93ed79f1b33fc2822d5802043f3b1b527", "sha256:d60c1625b108432ace8b1fa1a584017e5efa73f107d0f493c7f39c79bebf1d41",
"sha256:dbefe5aa0882f00f12eceb3fb7df57105cd87fae767ca025db4685b7577c2390", "sha256:82d1ff571489765df2816785d532e243bde213752156c227fca595723ec5ff42",
"sha256:62a7bbf0a1120ff07a99ddedd383779a8d80bd9d363f3964b2b43a26cef6ea50", "sha256:37cc0339abfa9e295c75d9a7f227d35cb44716feb95057f9449c4a9e9a17daf7",
"sha256:42b4a67949085ddd4559c3c716a00a275fb45cb2c3a3aeec95c4b94419b7c243", "sha256:931030d1d6282b7900e6b0a7ff9ecdb503b5e1e6781800dab2b71a9f39405bff",
"sha256:0ac037e6c1746d63a1ea354f0d5974d8f3f984fc0333be373ad193711a89b1e9", "sha256:5cd36804f9f06a914a883fe682df5711d16d7b4f44d43189c5f013e7cd91e149"
"sha256:8989cbf10ea07fc9982ec86116f6234bb3e44da481874ac94650d6176f60106f",
"sha256:77834551d3e928f3da922ce9dfb5c8db46758ea2f2922d4c5835a5b67a222aff",
"sha256:c00301e807084706bd46a1c56694ee235debe68eaf482c0186edfe07b93a9f6a",
"sha256:0163bd681d3488e2e9c26f4fbbfefcfb7f32259c431bfd2c3bc25574708a8b8c",
"sha256:223b06c337d8d60fb65af3b540ab1fa4644931d61d1fddf6e32f7a0e496685f2",
"sha256:1ab641cb7daf88e88ede8d3b89b7bd68a7099d8671160492d5e6845e24426080"
], ],
"version": "==4.3.0" "version": "==5.0.0"
}, },
"plotly": { "plotly": {
"hashes": [ "hashes": [
"sha256:dadd2263f1c0449b248fd3742a077d9594935921a9597529be76d6a841237ab0" "sha256:f588991dce15437debd825eca935c8cfbabf438cdc0dcd2ce7a88f429d982f69"
], ],
"version": "==2.2.3" "version": "==2.4.1"
}, },
"psycopg2": { "psycopg2": {
"hashes": [ "hashes": [
"sha256:594aa9a095de16614f703d759e10c018bdffeafce2921b8e80a0e8a0ebbc12e5", "sha256:aeaba399254ca79c299d9fe6aa811d3c3eac61458dee10270de7f4e71c624998",
"sha256:1cf5d84290c771eeecb734abe2c6c3120e9837eb12f99474141a862b9061ac51", "sha256:1d90379d01d0dc50ae9b40c863933d87ff82d51dd7d52cea5d1cb7019afd72cd",
"sha256:0344b181e1aea37a58c218ccb0f0f771295de9aa25a625ed076e6996c6530f9e", "sha256:36030ca7f4b4519ee4f52a74edc4ec73c75abfb6ea1d80ac7480953d1c0aa3c3",
"sha256:25250867a4cd1510fb755ef9cb38da3065def999d8e92c44e49a39b9b76bc893", "sha256:7cbc3b21ce2f681ca9ad2d8c0901090b23a30c955e980ebf1006d41f37068a95",
"sha256:317612d5d0ca4a9f7e42afb2add69b10be360784d21ce4ecfbca19f1f5eadf43", "sha256:b178e0923c93393e16646155794521e063ec17b7cc9f943f15b7d4b39776ea2c",
"sha256:9d6266348b15b4a48623bf4d3e50445d8e581da413644f365805b321703d0fac", "sha256:fe6a7f87356116f5ea840c65b032af17deef0e1a5c34013a2962dd6f99b860dd",
"sha256:ddca39cc55877653b5fcf59976d073e3d58c7c406ef54ae8e61ddf8782867182", "sha256:6f302c486132f8dd11f143e919e236ea4467d53bf18c451cac577e6988ecbd05",
"sha256:988d2ec7560d42ef0ac34b3b97aad14c4f068792f00e1524fa1d3749fe4e4b64", "sha256:888bba7841116e529f407f15c6d28fe3ef0760df8c45257442ec2f14f161c871",
"sha256:7a9c6c62e6e05df5406e9b5235c31c376a22620ef26715a663cee57083b3c2ea", "sha256:932a4c101af007cb3132b1f8a9ffef23386acc53dad46536dc5ba43a3235ae02",
"sha256:7a75565181e75ba0b9fb174b58172bf6ea9b4331631cfe7bafff03f3641f5d73", "sha256:179c52eb870110a8c1b460c86d4f696d58510ea025602cd3f81453746fccb94f",
"sha256:94e4128ba1ea56f02522fffac65520091a9de3f5c00da31539e085e13db4771b", "sha256:33f9e1032095e1436fa9ec424abcbd4c170da934fb70e391c5d78275d0307c75",
"sha256:92179bd68c2efe72924a99b6745a9172471931fc296f9bfdf9645b75eebd6344", "sha256:092a80da1b052a181b6e6c765849c9b32d46c5dac3b81bf8c9b83e697f3cdbe8",
"sha256:b9358e203168fef7bfe9f430afaed3a2a624717a1d19c7afa7dfcbd76e3cd95c", "sha256:f3d3a88128f0c219bdc5b2d9ccd496517199660cea021c560a3252116df91cbd",
"sha256:009e0bc09a57dbef4b601cb8b46a2abad51f5274c8be4bba276ff2884cd4cc53", "sha256:19983b77ec1fc2a210092aa0333ee48811fd9fb5f194c6cd5b927ed409aea5f8",
"sha256:d3ac07240e2304181ffdb13c099840b5eb555efc7be9344503c0c03aa681de79", "sha256:027ae518d0e3b8fff41990e598bc7774c3d08a3a20e9ecc0b59fb2aaaf152f7f",
"sha256:40fa5630cd7d237cd93c4d4b64b9e5ed9273d1cfce55241c7f9066f5db70629d", "sha256:363fbbf4189722fc46779be1fad2597e2c40b3f577dc618f353a46391cf5d235",
"sha256:6c2f1a76a9ebd9ecf7825b9e20860139ca502c2bf1beabf6accf6c9e66a7e0c3", "sha256:d74cf9234ba76426add5e123449be08993a9b13ff434c6efa3a07caa305a619f",
"sha256:37f54452c7787dbdc0a634ca9773362b91709917f0b365ed14b831f03cbd34ba", "sha256:32702e3bd8bfe12b36226ba9846ed9e22336fc4bd710039d594b36bd432ae255",
"sha256:8f5942a4daf1ffac42109dc4a72f786af4baa4fa702ede1d7c57b4b696c2e7d6", "sha256:8eb94c0625c529215b53c08fb4e461546e2f3fc96a49c13d5474b5ad7aeab6cf",
"sha256:bf708455cd1e9fa96c05126e89a0c59b200d086c7df7bbafc7d9be769e4149a3", "sha256:8ebba5314c609a05c6955e5773c7e0e57b8dd817e4f751f30de729be58fa5e78",
"sha256:82c40ea3ac1555e0462803380609fbe8b26f52620f3d4f8eb480cfd8ceed8a14", "sha256:27467fd5af1dcc0a82d72927113b8f92da8f44b2efbdb8906bd76face95b596d",
"sha256:207ba4f9125a0a4200691e82d5eee7ea1485708eabe99a07fc7f08696fae62f4", "sha256:b68e89bb086a9476fa85298caab43f92d0a6af135a5f433d1f6b6d82cafa7b55",
"sha256:0cd4c848f0e9d805d531e44973c8f48962e20eb7fc0edac3db4f9dbf9ed5ab82", "sha256:0b9851e798bae024ed1a2a6377a8dab4b8a128a56ed406f572f9f06194e4b275",
"sha256:57baf63aeb2965ca4b52613ce78e968b6d2bde700c97f6a7e8c6c236b51ab83e", "sha256:733166464598c239323142c071fa4c9b91c14359176e5ae7e202db6bcc1d2eb5",
"sha256:2954557393cfc9a5c11a5199c7a78cd9c0c793a047552d27b1636da50d013916", "sha256:ad75fe10bea19ad2188c5cb5fc4cdf53ee808d9b44578c94a3cd1e9fc2beb656",
"sha256:7c31dade89634807196a6b20ced831fbd5bec8a21c4e458ea950c9102c3aa96f", "sha256:8966829cb0d21a08a3c5ac971a2eb67c3927ae27c247300a8476554cc0ce2ae8",
"sha256:1286dd16d0e46d59fa54582725986704a7a3f3d9aca6c5902a7eceb10c60cb7e", "sha256:8bf51191d60f6987482ef0cfe8511bbf4877a5aa7f313d7b488b53189cf26209"
"sha256:697ff63bc5451e0b0db48ad205151123d25683b3754198be7ab5fcb44334e519",
"sha256:fc993c9331d91766d54757bbc70231e29d5ceb2d1ac08b1570feaa0c38ab9582",
"sha256:9d64fed2681552ed642e9c0cc831a9e95ab91de72b47d0cb68b5bf506ba88647",
"sha256:5c3213be557d0468f9df8fe2487eaf2990d9799202c5ff5cb8d394d09fad9b2a"
], ],
"version": "==2.7.3.2" "version": "==2.7.4"
}, },
"python-dateutil": { "python-dateutil": {
"hashes": [ "hashes": [
@ -317,17 +337,17 @@
}, },
"pytz": { "pytz": {
"hashes": [ "hashes": [
"sha256:80af0f3008046b9975242012a985f04c5df1f01eed4ec1633d56cc47a75a6a48", "sha256:ed6509d9af298b7995d69a440e2822288f2eca1681b8cce37673dbb10091e5fe",
"sha256:feb2365914948b8620347784b6b6da356f31c9d03560259070b2f30cff3d469d", "sha256:f93ddcdd6342f94cea379c73cddb5724e0d6d0a1c91c9bdef364dc0368ba4fda",
"sha256:59707844a9825589878236ff2f4e0dc9958511b7ffaae94dc615da07d4a68d33", "sha256:61242a9abc626379574a166dc0e96a66cd7c3b27fc10868003fa210be4bff1c9",
"sha256:d0ef5ef55ed3d37854320d4926b04a4cb42a2e88f71da9ddfdacfde8e364f027", "sha256:ba18e6a243b3625513d85239b3e49055a2f0318466e0b8a92b8fb8ca7ccdf55f",
"sha256:c41c62827ce9cafacd6f2f7018e4f83a6f1986e87bfd000b8cfbd4ab5da95f1a", "sha256:07edfc3d4d2705a20a6e99d97f0c4b61c800b8232dc1c04d87e8554f130148dd",
"sha256:8cc90340159b5d7ced6f2ba77694d946fc975b09f1a51d93f3ce3bb399396f94", "sha256:3a47ff71597f821cd84a162e71593004286e5be07a340fd462f0d33a760782b5",
"sha256:dd2e4ca6ce3785c8dd342d1853dd9052b19290d5bf66060846e5dc6b8d6667f7", "sha256:5bd55c744e6feaa4d599a6cbd8228b4f8f9ba96de2c38d56f08e534b3c9edf0d",
"sha256:699d18a2a56f19ee5698ab1123bbcc1d269d061996aeb1eda6d89248d3542b82", "sha256:887ab5e5b32e4d0c86efddd3d055c1f363cbaa583beb8da5e22d2fa2f64d51ef",
"sha256:fae4cffc040921b8a2d60c6cf0b5d662c1190fe54d718271db4eb17d44a185b7" "sha256:410bcd1d6409026fbaa65d9ed33bf6dd8b1e94a499e32168acfc7b332e4095c0"
], ],
"version": "==2017.3" "version": "==2018.3"
}, },
"requests": { "requests": {
"hashes": [ "hashes": [
@ -336,6 +356,13 @@
], ],
"version": "==2.18.4" "version": "==2.18.4"
}, },
"s3transfer": {
"hashes": [
"sha256:c7a9ec356982d5e9ab2d4b46391a7d6a950e2b04c472419f5fdec70cc0ada72f",
"sha256:90dc18e028989c609146e241ea153250be451e05ecc0c2832565231dacdf59c1"
],
"version": "==0.1.13"
},
"six": { "six": {
"hashes": [ "hashes": [
"sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb", "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb",
@ -345,10 +372,10 @@
}, },
"text-unidecode": { "text-unidecode": {
"hashes": [ "hashes": [
"sha256:02efd86b9c0f489f858d8cead62e94d3760dab444054b258734716f7602330a3", "sha256:801e38bd550b943563660a91de8d4b6fa5df60a542be9093f7abf819f86050cc",
"sha256:d0afd5e8a7ac69bfb1372e1bbfa3c63c22e3db8ae1284690e96b45c4430d08d0" "sha256:5a1375bb2ba7968740508ae38d92e1f889a0832913cb1c447d5e2046061a396d"
], ],
"version": "==1.1" "version": "==1.2"
}, },
"traitlets": { "traitlets": {
"hashes": [ "hashes": [
@ -375,10 +402,10 @@
"develop": { "develop": {
"certifi": { "certifi": {
"hashes": [ "hashes": [
"sha256:244be0d93b71e93fc0a0a479862051414d0e00e16435707e5bf5000f92e04694", "sha256:14131608ad2fd56836d33a71ee60fa1c82bc9d2c8d98b7bdbc631fe1b3cd1296",
"sha256:5ec74291ca1136b40f0379e1128ff80e866597e4e2c1e755739a913bbc3613c0" "sha256:edbc3f203427eef571f79a7692bb160a2b0f7ccaa31953e99bd17e307cf63f7d"
], ],
"version": "==2017.11.5" "version": "==2018.1.18"
}, },
"chardet": { "chardet": {
"hashes": [ "hashes": [
@ -389,48 +416,44 @@
}, },
"coverage": { "coverage": {
"hashes": [ "hashes": [
"sha256:d1ee76f560c3c3e8faada866a07a32485445e16ed2206ac8378bd90dadffb9f0", "sha256:7608a3dd5d73cb06c531b8925e0ef8d3de31fed2544a7de6c63960a1e73ea4bc",
"sha256:007eeef7e23f9473622f7d94a3e029a45d55a92a1f083f0f3512f5ab9a669b05", "sha256:3a2184c6d797a125dca8367878d3b9a178b6fdd05fdc2d35d758c3006a1cd694",
"sha256:17307429935f96c986a1b1674f78079528833410750321d22b5fb35d1883828e", "sha256:f3f501f345f24383c0000395b26b726e46758b71393267aeae0bd36f8b3ade80",
"sha256:845fddf89dca1e94abe168760a38271abfc2e31863fbb4ada7f9a99337d7c3dc", "sha256:0b136648de27201056c1869a6c0d4e23f464750fd9a9ba9750b8336a244429ed",
"sha256:3f4d0b3403d3e110d2588c275540649b1841725f5a11a7162620224155d00ba2", "sha256:337ded681dd2ef9ca04ef5d93cfc87e52e09db2594c296b4a0a3662cb1b41249",
"sha256:4c4f368ffe1c2e7602359c2c50233269f3abe1c48ca6b288dcd0fb1d1c679733", "sha256:3eb42bf89a6be7deb64116dd1cc4b08171734d721e7a7e57ad64cc4ef29ed2f1",
"sha256:f8c55dd0f56d3d618dfacf129e010cbe5d5f94b6951c1b2f13ab1a2f79c284da", "sha256:be6cfcd8053d13f5f5eeb284aa8a814220c3da1b0078fa859011c7fffd86dab9",
"sha256:cdd92dd9471e624cd1d8c1a2703d25f114b59b736b0f1f659a98414e535ffb3d", "sha256:69bf008a06b76619d3c3f3b1983f5145c75a305a0fea513aca094cae5c40a8f5",
"sha256:2ad357d12971e77360034c1596011a03f50c0f9e1ecd12e081342b8d1aee2236", "sha256:2eb564bbf7816a9d68dd3369a510be3327f1c618d2357fa6b1216994c2e3d508",
"sha256:e9a0e1caed2a52f15c96507ab78a48f346c05681a49c5b003172f8073da6aa6b", "sha256:9d6dd10d49e01571bf6e147d3b505141ffc093a06756c60b053a859cb2128b1f",
"sha256:eea9135432428d3ca7ee9be86af27cb8e56243f73764a9b6c3e0bda1394916be", "sha256:701cd6093d63e6b8ad7009d8a92425428bc4d6e7ab8d75efbb665c806c1d79ba",
"sha256:700d7579995044dc724847560b78ac786f0ca292867447afda7727a6fbaa082e", "sha256:5a13ea7911ff5e1796b6d5e4fbbf6952381a611209b736d48e675c2756f3f74e",
"sha256:66f393e10dd866be267deb3feca39babba08ae13763e0fc7a1063cbe1f8e49f6", "sha256:c1bb572fab8208c400adaf06a8133ac0712179a334c09224fb11393e920abcdd",
"sha256:5ff16548492e8a12e65ff3d55857ccd818584ed587a6c2898a9ebbe09a880674", "sha256:03481e81d558d30d230bc12999e3edffe392d244349a90f4ef9b88425fac74ba",
"sha256:d00e29b78ff610d300b2c37049a41234d48ea4f2d2581759ebcf67caaf731c31", "sha256:28b2191e7283f4f3568962e373b47ef7f0392993bb6660d079c62bd50fe9d162",
"sha256:87d942863fe74b1c3be83a045996addf1639218c2cb89c5da18c06c0fe3917ea", "sha256:de4418dadaa1c01d497e539210cb6baa015965526ff5afc078c57ca69160108d",
"sha256:358d635b1fc22a425444d52f26287ae5aea9e96e254ff3c59c407426f44574f4", "sha256:8c3cb8c35ec4d9506979b4cf90ee9918bc2e49f84189d9bf5c36c0c1119c6558",
"sha256:81912cfe276e0069dca99e1e4e6be7b06b5fc8342641c6b472cb2fed7de7ae18", "sha256:7e1fe19bd6dce69d9fd159d8e4a80a8f52101380d5d3a4d374b6d3eae0e5de9c",
"sha256:079248312838c4c8f3494934ab7382a42d42d5f365f0cf7516f938dbb3f53f3f", "sha256:6bc583dc18d5979dc0f6cec26a8603129de0304d5ae1f17e57a12834e7235062",
"sha256:b0059630ca5c6b297690a6bf57bf2fdac1395c24b7935fd73ee64190276b743b", "sha256:198626739a79b09fa0a2f06e083ffd12eb55449b5f8bfdbeed1df4910b2ca640",
"sha256:493082f104b5ca920e97a485913de254cbe351900deed72d4264571c73464cd0", "sha256:7aa36d2b844a3e4a4b356708d79fd2c260281a7390d678a10b91ca595ddc9e99",
"sha256:e3ba9b14607c23623cf38f90b23f5bed4a3be87cbfa96e2e9f4eabb975d1e98b", "sha256:3d72c20bd105022d29b14a7d628462ebdc61de2f303322c0212a054352f3b287",
"sha256:82cbd3317320aa63c65555aa4894bf33a13fb3a77f079059eb5935eea415938d", "sha256:4635a184d0bbe537aa185a34193898eee409332a8ccb27eea36f262566585000",
"sha256:9721f1b7275d3112dc7ccf63f0553c769f09b5c25a26ee45872c7f5c09edf6c1", "sha256:e05cb4d9aad6233d67e0541caa7e511fa4047ed7750ec2510d466e806e0255d6",
"sha256:bd4800e32b4c8d99c3a2c943f1ac430cbf80658d884123d19639bcde90dad44a", "sha256:76ecd006d1d8f739430ec50cc872889af1f9c1b6b8f48e29941814b09b0fd3cc",
"sha256:f29841e865590af72c4b90d7b5b8e93fd560f5dea436c1d5ee8053788f9285de", "sha256:7d3f553904b0c5c016d1dad058a7554c7ac4c91a789fca496e7d8347ad040653",
"sha256:f3a5c6d054c531536a83521c00e5d4004f1e126e2e2556ce399bef4180fbe540", "sha256:3c79a6f7b95751cdebcd9037e4d06f8d5a9b60e4ed0cd231342aa8ad7124882a",
"sha256:dd707a21332615108b736ef0b8513d3edaf12d2a7d5fc26cd04a169a8ae9b526", "sha256:56e448f051a201c5ebbaa86a5efd0ca90d327204d8b059ab25ad0f35fbfd79f1",
"sha256:2e1a5c6adebb93c3b175103c2f855eda957283c10cf937d791d81bef8872d6ca", "sha256:ac4fef68da01116a5c117eba4dd46f2e06847a497de5ed1d64bb99a5fda1ef91",
"sha256:f87f522bde5540d8a4b11df80058281ac38c44b13ce29ced1e294963dd51a8f8", "sha256:1c383d2ef13ade2acc636556fd544dba6e14fa30755f26812f54300e401f98f2",
"sha256:a7cfaebd8f24c2b537fa6a271229b051cdac9c1734bb6f939ccfc7c055689baa", "sha256:b8815995e050764c8610dbc82641807d196927c3dbed207f0a079833ffcf588d",
"sha256:309d91bd7a35063ec7a0e4d75645488bfab3f0b66373e7722f23da7f5b0f34cc", "sha256:104ab3934abaf5be871a583541e8829d6c19ce7bde2923b2751e0d3ca44db60a",
"sha256:0388c12539372bb92d6dde68b4627f0300d948965bbb7fc104924d715fdc0965", "sha256:9e112fcbe0148a6fa4f0a02e8d58e94470fc6cb82a5481618fea901699bf34c4",
"sha256:ab3508df9a92c1d3362343d235420d08e2662969b83134f8a97dc1451cbe5e84", "sha256:15b111b6a0f46ee1a485414a52a7ad1d703bdf984e9ed3c288a4414d3871dcbd",
"sha256:43a155eb76025c61fc20c3d03b89ca28efa6f5be572ab6110b2fb68eda96bfea", "sha256:e4d96c07229f58cb686120f168276e434660e4358cc9cf3b0464210b04913e77",
"sha256:f98b461cb59f117887aa634a66022c0bd394278245ed51189f63a036516e32de", "sha256:f8a923a85cb099422ad5a2e345fe877bbc89a8a8b23235824a93488150e45f6e"
"sha256:b6cebae1502ce5b87d7c6f532fa90ab345cfbda62b95aeea4e431e164d498a3d",
"sha256:a4497faa4f1c0fc365ba05eaecfb6b5d24e3c8c72e95938f9524e29dadb15e76",
"sha256:2b4d7f03a8a6632598cbc5df15bbca9f778c43db7cf1a838f4fa2c8599a8691a",
"sha256:1afccd7e27cac1b9617be8c769f6d8a6d363699c9b86820f40c74cfb3328921c"
], ],
"version": "==4.4.2" "version": "==4.5.1"
}, },
"coveralls": { "coveralls": {
"hashes": [ "hashes": [

180
README.md
View File

@ -6,7 +6,7 @@
[![Gitter](https://img.shields.io/gitter/room/nwjs/nw.js.svg)](https://gitter.im/babybuddy/Lobby) [![Gitter](https://img.shields.io/gitter/room/nwjs/nw.js.svg)](https://gitter.im/babybuddy/Lobby)
A buddy for babies! Helps caregivers track sleep, feedings, diaper changes, and A buddy for babies! Helps caregivers track sleep, feedings, diaper changes, and
tummy time to learn about and predict baby's needs without (*as much*) guess tummy time to learn about and predict baby's needs without (*as much*) guess
work. work.
![Baby Buddy desktop view](screenshot.png) ![Baby Buddy desktop view](screenshot.png)
@ -42,7 +42,7 @@ The demo instance resets every hour. Login credentials are:
## Deployment ## Deployment
The default user name and password for Baby Buddy is `admin`/`admin`. For any The default user name and password for Baby Buddy is `admin`/`admin`. For any
deployment, **log in and change the default admin password immediately**. deployment, **log in and change the default admin password immediately**.
Many of Baby Buddy's configuration settings can be controlled using environment Many of Baby Buddy's configuration settings can be controlled using environment
@ -51,7 +51,7 @@ variables - see [Configuration](#configuration) for detailed information.
### AWS Elastic Beanstalk ### AWS Elastic Beanstalk
A basic [Elastic Beanstalk](https://aws.amazon.com/elasticbeanstalk/) A basic [Elastic Beanstalk](https://aws.amazon.com/elasticbeanstalk/)
configuration is provided in `.ebextensions/babybuddy.config`. The steps configuration is provided in `.ebextensions/babybuddy.config`. The steps
below are a rough guide to deployment. See [Working with Python](http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create-deploy-python-apps.html) below are a rough guide to deployment. See [Working with Python](http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create-deploy-python-apps.html)
for detailed information. for detailed information.
@ -62,7 +62,7 @@ for detailed information.
1. Enter the cloned/downloaded directory 1. Enter the cloned/downloaded directory
cd babybuddy cd babybuddy
1. Change the `SECRET_KEY` value to something random in `.ebextensions/babybuddy.config` 1. Change the `SECRET_KEY` value to something random in `.ebextensions/babybuddy.config`
1. [Create an IAM user](http://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html) in AWS with EB, EC2, RDS and S3 privileges. 1. [Create an IAM user](http://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html) in AWS with EB, EC2, RDS and S3 privileges.
@ -70,17 +70,17 @@ for detailed information.
1. Initialize the Elastic Bean application (using the IAM user from the previous step) 1. Initialize the Elastic Bean application (using the IAM user from the previous step)
eb init -p python-3.6 eb init -p python-3.6
1. Create/deploy the environment! :rocket: 1. Create/deploy the environment! :rocket:
eb create -db -db.engine postgres eb create -db -db.engine postgres
The create command will also do an initial deployment. Run `eb deploy` to The create command will also do an initial deployment. Run `eb deploy` to
redeploy the app (e.g. if there are errors or settings are changed). redeploy the app (e.g. if there are errors or settings are changed).
### Docker ### Docker
A Docker deploy requires [Docker](http://docker.com/) and A Docker deploy requires [Docker](http://docker.com/) and
[Docker Compose](https://docs.docker.com/compose/overview/) to create two [Docker Compose](https://docs.docker.com/compose/overview/) to create two
containers - one for the database and one for the application. Baby Buddy uses a containers - one for the database and one for the application. Baby Buddy uses a
[multi-stage build](https://docs.docker.com/engine/userguide/eng-image/multistage-build/), [multi-stage build](https://docs.docker.com/engine/userguide/eng-image/multistage-build/),
@ -91,14 +91,14 @@ which requires Docker version 17.05 or newer.
cp docker.env.example docker.env cp docker.env.example docker.env
editor docker.env editor docker.env
*See [Configuration](#configuration) for other settings that can be *See [Configuration](#configuration) for other settings that can be
controlled by environment variables added to the `docker.env` file.* controlled by environment variables added to the `docker.env` file.*
1. Build/run the application 1. Build/run the application
docker-compose up -d docker-compose up -d
1. Initialize the database *(first run/after updates)* 1. Initialize the database *(first run/after updates)*
docker-compose exec app python manage.py migrate docker-compose exec app python manage.py migrate
@ -106,16 +106,16 @@ which requires Docker version 17.05 or newer.
1. Initialize static assets *(first run/after updates)* 1. Initialize static assets *(first run/after updates)*
docker-compose exec app python manage.py collectstatic docker-compose exec app python manage.py collectstatic
The app should now be locally available at The app should now be locally available at
[http://127.0.0.1:8000](http://127.0.0.1:8000). See [http://127.0.0.1:8000](http://127.0.0.1:8000). See
[Get Started, Part 6: Deploy your app](https://docs.docker.com/get-started/part6/) [Get Started, Part 6: Deploy your app](https://docs.docker.com/get-started/part6/)
for detailed information about how to deployment methods with Docker. for detailed information about how to deployment methods with Docker.
### Nanobox ### Nanobox
An example [Nanobox](https://nanobox.io/) configuration, `boxfile.yml`, is An example [Nanobox](https://nanobox.io/) configuration, `boxfile.yml`, is
provided with Baby Buddy. The steps below are a rough guide to deployment. See provided with Baby Buddy. The steps below are a rough guide to deployment. See
[Create and Deploy a Custom Django App](https://guides.nanobox.io/python/django/) [Create and Deploy a Custom Django App](https://guides.nanobox.io/python/django/)
for detailed information about Nanobox's deployment and configuration process. for detailed information about Nanobox's deployment and configuration process.
@ -126,13 +126,13 @@ for detailed information about Nanobox's deployment and configuration process.
1. Enter the cloned/downloaded directory 1. Enter the cloned/downloaded directory
cd babybuddy cd babybuddy
1. Add the `SECRET_KEY` and `DJANGO_SETTINGS_MODULE` environment variables 1. Add the `SECRET_KEY` and `DJANGO_SETTINGS_MODULE` environment variables
nanobox evar add DJANGO_SETTINGS_MODULE=babybuddy.settings.nanobox nanobox evar add DJANGO_SETTINGS_MODULE=babybuddy.settings.nanobox
nanobox evar add SECRET_KEY=<CHANGE TO SOMETHING RANDOM> nanobox evar add SECRET_KEY=<CHANGE TO SOMETHING RANDOM>
*See [Configuration](#configuration) for other settings that can be *See [Configuration](#configuration) for other settings that can be
controlled by environment variables.* controlled by environment variables.*
1. Deploy! :rocket: 1. Deploy! :rocket:
@ -148,15 +148,15 @@ create two settings before pushing using `heroku config:set`:
heroku config:set DJANGO_SETTINGS_MODULE=babybuddy.settings.heroku heroku config:set DJANGO_SETTINGS_MODULE=babybuddy.settings.heroku
heroku config:set SECRET_KEY=<CHANGE TO SOMETHING RANDOM> heroku config:set SECRET_KEY=<CHANGE TO SOMETHING RANDOM>
See [Configuration](#configuration) for other settings that can be controlled See [Configuration](#configuration) for other settings that can be controlled
by `heroku config:set`. by `heroku config:set`.
### Manual ### Manual
There are a number of ways to deploy Baby Buddy manually to any server/VPS. There are a number of ways to deploy Baby Buddy manually to any server/VPS.
The application can run fine in low memory (below 1GB) situations, however a The application can run fine in low memory (below 1GB) situations, however a
32-bit operating system is recommended in such cases. This is primarily 32-bit operating system is recommended in such cases. This is primarily
because the build process can be memory intensive and cause excessive memory because the build process can be memory intensive and cause excessive memory
usage on 64-bit systems. If all fails, assets can be built on a local machine usage on 64-bit systems. If all fails, assets can be built on a local machine
and then uploaded to a server. and then uploaded to a server.
@ -189,7 +189,7 @@ Python 3.x, nginx, uwsgi and sqlite and should be sufficient for a few users
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install nodejs sudo apt-get install nodejs
sudo npm install -g gulp-cli sudo npm install -g gulp-cli
1. Set up directories and files 1. Set up directories and files
sudo mkdir /var/www/babybuddy sudo mkdir /var/www/babybuddy
@ -197,7 +197,7 @@ Python 3.x, nginx, uwsgi and sqlite and should be sufficient for a few users
mkdir -p /var/www/babybuddy/data/media mkdir -p /var/www/babybuddy/data/media
sudo chown -R www-data:www-data /var/www/babybuddy/data sudo chown -R www-data:www-data /var/www/babybuddy/data
git clone https://github.com/cdubz/babybuddy.git /var/www/babybuddy/public git clone https://github.com/cdubz/babybuddy.git /var/www/babybuddy/public
1. Move in to the application folder 1. Move in to the application folder
cd /var/www/babybuddy/public cd /var/www/babybuddy/public
@ -205,12 +205,12 @@ Python 3.x, nginx, uwsgi and sqlite and should be sufficient for a few users
1. Initiate the Python environment 1. Initiate the Python environment
pipenv --three --dev pipenv --three --dev
1. Build static assets 1. Build static assets
npm install npm install
gulp build gulp build
1. Create a production settings file and set the ``SECRET_KEY`` and ``ALLOWED_HOSTS`` values 1. Create a production settings file and set the ``SECRET_KEY`` and ``ALLOWED_HOSTS`` values
cp babybuddy/settings/production.example.py babybuddy/settings/production.py cp babybuddy/settings/production.example.py babybuddy/settings/production.py
@ -221,7 +221,7 @@ Python 3.x, nginx, uwsgi and sqlite and should be sufficient for a few users
export DJANGO_SETTINGS_MODULE=babybuddy.settings.production export DJANGO_SETTINGS_MODULE=babybuddy.settings.production
gulp collectstatic gulp collectstatic
gulp migrate gulp migrate
1. Set appropriate permissions on the database and data folder 1. Set appropriate permissions on the database and data folder
sudo chown www-data:www-data /var/www/babybuddy/data/db.sqlite3 sudo chown www-data:www-data /var/www/babybuddy/data/db.sqlite3
@ -233,27 +233,27 @@ Python 3.x, nginx, uwsgi and sqlite and should be sufficient for a few users
sudo editor /etc/uwsgi/apps-available/babybuddy.ini sudo editor /etc/uwsgi/apps-available/babybuddy.ini
sudo ln -s /etc/uwsgi/apps-available/babybuddy.ini /etc/uwsgi/apps-enabled/babybuddy.ini sudo ln -s /etc/uwsgi/apps-available/babybuddy.ini /etc/uwsgi/apps-enabled/babybuddy.ini
sudo service uwsgi restart sudo service uwsgi restart
Example config: Example config:
[uwsgi] [uwsgi]
plugins = python3 plugins = python3
project = babybuddy project = babybuddy
base_dir = /var/www/babybuddy base_dir = /var/www/babybuddy
virtualenv = /home/user/.local/share/virtualenvs/babybuddy-XXXXXXXX virtualenv = /home/user/.local/share/virtualenvs/babybuddy-XXXXXXXX
chdir = %(base_dir)/babybuddy chdir = %(base_dir)/babybuddy
module = %(project).wsgi:application module = %(project).wsgi:application
env = DJANGO_SETTINGS_MODULE=%(project).settings.production env = DJANGO_SETTINGS_MODULE=%(project).settings.production
master = True master = True
vacuum = True vacuum = True
See the [uWSGI documentation](http://uwsgi-docs.readthedocs.io/en/latest/) See the [uWSGI documentation](http://uwsgi-docs.readthedocs.io/en/latest/)
for more advanced configuration details. for more advanced configuration details.
*Note: Find the location of the pipenv virtual environment with the command *Note: Find the location of the pipenv virtual environment with the command
``pipenv --venv``.* ``pipenv --venv``.*
1. Create and configure the nginx server 1. Create and configure the nginx server
sudo vim /etc/nginx/sites-available/babybuddy sudo vim /etc/nginx/sites-available/babybuddy
@ -265,11 +265,11 @@ Python 3.x, nginx, uwsgi and sqlite and should be sufficient for a few users
upstream babybuddy { upstream babybuddy {
server unix:///var/run/uwsgi/app/babybuddy/socket; server unix:///var/run/uwsgi/app/babybuddy/socket;
} }
server { server {
listen 80; listen 80;
server_name babybuddy.example.com; server_name babybuddy.example.com;
location / { location / {
uwsgi_pass babybuddy; uwsgi_pass babybuddy;
include uwsgi_params; include uwsgi_params;
@ -278,7 +278,7 @@ Python 3.x, nginx, uwsgi and sqlite and should be sufficient for a few users
See the [nginx documentation](https://nginx.org/en/docs/) for more advanced See the [nginx documentation](https://nginx.org/en/docs/) for more advanced
configuration details. configuration details.
1. That's it (hopefully)! :tada: 1. That's it (hopefully)! :tada:
## Configuration ## Configuration
@ -295,12 +295,15 @@ take precedence over the contents of an `.env` file.**
- [`NAP_START_MIN`](#nap_start_min) - [`NAP_START_MIN`](#nap_start_min)
- [`SECRET_KEY`](#secret_key) - [`SECRET_KEY`](#secret_key)
- [`TIME_ZONE`](#time_zone) - [`TIME_ZONE`](#time_zone)
- [`AWS_STORAGE_BUCKET_NAME`](#aws_storage_bucket_name)
- [`AWS_ACCESS_KEY_ID`](#aws_access_key_id)
- [`AWS_SECRET_ACCESS_KEY`](#aws_secret_access_key)
### `ALLOWED_HOSTS` ### `ALLOWED_HOSTS`
*Default: * (any)* *Default: * (any)*
This option may be set to a single host or comma-separated list of hosts This option may be set to a single host or comma-separated list of hosts
(without spaces). This should *always* be set to a specific host or hosts in (without spaces). This should *always* be set to a specific host or hosts in
production deployments. production deployments.
@ -310,7 +313,7 @@ See also: [Django's documentation on the ALLOWED_HOSTS setting](https://docs.dja
*Default: True* *Default: True*
Whether or not to allow uploads (e.g. of Child photos). For some deployments Whether or not to allow uploads (e.g. of Child photos). For some deployments
(AWS, Heroku, Nanobox) this setting will default to False due to the lack of (AWS, Heroku, Nanobox) this setting will default to False due to the lack of
available persistent storage. available persistent storage.
@ -341,7 +344,7 @@ entry is considered a nap. Expects the format %H:%M.
*Default: None* *Default: None*
A random, unique string must be set as the "secret key" before Baby Buddy can A random, unique string must be set as the "secret key" before Baby Buddy can
be deployed and run. be deployed and run.
See also [Django's documentation on the SECRET_KEY setting](https://docs.djangoproject.com/en/1.11/ref/settings/#secret-key). See also [Django's documentation on the SECRET_KEY setting](https://docs.djangoproject.com/en/1.11/ref/settings/#secret-key).
@ -353,16 +356,39 @@ See also [Django's documentation on the SECRET_KEY setting](https://docs.djangop
The time zone to use for the instance. See [List of tz database time zones](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) The time zone to use for the instance. See [List of tz database time zones](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)
for all possible values. for all possible values.
### `AWS_STORAGE_BUCKET_NAME`
*Default: None*
If you would like to use AWS S3 for storage on ephemeral storage platforms like
Heroku you will need to create a bucket and add it's name. See django-storages'
[Amazon S3 documentation]
(http://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html).
### `AWS_ACCESS_KEY_ID`
*Default: None*
Required to access your AWS S3 bucket, should be uniquely generated per bucket
for security.
### `AWS_SECRET_ACCESS_KEY`
*Default: None*
Required to access your AWS S3 bucket, should be uniquely generated per bucket
for security.
## API ## API
Baby Buddy uses the [Django REST Framework](http://www.django-rest-framework.org/) Baby Buddy uses the [Django REST Framework](http://www.django-rest-framework.org/)
(DRF) to provide a REST API. (DRF) to provide a REST API.
The only requirement for (most) requests is that the `Authorization` header is The only requirement for (most) requests is that the `Authorization` header is
set as described in the [Authentication](#authentication) section. The one set as described in the [Authentication](#authentication) section. The one
exception is the `/api` endpoint, which lists all available endpoints. exception is the `/api` endpoint, which lists all available endpoints.
Currently, the following endpoints are available for `GET`, `OPTIONS`, and Currently, the following endpoints are available for `GET`, `OPTIONS`, and
`POST` requests: `POST` requests:
- `/api/children/` - `/api/children/`
@ -379,19 +405,19 @@ Currently, the following endpoints are available for `GET`, `OPTIONS`, and
By default, the [TokenAuthentication](http://www.django-rest-framework.org/api-guide/authentication/#tokenauthentication) By default, the [TokenAuthentication](http://www.django-rest-framework.org/api-guide/authentication/#tokenauthentication)
and [SessionAuthentication](http://www.django-rest-framework.org/api-guide/authentication/#sessionauthentication) and [SessionAuthentication](http://www.django-rest-framework.org/api-guide/authentication/#sessionauthentication)
classes are enabled. Session authentication covers local API requests made by classes are enabled. Session authentication covers local API requests made by
the application itself. Token authentication allows external requests to be the application itself. Token authentication allows external requests to be
made. made.
:exclamation: **In a production environment, token authentication should only :exclamation: **In a production environment, token authentication should only
be used for API calls to an `https` endpoint.** :exclamation: be used for API calls to an `https` endpoint.** :exclamation:
Each user is automatically assigned an API key that can be used for token Each user is automatically assigned an API key that can be used for token
authentication. This key can be found on the User Settings page for the logged authentication. This key can be found on the User Settings page for the logged
in the user. To use a key for an API request, set the request `Authorization` in the user. To use a key for an API request, set the request `Authorization`
header to `Token <user-key>`. E.g. header to `Token <user-key>`. E.g.
Authorization: Token 2h23807gd72h7hop382p98hd823dw3g665g56 Authorization: Token 2h23807gd72h7hop382p98hd823dw3g665g56
If the `Authorization` header is not set or the key is not valid, the API will If the `Authorization` header is not set or the key is not valid, the API will
return `403 Forbidden` with additional details in the response body. return `403 Forbidden` with additional details in the response body.
@ -410,8 +436,8 @@ will return five diaper changes starting from the 10th diaper change entry:
"previous": "https://[...]/api/changes/?limit=5&offset=5", "previous": "https://[...]/api/changes/?limit=5&offset=5",
"results": [...] "results": [...]
} }
Field-based filters for specific endpoints can be found the in the `filters` Field-based filters for specific endpoints can be found the in the `filters`
field of the `OPTIONS` response for specific endpoints. field of the `OPTIONS` response for specific endpoints.
#### Response #### Response
@ -424,7 +450,7 @@ Returns JSON data in the response body in the following format:
"previous":<url>, "previous":<url>,
"results":[{...}] "results":[{...}]
} }
- `count`: Total number of records (*in the database*, not just the response). - `count`: Total number of records (*in the database*, not just the response).
- `next`: URL for the next set of results. - `next`: URL for the next set of results.
- `previous`: URL for the previous set of results. - `previous`: URL for the previous set of results.
@ -440,7 +466,7 @@ about the endpoint's purpose, parameters, filters, etc.
#### Response #### Response
Returns JSON data in the response body describing the endpoint, available Returns JSON data in the response body describing the endpoint, available
options for `POST` requests, and available filters for `GET` requests. The options for `POST` requests, and available filters for `GET` requests. The
following example describes the `/api/children` endpoint: following example describes the `/api/children` endpoint:
{ {
@ -476,19 +502,19 @@ following example describes the `/api/children` endpoint:
#### Request #### Request
To add new entries for a particular endpoint, send a `POST` request with the To add new entries for a particular endpoint, send a `POST` request with the
entry data in JSON format in the request body. The `Content-Type` header for entry data in JSON format in the request body. The `Content-Type` header for
`POST` request must be set to `application/json`. `POST` request must be set to `application/json`.
Regular sanity checks will be performed on relevant data. See the `OPTIONS` Regular sanity checks will be performed on relevant data. See the `OPTIONS`
response for a particular endpoint for details on required fields and data response for a particular endpoint for details on required fields and data
formats. formats.
#### Response #### Response
Returns JSON data in the response body describing the added/updated instance or Returns JSON data in the response body describing the added/updated instance or
error details if errors exist. Errors are keyed by either the field in error or error details if errors exist. Errors are keyed by either the field in error or
the general string "non_field_errors" (usually when validation incorporates the general string "non_field_errors" (usually when validation incorporates
multiple fields). multiple fields).
## Development ## Development
@ -504,7 +530,7 @@ multiple fields).
1. Install pipenv 1. Install pipenv
pip install pipenv pip install pipenv
1. Install required Python packages, including dev packages 1. Install required Python packages, including dev packages
pipenv install --dev pipenv install --dev
@ -520,20 +546,20 @@ multiple fields).
1. Set, at least, the `DJANGO_SETTINGS_MODULE` environment variable 1. Set, at least, the `DJANGO_SETTINGS_MODULE` environment variable
export DJANGO_SETTINGS_MODULE=babybuddy.settings.development export DJANGO_SETTINGS_MODULE=babybuddy.settings.development
This process will differ based on the host OS. The above example is for This process will differ based on the host OS. The above example is for
Linux-based systems. See [Configuration](#configuration) for other settings Linux-based systems. See [Configuration](#configuration) for other settings
and methods for defining them. and methods for defining them.
1. Migrate the database 1. Migrate the database
gulp migrate gulp migrate
1. Build assets and run the server 1. Build assets and run the server
gulp gulp
This command will also watch for file system changes to rebuild assets and This command will also watch for file system changes to rebuild assets and
restart the server as needed. restart the server as needed.
Open [http://127.0.0.1:8000](http://127.0.0.1:8000) and log in with the default Open [http://127.0.0.1:8000](http://127.0.0.1:8000) and log in with the default
@ -542,7 +568,7 @@ user name and password (`admin`/`admin`).
### Gulp commands ### Gulp commands
Baby Buddy's Gulp commands are defined and configured by files in the Baby Buddy's Gulp commands are defined and configured by files in the
[`gulpfile.js`](gulpfile.js) folder. Django's management commands are defined [`gulpfile.js`](gulpfile.js) folder. Django's management commands are defined
in the [`babybuddy/management/commands`](babybuddy/management/commands) folder. in the [`babybuddy/management/commands`](babybuddy/management/commands) folder.
- [`gulp`](#gulp) - [`gulp`](#gulp)
@ -567,14 +593,14 @@ Executes the `build` and `watch` commands and runs Django's development server.
#### `build` #### `build`
Creates all script, style and "extra" assets and places them in the Creates all script, style and "extra" assets and places them in the
`babybuddy/static` folder. `babybuddy/static` folder.
#### `collectstatic` #### `collectstatic`
Executes Django's `collectstatic` management task. This task relies on files in Executes Django's `collectstatic` management task. This task relies on files in
the `babybuddy/static` folder, so generally `gulp build` should be run before the `babybuddy/static` folder, so generally `gulp build` should be run before
this command for production deployments. Gulp also passes along this command for production deployments. Gulp also passes along
non-overlapping arguments for this command, e.g. `--no-input`. non-overlapping arguments for this command, e.g. `--no-input`.
#### `compress` #### `compress`
@ -591,14 +617,14 @@ settings information.
#### `extras` #### `extras`
Copies "extra" files (fonts, images and server root contents) to the build Copies "extra" files (fonts, images and server root contents) to the build
folder. folder.
#### `fake` #### `fake`
Adds some fake data to the database. By default, ``fake`` creates one child and Adds some fake data to the database. By default, ``fake`` creates one child and
31 days of random data. Use the `--children` and `--days` flags to change the 31 days of random data. Use the `--children` and `--days` flags to change the
default values, e.g. `gulp fake --children 5 --days 7` to generate five fake default values, e.g. `gulp fake --children 5 --days 7` to generate five fake
children and seven days of data for each. children and seven days of data for each.
#### `lint` #### `lint`
@ -607,39 +633,39 @@ Executes Python and SASS linting for all relevant source files.
#### `makemigrations` #### `makemigrations`
Executes Django's `makemigrations` management task. Gulp also passes along Executes Django's `makemigrations` management task. Gulp also passes along
non-overlapping arguments for this command. non-overlapping arguments for this command.
#### `migrate` #### `migrate`
Executes Django's `migrate` management task. In addition to migrating the Executes Django's `migrate` management task. In addition to migrating the
database, this command creates the default `admin` user. Gulp also passes along database, this command creates the default `admin` user. Gulp also passes along
non-overlapping arguments for this command. non-overlapping arguments for this command.
#### `reset` #### `reset`
Resets the database to a default state *with* one fake child and 31 days of Resets the database to a default state *with* one fake child and 31 days of
fake data. fake data.
#### `runserver` #### `runserver`
Executes Django's `runserver` management task. Gulp also passes along Executes Django's `runserver` management task. Gulp also passes along
non-overlapping arguments for this command. non-overlapping arguments for this command.
#### `scripts` #### `scripts`
Builds and combines relevant application scripts. Generally this command does Builds and combines relevant application scripts. Generally this command does
not need to be executed independently - see the `build` command. not need to be executed independently - see the `build` command.
#### `styles` #### `styles`
Builds and combines SASS styles in to CSS files. Generally this command does Builds and combines SASS styles in to CSS files. Generally this command does
not need to be executed independently - see the `build` command. not need to be executed independently - see the `build` command.
#### `test` #### `test`
Executes Baby Buddy's suite of tests. Executes Baby Buddy's suite of tests.
Gulp also passes along non-overlapping arguments for this command, however Gulp also passes along non-overlapping arguments for this command, however
individual tests cannot be run with this command. `python manage.py test` can be individual tests cannot be run with this command. `python manage.py test` can be
used for individual test execution. used for individual test execution.

View File

@ -38,6 +38,7 @@ INSTALLED_APPS = [
'rest_framework.authtoken', 'rest_framework.authtoken',
'widget_tweaks', 'widget_tweaks',
'easy_thumbnails', 'easy_thumbnails',
'storages',
'django.contrib.admin', 'django.contrib.admin',
'django.contrib.auth', 'django.contrib.auth',
@ -132,13 +133,27 @@ STATICFILES_FINDERS = [
STATIC_URL = '/static/' STATIC_URL = '/static/'
MEDIA_URL = '/media/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static') STATIC_ROOT = os.path.join(BASE_DIR, 'static')
WHITENOISE_ROOT = os.path.join(BASE_DIR, 'static', 'root')
# Media files (User uploaded content)
# https://docs.djangoproject.com/en/2.0/topics/files/
MEDIA_ROOT = os.path.join(BASE_DIR, 'media') MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
WHITENOISE_ROOT = os.path.join(BASE_DIR, 'static', 'root') MEDIA_URL = '/media/'
AWS_STORAGE_BUCKET_NAME = os.environ.get('AWS_STORAGE_BUCKET_NAME', None)
AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID', None)
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY', None)
if AWS_STORAGE_BUCKET_NAME:
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
THUMBNAIL_DEFAULT_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
# Django Rest Framework # Django Rest Framework

20
package-lock.json generated
View File

@ -7832,26 +7832,6 @@
} }
} }
}, },
"tempusdominus-core": {
"version": "5.0.0-alpha12",
"resolved": "https://registry.npmjs.org/tempusdominus-core/-/tempusdominus-core-5.0.0-alpha12.tgz",
"integrity": "sha512-Zk6ecr+lr1kbAir8ilnoiZR1cgvLWr5AoUPW7FMY73u4DbvLTXA5T2Md9qH/9E8JNVV7QgFccrode5frlGYnyQ==",
"requires": {
"jquery": "3.3.1",
"moment": "2.20.1",
"moment-timezone": "0.4.1"
},
"dependencies": {
"moment-timezone": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.4.1.tgz",
"integrity": "sha1-gfWYw61eIs2teWtn7NjYjQ9bqgY=",
"requires": {
"moment": "2.20.1"
}
}
}
},
"text-cache": { "text-cache": {
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/text-cache/-/text-cache-4.1.0.tgz", "resolved": "https://registry.npmjs.org/text-cache/-/text-cache-4.1.0.tgz",