├── .gitignore ├── LICENSE.txt ├── MANIFEST.in ├── README.md ├── docs ├── Makefile ├── make.bat └── source │ ├── api_docs.rst │ ├── base.rst │ ├── conf.py │ ├── contributing.rst │ ├── git_overview.rst │ ├── index.rst │ ├── install.rst │ ├── mbox_overview.rst │ ├── overview.rst │ ├── tidy_data.rst │ ├── tidygit.rst │ ├── tidymbox.rst │ ├── tidytwitter.rst │ └── twitter_overview.rst ├── requirements.txt ├── setup.cfg ├── setup.py ├── test ├── git_data │ ├── git │ │ ├── COMMIT_EDITMSG │ │ ├── HEAD │ │ ├── config │ │ ├── description │ │ ├── hooks │ │ │ ├── applypatch-msg.sample │ │ │ ├── commit-msg.sample │ │ │ ├── post-update.sample │ │ │ ├── pre-applypatch.sample │ │ │ ├── pre-commit.sample │ │ │ ├── pre-push.sample │ │ │ ├── pre-rebase.sample │ │ │ ├── prepare-commit-msg.sample │ │ │ └── update.sample │ │ ├── index │ │ ├── info │ │ │ └── exclude │ │ ├── logs │ │ │ ├── HEAD │ │ │ └── refs │ │ │ │ └── heads │ │ │ │ └── master │ │ ├── objects │ │ │ ├── 11 │ │ │ │ └── bc75b2fe02022822f2aeaacc8e952f73686dc4 │ │ │ ├── 12 │ │ │ │ └── 8b788d7e9cf7f2e48c725d15857a269ac398dc │ │ │ ├── 13 │ │ │ │ └── 3dd255cb2e0b9a74fefbc1b75376db59cba81f │ │ │ ├── 15 │ │ │ │ └── 6f39c235948e9726e70a56b25076fdf6156e09 │ │ │ ├── 16 │ │ │ │ ├── 0903ab40547f408a9319f1481df88b0c83356c │ │ │ │ ├── 55c241cd5b218e99cce9bd13ced10712d3c62a │ │ │ │ ├── f816144d17f704c60b50beab2d85c0e1108996 │ │ │ │ └── f82e328b5957f8ebf20a40418d4d7d47c4e699 │ │ │ ├── 19 │ │ │ │ └── b422b6b270805c8246da5c4d0f76c2c3516ddb │ │ │ ├── 20 │ │ │ │ └── b1b5a3488894d6cf0ca94552e3c6ffdbde4e7c │ │ │ ├── 23 │ │ │ │ └── c9cef5261968d1a210297bad00b7e1e2e62cfa │ │ │ ├── 24 │ │ │ │ └── 9da961f3c1410acdeecb252f8d792f81e167c3 │ │ │ ├── 25 │ │ │ │ ├── 2407247dfea8ca1972222a14b97f8d8ea6549e │ │ │ │ ├── 815ca44e0972ecb7a8f5468bc5f8d2e85e5f83 │ │ │ │ └── f5bf5ef3a7b519143d62793727246d08d40770 │ │ │ ├── 26 │ │ │ │ └── 917e0bfb3558e9057536d0c4a1f3f65daf448f │ │ │ ├── 28 │ │ │ │ ├── 206af6232d86fa2e64e560fbc213839d68642a │ │ │ │ └── 34e135e97d99995cb31ac0486590e4f054e672 │ │ │ ├── 29 │ │ │ │ └── f2dd0dfe7d955c1289e5c09d74f3bbb01d2b60 │ │ │ ├── 30 │ │ │ │ ├── 4d23cf90348287d5bd0b3ff34396ed39432461 │ │ │ │ └── 93785a17f5ddc4d66159bca4253f470fdcef85 │ │ │ ├── 32 │ │ │ │ └── b66532fbc42e2e92d70db1de069aac8ac7f22d │ │ │ ├── 33 │ │ │ │ ├── 0ae3869e76997f4855e0b301b00383f33d8521 │ │ │ │ ├── 42e07756583476342b5eb80431ba3f40860580 │ │ │ │ ├── 8f036105032b2c13aa624bb74d698d4adeed47 │ │ │ │ └── e0169a3804feb7f8f59bd3ed06e3995f6edca7 │ │ │ ├── 34 │ │ │ │ └── ea2709080ec4e9c2ea0103d72db77b8b42ba95 │ │ │ ├── 35 │ │ │ │ ├── 72e019aa433a5421add562ef476d1195d5909b │ │ │ │ └── d142206cdaa37037ae956adbe3baab22ca3959 │ │ │ ├── 36 │ │ │ │ ├── bade49e237d4cfa23c3168cb409f278707bd45 │ │ │ │ └── d97f7ca2f509f440dbc9d024629e3e794a4c09 │ │ │ ├── 39 │ │ │ │ └── 90e7069bd55c7441f4d197fa95331b539e7ccf │ │ │ ├── 40 │ │ │ │ └── 9feb3a6f51087a54f78b7653cab6e1f5229af8 │ │ │ ├── 41 │ │ │ │ ├── 3cb81d545bf64b678b86f74dfc7e3ab7e21359 │ │ │ │ └── f02c9bfd84166c561830a981a91cb9bf3f842e │ │ │ ├── 42 │ │ │ │ ├── 97d430205e60b99db5718ba9d94c90fe5dc620 │ │ │ │ └── e2e607b75b45a0c7c1d7330bfea852f1c1f685 │ │ │ ├── 43 │ │ │ │ ├── 0aa6bb8814359c8bed68d36bdd13f976172849 │ │ │ │ └── ee097ac54aa20631826a3b2032e9bf75fe3d83 │ │ │ ├── 44 │ │ │ │ └── 171f590f5023c5b8e1a5379e9caa3821e452dc │ │ │ ├── 46 │ │ │ │ └── 6273ca346ab6c33c78e016c24011f4aa8fd404 │ │ │ ├── 49 │ │ │ │ └── 0b3fd63ee5e111c932c0cb0579b04a34503f7f │ │ │ ├── 51 │ │ │ │ ├── 26bdecc5b2d7d92eef1e31b4bbff7b4300a7a5 │ │ │ │ ├── 2a8037773b22530c5928d6456460e1c054a2c1 │ │ │ │ └── 5612b3e5466542b1325aff16ccdc02ab34dd60 │ │ │ ├── 52 │ │ │ │ ├── 02b077a5f29602bd2671149a1f194e2ff4a59b │ │ │ │ └── a02cc1f0ca27b95f96ca49ac97a5d800b5aca5 │ │ │ ├── 53 │ │ │ │ └── da6e9308d900dce7f70b5e36dd733657f4d8ab │ │ │ ├── 54 │ │ │ │ ├── 583510dece02dbbc4ff559ab7c6f9e25e174a5 │ │ │ │ └── 78c4229d514a7512b26dcca0f60548f834b679 │ │ │ ├── 55 │ │ │ │ ├── 800a7b02ff7e4748ad58cc69f04576f5083b98 │ │ │ │ ├── a77a5dbd7334ff9bcff22510a324fa14758864 │ │ │ │ └── f83b0a22ce00589889169451f67aae09745466 │ │ │ ├── 56 │ │ │ │ └── e0d89e80ac4ac0659467d41c71c6702ff14df6 │ │ │ ├── 57 │ │ │ │ └── 9ab67409eb2b7ce59f50f424f9881f2dfd0c6d │ │ │ ├── 58 │ │ │ │ ├── 1edc53c2914455398755c395c558fe3c3043f6 │ │ │ │ ├── 257ba2ea0bd123ad0f0c6566196a1d3a368e72 │ │ │ │ ├── 410baf93ebf3ed9147f25c5dbfd65304c42fbb │ │ │ │ └── 4a7679837a136fdd4f46dd30de55c4b7014ee8 │ │ │ ├── 59 │ │ │ │ └── 08c4eb2c48b7b88fe9c43a76028685ffa563cd │ │ │ ├── 60 │ │ │ │ ├── 0ff317a189208fca1416cbaf72cf954b452820 │ │ │ │ └── aa79e0fbb2bdce9961f89b4b9e49cefdb0958a │ │ │ ├── 64 │ │ │ │ ├── 2688757a1b8edd9b60d7b7cae21b2fb1f447c2 │ │ │ │ └── c62ab9155ea339c6ac5629efae641996f38678 │ │ │ ├── 65 │ │ │ │ ├── 1a69c662ed4af98a0cc8dc01e6b53e4741ff25 │ │ │ │ └── c482304ed7d92e6db5cd5a9dd89e6f0b9cbbb1 │ │ │ ├── 66 │ │ │ │ ├── 3a5bf6ecbfe096de29a7a8290afe494aa7e24d │ │ │ │ ├── 80bc824b6a25286344736a1502f04b8567fc74 │ │ │ │ └── ee6a99bf38c93f4a6e0cb54be1e4327d96bb3d │ │ │ ├── 67 │ │ │ │ └── 52f71d6881a3b40cd4004d2768f6a213894fb0 │ │ │ ├── 68 │ │ │ │ └── 1bc4728a137581fc30cc3800d59ad676d16c48 │ │ │ ├── 70 │ │ │ │ ├── 43732c57f96e42f25c99dc09a135f54a3083eb │ │ │ │ └── a628e6992eec4b237ffb21b425846235785c42 │ │ │ ├── 72 │ │ │ │ └── 6230215959f5819299414e42cc423008164d68 │ │ │ ├── 74 │ │ │ │ ├── ab28d379edcb02294fe013b04e3948b4ae96c3 │ │ │ │ └── e6792756ba6eaca6525bfbd3a38d87a41a8734 │ │ │ ├── 75 │ │ │ │ └── 9aab8cbcc031075e66cee042d43c5b34a9069f │ │ │ ├── 76 │ │ │ │ ├── 2906cba2ff3e7441706d26b783e6534c9d01c7 │ │ │ │ └── 3d6b338b9b3557177ca7803e9adc89ca7670b9 │ │ │ ├── 78 │ │ │ │ └── 4db8dcd5ef86e29e6d31e69848317cd59a780c │ │ │ ├── 79 │ │ │ │ └── 2e8411cc47a8a0d6ffcb15f001e2038aef5a78 │ │ │ ├── 80 │ │ │ │ └── 527b0b8751d4775d8fcda5bca6e079eb690208 │ │ │ ├── 81 │ │ │ │ ├── 1b117b47eee74e0705ead4125b3324bcc6ff89 │ │ │ │ └── 6c339c354f2ec71e874ffce29fddde5b13435f │ │ │ ├── 82 │ │ │ │ └── a079cc92ae7f1982f73089bc85eb4f78517fc4 │ │ │ ├── 83 │ │ │ │ └── f63bbc16503a3f594c1a06be851dd2d1f9a30b │ │ │ ├── 84 │ │ │ │ ├── 1083feca295d4c66779cf7de8936990da29b19 │ │ │ │ └── a95768b63313ffc31b1e3ff155822cff612d7a │ │ │ ├── 85 │ │ │ │ ├── 55cdcb240f55fbc96a1a1e83242da101dfacb4 │ │ │ │ ├── 783d1ea0fb9cf201fe6245459d89b0c679ec59 │ │ │ │ └── 8b96ac521a30404139a10d13d40373d5802e76 │ │ │ ├── 87 │ │ │ │ └── b5248662096d751cc9a4dc303cb9e4a1526c47 │ │ │ ├── 88 │ │ │ │ ├── 111303ffd9a760ad498502c10f2ad0a37b273b │ │ │ │ └── 99668bb5abf30394d25fdb5248545850e01611 │ │ │ ├── 89 │ │ │ │ ├── 33bebed6cb6ade83e198d51f7069b7dc1cfc6b │ │ │ │ └── be5efe8b457c739668a0f42b4c9b76162bcf85 │ │ │ ├── 90 │ │ │ │ └── b745512b67a0f14bf6009b9a6b125e9afd0fa3 │ │ │ ├── 92 │ │ │ │ ├── 0635a60d660032d60588316f66004eba1f6754 │ │ │ │ ├── 3361ee6cc1ae0c92e57ae6cfa2f7953dd05743 │ │ │ │ ├── 66b9075c8fe4bf342777631a8014b8547cc10f │ │ │ │ └── bd1dbdb4baac231e07e397b029bff666cce4a5 │ │ │ ├── 93 │ │ │ │ └── a2e3451b3b98ecb1462804f5e01b836501f0d7 │ │ │ ├── 97 │ │ │ │ └── 6a4741981170548070b8c69123939855b28c38 │ │ │ ├── 98 │ │ │ │ └── 9c930901e38d02e93319fc3c3f70b173565cca │ │ │ ├── 01 │ │ │ │ └── 0bad36fac6965df178b5fbef2ec637666f3c01 │ │ │ ├── 02 │ │ │ │ ├── 5fd86ee626aa8a5c5235ec8d7c623d3313c199 │ │ │ │ └── 7cd791354af14986f2fe6eb020cbff42d35dda │ │ │ ├── 03 │ │ │ │ ├── bee5aa80280750edfe76db99e102b4455ad48b │ │ │ │ └── ff2bcb1fb6e6ef93a0da60bff5574766de2ed5 │ │ │ ├── 05 │ │ │ │ ├── 0c11812526a6fc2a0fb42d27d2c5c9b1336f2a │ │ │ │ └── 1ac4f2fc1f7014921ae276df6a85cf462e5e7e │ │ │ ├── 06 │ │ │ │ └── cca1b59f986af5f6f7546e5d8bd4db5bb41f5d │ │ │ ├── 07 │ │ │ │ ├── 2409e65d7a84e9acec060c80728c9828de095a │ │ │ │ └── c4064135d4def1664d4a7e6cce851c9c450586 │ │ │ ├── 08 │ │ │ │ └── 16e1bf9d9cabfe44f3a70eaeb2a22e5e6be8ba │ │ │ ├── 09 │ │ │ │ └── b07d250ed69289b412b2eea04e638080cabcfd │ │ │ ├── 0c │ │ │ │ ├── 126519de47bf804378b04fbb67c463c21dba0c │ │ │ │ ├── 70d24f1d10489d909ea5eefa3843b2b05f24ee │ │ │ │ └── a0f7eb4a6912c2eeb961543e97860bebbdc542 │ │ │ ├── 0d │ │ │ │ ├── 0711f064d83e5b964712ff81dd4adae9568090 │ │ │ │ └── 75fd6c7c3bd51c9ae2f6397ae24fee5d5a823b │ │ │ ├── 0f │ │ │ │ ├── 2091515311cabe69c1f8b1267797c5b8822dd6 │ │ │ │ └── 61ccce81d9effa8472ebaf80a846e753c4d64e │ │ │ ├── 1c │ │ │ │ ├── aa95c4e277d33460b0428273f9999602ab4075 │ │ │ │ └── ae65f7eb24b2671f64f275ee328c580969bf39 │ │ │ ├── 1e │ │ │ │ └── 30b55680a304dbe73c34f13ad85494b554db7d │ │ │ ├── 1f │ │ │ │ └── 4b37be2c7ae3e5da9e2cee286d713c75a715cd │ │ │ ├── 2b │ │ │ │ ├── 33f7923a853eec8b819835f84fdb002591fee0 │ │ │ │ └── f8358382bb4bf05d8f4787d1fc5116c90891ce │ │ │ ├── 2f │ │ │ │ └── 90cf9d0341d76992828c57e7557985bb571ad8 │ │ │ ├── 3a │ │ │ │ └── f3766e42b3b39f3152498b8b32fa01c36bf8f2 │ │ │ ├── 3e │ │ │ │ ├── 24f1df64044c816094c9e202d4cf71e54f6886 │ │ │ │ └── fd7610a7979faf407a1f846ce86bbd110cf89d │ │ │ ├── 4a │ │ │ │ ├── 07ccb2d291e15f29944955f04e2df6067e5710 │ │ │ │ └── aa93fb23a75853d89574d76d5e868ce6a228cb │ │ │ ├── 4b │ │ │ │ └── 825dc642cb6eb9a060e54bf8d69288fbee4904 │ │ │ ├── 4c │ │ │ │ ├── 39557de87a360f1602c13afbbdc72b63b1608c │ │ │ │ ├── 3c937730d646e2b018f536edb8cf329e60f053 │ │ │ │ └── d59d6fe530d876f2dab6b3c2de7253238b98cd │ │ │ ├── 4e │ │ │ │ └── 2cf37683359e50ebc85cfccfc235907b0234ae │ │ │ ├── 4f │ │ │ │ └── 86b1551e3470ab1ebb87742e6704d615353c3d │ │ │ ├── 5c │ │ │ │ └── 2fe1d2de2e84020cdd4936c220cdeba877eb0d │ │ │ ├── 5d │ │ │ │ ├── 3a4b91c4bd0045cbff6d0ac1508fafab471137 │ │ │ │ └── b1fcea2e1e1f466e0d37d2d187fa2b10fc1ffc │ │ │ ├── 5e │ │ │ │ └── d9c3fac12e7855c02b13dcaa2a8fc0957477a6 │ │ │ ├── 5f │ │ │ │ ├── 427e5f6c9e18150ac270327d48301a7fbc97c9 │ │ │ │ ├── 42cef4bc0b1379a88e825c7a5214f3b9e1b038 │ │ │ │ └── f2123cd8487db817a66f6604393e9839582b70 │ │ │ ├── 6a │ │ │ │ └── ba3142983a0c31740b04757e22d36945a5dd08 │ │ │ ├── 6b │ │ │ │ ├── 2f24b4943a6db940ea3543af251222fc523404 │ │ │ │ └── 3aaa101c00f2e9082211986ccaa53c7e55352d │ │ │ ├── 6e │ │ │ │ ├── 2bc8bfa0c22c44a5a727ecb7ef25e31f0af637 │ │ │ │ ├── 4780add72110d0c6e6524695fffcf83819a3b2 │ │ │ │ └── 7b022e4f13009cbdf771eaa6dff718572086d3 │ │ │ ├── 6f │ │ │ │ └── 6192f6e98f575bc7ffb386a3e8b9509af76c93 │ │ │ ├── 7a │ │ │ │ ├── 3d8abbe884f2470cc378de7dc728b132c66ee2 │ │ │ │ ├── 68589a533365f38ab199f59d9f28c43cfe7b0f │ │ │ │ └── a94255299a58358db04b0c52438601c8592cc5 │ │ │ ├── 7e │ │ │ │ └── 12eba89fbaa135890b14b794ca448486867fb2 │ │ │ ├── 7f │ │ │ │ └── e7fd769124d51898615c2618384d5a032058fc │ │ │ ├── 8a │ │ │ │ ├── 00c1c606dd113976d3dfe823bbc416fa7579a6 │ │ │ │ ├── 28e121a0625faab91da8da1a4b3b6f1f1c89ee │ │ │ │ ├── 8b3efd3c431737432e20ed0c8ade8d7dcb89d5 │ │ │ │ └── cba56447e5ea53c22e4a341844ffc4347dc4f9 │ │ │ ├── 8b │ │ │ │ ├── 7efa1df60c4c1cbf42abd669978ed586ae93c0 │ │ │ │ └── ef0bcb2aefe0e550f638674da243694220cb0e │ │ │ ├── 8c │ │ │ │ └── 6fff2d02bddf18f72adf3e345b43cf7bc7baca │ │ │ ├── 8d │ │ │ │ ├── 3b4c8b8591a1670b32ea6ed643f4261b9a0724 │ │ │ │ └── fd51fb4b00bb10fd569cd12ed3ba94120cb3fe │ │ │ ├── 8e │ │ │ │ └── 1070059a3144df73c25c587be799e2480b13ce │ │ │ ├── 8f │ │ │ │ └── 45a55623d3f51444e3d223cdaf668d394d09c2 │ │ │ ├── 9a │ │ │ │ └── b368d31c531705afd2d756992fbcad47005e5a │ │ │ ├── 9b │ │ │ │ └── 4d25385fe3970d295b52b8be3cdf31f9148860 │ │ │ ├── 9c │ │ │ │ └── 0e4c149a4b428889e62ae9a91e1b8278f30dd7 │ │ │ ├── 9e │ │ │ │ ├── 24a25c1a9cb1b57de5fbfbee383d601eb58039 │ │ │ │ ├── 32107ae8c380abae6a1d3143044e70613551c5 │ │ │ │ └── 5de8aa20b0631f19841f5a4b60e3f0f8197ea0 │ │ │ ├── 9f │ │ │ │ ├── 0bcbbbbda18c13c6cf2a34bf74a106818753e9 │ │ │ │ ├── b4dc4bba6397c643dddcdcbf1c2d8f3ae027fe │ │ │ │ └── d26c27710f7ddf3ad76fb103d61ebd3e98cb44 │ │ │ ├── a1 │ │ │ │ ├── b1a150b43f8beda71dac3a7a35b8eb35a9f5fd │ │ │ │ └── c114a79444b5fb103cc6e2c4ca7c7affc8fd78 │ │ │ ├── a2 │ │ │ │ └── c8337b850e88e42d3f38b46810f4db6bb9ed5b │ │ │ ├── a6 │ │ │ │ ├── 93385d1b0a9e277adb2cd64adcf915dc8587ab │ │ │ │ └── 9b147a549b0eac5b18458cdc2891f5dbee6525 │ │ │ ├── a8 │ │ │ │ ├── 0160ce24609135e79bb9dde416e6f65b23de9e │ │ │ │ ├── 706b58d19bba3484a7a9375a989ff52cc548b5 │ │ │ │ └── b8e4c7cad383ff09e3160a11c8206f918689f5 │ │ │ ├── aa │ │ │ │ ├── 27df06dab350e7c783e2b5a9475b4d7afca971 │ │ │ │ └── abd8d7f90e6170efbe7e598136a54150ca0252 │ │ │ ├── ac │ │ │ │ ├── 14b1581b03b1aea494785568e6c0a9db8da8cb │ │ │ │ └── 95222160088b4e604f3e34f64c506254dea2e1 │ │ │ ├── ad │ │ │ │ └── 951e0c0e312c04e3f7757dfcd72e096bd8f047 │ │ │ ├── ae │ │ │ │ └── dc34d6e0c2cd748453219a4283020b3793f972 │ │ │ ├── af │ │ │ │ └── 01d4ead2846bed64a8e7dbae8c9658478b6cff │ │ │ ├── b1 │ │ │ │ ├── 60721c96cc432b7be703ad33ed5c8b61030369 │ │ │ │ └── 6a3a32d9daa7c03accb88fbb55b5c84ed15b9c │ │ │ ├── b2 │ │ │ │ ├── 507872e8a1de19f5faa69745d1fbc7e21acb43 │ │ │ │ ├── 5a8cff89b4c9cb5b04be8436633d462e16aaef │ │ │ │ └── 8f8a066d6133a3e8861893f138683c8eec93a5 │ │ │ ├── b5 │ │ │ │ ├── a3c34d8eefe35ad00133a43540d8a9249bde6a │ │ │ │ └── c0974dc4d85566d14e1a7f466dc6105958fd22 │ │ │ ├── b6 │ │ │ │ └── 1bff3ed1e24f867900820e0410e37f083a39e6 │ │ │ ├── b7 │ │ │ │ ├── 53531ee69abe17d59138fd4d3bf8b8fe0505b7 │ │ │ │ ├── 6e25b553a4c435ad3275f6fb52c4a0dce57a5a │ │ │ │ ├── 78c916f8b8103533902b1bd2b3dbcb941385de │ │ │ │ ├── bf960cfda2c64dc506f3dbee06cd568b8de9b3 │ │ │ │ └── ce7f2d7a491ada70895cf75cd343bb7f377ca1 │ │ │ ├── b9 │ │ │ │ └── 542794d676fe39bf8c731c6f6cfd84df37f09d │ │ │ ├── bb │ │ │ │ └── 884446bc4f3fecc342e33c858a2fe540c63c98 │ │ │ ├── bc │ │ │ │ └── 3f705a94ca4fad91e15ec46d7f9525066f5c64 │ │ │ ├── c1 │ │ │ │ └── dda01238d3e4287d0c17941e535cf61b5c150c │ │ │ ├── c2 │ │ │ │ └── 579c0b1060e81b6bde446e9dbb492e9789c105 │ │ │ ├── c4 │ │ │ │ ├── 902f7b43b94e96d0c0eae48f951b20af854f1b │ │ │ │ ├── ac95b6bbf90b41ec0b78c653583f7adaaef75d │ │ │ │ ├── d8ee26ac9152c168b2149a6cbaca77e9ba80e1 │ │ │ │ └── d94cd8b67a56c8cb1da229b085ef3a8257da55 │ │ │ ├── c8 │ │ │ │ ├── 66bc050ab520a1f61a160a604c2a5087040fab │ │ │ │ └── e0ac5a9f88985a6de2d54fe38917289a5f8831 │ │ │ ├── c9 │ │ │ │ └── 6380c2227f3390a08f40e73829010af6faddf6 │ │ │ ├── cd │ │ │ │ ├── 4d03e3b4b94d421c4beebe67d23a503b5217bd │ │ │ │ ├── 668bb538b609d10463efaa0fe470979f8dbef2 │ │ │ │ └── c72e94059a6381c40c6f9651d0fbebcae56d8c │ │ │ ├── ce │ │ │ │ ├── b9b17ff1400cda3e40561d91ff781822ec93b5 │ │ │ │ ├── c54fe276f26c876cc23b9943a2c94e76c4ff9a │ │ │ │ └── c9d5a8bd1032322111aeddf8b1069900ca7233 │ │ │ ├── d0 │ │ │ │ └── 42bc068e72409e970b05806dcda5e4ea40aaf5 │ │ │ ├── d2 │ │ │ │ └── bfacc640b33500c0cd4563294ed9c576b88b87 │ │ │ ├── d4 │ │ │ │ ├── 7350a61d7b4efa839752b2c4866a8b72e5d828 │ │ │ │ └── dfdc5471bd5d9c9a0bff9e4050b2b3462d0658 │ │ │ ├── d5 │ │ │ │ ├── c155dbfd0e0856390106cb0a0407064f8bc4a4 │ │ │ │ ├── c48ef3092b5af505145aca620b41e4a10cc609 │ │ │ │ └── d6f7c87f66fd4bba84abe718f6851c626ee18b │ │ │ ├── d6 │ │ │ │ └── a1f6f3fb60379905790a10452ac46f357c61ec │ │ │ ├── d7 │ │ │ │ ├── 4408fa37d46d251528e6e16bcf782075116df8 │ │ │ │ ├── 79609b0c390ce028866584a20daf1ba80c47ba │ │ │ │ └── c3e1b47bc9b7a703489a668409a98b86805175 │ │ │ ├── d8 │ │ │ │ ├── 5dc8db6579a5e4fa2c6477dc2feaf0ac2967dc │ │ │ │ ├── 873b440d18bf607b06ad1ae6795ee70678e4ac │ │ │ │ └── e02f2170ebe60586f852ce5bf069c8cb62835c │ │ │ ├── d9 │ │ │ │ ├── 441b20cf38d68e2147f353925f84042c5c7879 │ │ │ │ ├── e5c364a1caa0ebf1afba04b9f8f7f11acb86bb │ │ │ │ └── f3d016c1425403ce9e7bf6bf3a8c8dafc69421 │ │ │ ├── da │ │ │ │ └── 6fd93a756292495f5b74429fc381611cf0cc68 │ │ │ ├── db │ │ │ │ ├── 1d9b90ad28f35d89a0571c9a84ae5735aced47 │ │ │ │ └── a0fe21372b7d844ebe37bf7bd5d77e37432679 │ │ │ ├── dc │ │ │ │ └── 68c4328a0dfdb43a8aa41c7e2a7adb78e8aeaf │ │ │ ├── dd │ │ │ │ ├── 5bdca2b6d6686be888acb1e258b1324e36c136 │ │ │ │ └── bdbac7a7b38a69290ca35300887fd77580dc80 │ │ │ ├── df │ │ │ │ ├── 1adcd7caa3b439038b8e19b7fb7b57f06a4ca0 │ │ │ │ ├── 29d60ad46af8a5e45313635299d4f0174752cc │ │ │ │ ├── 6c8582e9245a2ec7724949c3abf1b94d31eb70 │ │ │ │ └── b98ffa295c7b7bc1e447ebca81f0be73f2ce1f │ │ │ ├── e3 │ │ │ │ ├── 1e203b879f573d08a374dea42821c6a36bd6e6 │ │ │ │ └── ab77e5c6b709a1e6f0842ad234d62cd434f638 │ │ │ ├── e4 │ │ │ │ └── ca955c80e3ab41d03543dfb545be1c5ccd5f71 │ │ │ ├── e5 │ │ │ │ ├── 01da8d646270c847690f3d9eb947f5b98c0e32 │ │ │ │ └── 4368ee844c790c77a04ed10ed68337e64a56d4 │ │ │ ├── e6 │ │ │ │ ├── 9dcf238caecae4d510a0aa6d349fe7856dd997 │ │ │ │ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391 │ │ │ ├── e7 │ │ │ │ └── f43657f4f2825e4c6a8973808b7467496ccce4 │ │ │ ├── ea │ │ │ │ └── f8c3c6bf2bfdf10ca793a9b0aca67adc99bc70 │ │ │ ├── ec │ │ │ │ └── d8907c9d159c0f5d8a62e2956e39e28241758b │ │ │ ├── ed │ │ │ │ ├── 7c59544705d2a2f31dd16074fbb8de6b6afc42 │ │ │ │ └── dd89ed34118757560c727d9984d9234b2788ec │ │ │ ├── ef │ │ │ │ └── 26499df24bb719849bc8da67a83821e47a193e │ │ │ ├── f0 │ │ │ │ └── 15e01fab7930e10847990d3a6410e6daab5079 │ │ │ ├── f3 │ │ │ │ ├── 23eb61d41618daac3de9584275782505ef7762 │ │ │ │ └── bccf1160e67bf2ac2f47e0a7083d983f8951a2 │ │ │ ├── f4 │ │ │ │ └── acc3ec0539c924f78dd0a748fd6591734703dc │ │ │ ├── f5 │ │ │ │ └── 3fa782d10e4575a4f2ffd91f8780698637c232 │ │ │ ├── f6 │ │ │ │ └── 94c944764829eb49435a566039d4500c534cf4 │ │ │ ├── f7 │ │ │ │ └── 09202d1dff6607ec4ee70f39865bf0707b214d │ │ │ ├── f8 │ │ │ │ └── c09d882f53ad89ec5163239c61ec12e335e03a │ │ │ ├── fb │ │ │ │ ├── 19cc652ed40a7028cf754412bffc8ad57e5900 │ │ │ │ ├── 5488fa253baed0dffe8bc051fa3181c805c7d5 │ │ │ │ └── 6b9c8d7bc4263d075d0ae703d59ba3c3b5be12 │ │ │ ├── fd │ │ │ │ └── f5f054aef45a86e05dfa1355fe3f56e2198b50 │ │ │ └── ff │ │ │ │ ├── 1c5d356a4df7723a64d11040de4eaebe35bc7f │ │ │ │ ├── 38a4736b3b1d8b6b4a302431be205c23ebb464 │ │ │ │ └── 4fa14e6e19739edc6c12fc3d1328e95b5cf3e6 │ │ └── refs │ │ │ └── heads │ │ │ └── master │ ├── git_changes_test.csv │ ├── git_commits_test.csv │ └── git_raw_test.csv ├── mbox_data │ ├── mail_1.mbox │ ├── mail_2.mbox │ ├── mail_3.mbox │ ├── mail_4.mbox │ ├── mbox_emails_test.csv │ ├── mbox_raw_test.csv │ └── mbox_sends_test.csv ├── test_base.py ├── test_git.py ├── test_mbox.py ├── test_twitter.py └── twitter_data │ ├── placeholder.txt │ ├── twitter_raw_test.csv │ ├── twitter_tweets_test.csv │ └── twitter_users_test.csv └── tidyextractors ├── __init__.py ├── base_extractor.py ├── tidygit ├── __init__.py ├── get_log.py ├── git_extractor.py └── git_object_handlers.py ├── tidymbox ├── __init__.py ├── mbox_extractor.py └── mbox_to_pandas.py └── tidytwitter ├── __init__.py ├── twitter_extractor.py └── twitter_object_handlers.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | ### Python template 3 | # Byte-compiled / optimized / DLL files 4 | __pycache__/ 5 | *.py[cod] 6 | *$py.class 7 | 8 | # NetLab Specials 9 | test/twitter_data/txrc 10 | 11 | # C extensions 12 | *.so 13 | 14 | # PyCharm 15 | .idea/ 16 | 17 | # Distribution / packaging 18 | .Python 19 | env/ 20 | build/ 21 | develop-eggs/ 22 | dist/ 23 | downloads/ 24 | eggs/ 25 | .eggs/ 26 | lib/ 27 | lib64/ 28 | parts/ 29 | sdist/ 30 | var/ 31 | *.egg-info/ 32 | .installed.cfg 33 | *.egg 34 | 35 | # PyInstaller 36 | # Usually these files are written by a python script from a template 37 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 38 | *.manifest 39 | *.spec 40 | 41 | # Installer logs 42 | pip-log.txt 43 | pip-delete-this-directory.txt 44 | 45 | # Unit test / coverage reports 46 | htmlcov/ 47 | .tox/ 48 | .coverage 49 | .coverage.* 50 | .cache 51 | nosetests.xml 52 | coverage.xml 53 | *,cover 54 | .hypothesis/ 55 | 56 | # Translations 57 | *.mo 58 | *.pot 59 | 60 | # Django stuff: 61 | *.log 62 | local_settings.py 63 | 64 | # Flask instance folder 65 | instance/ 66 | 67 | # Scrapy stuff: 68 | .scrapy 69 | 70 | # Sphinx documentation 71 | docs/_build/ 72 | 73 | # PyBuilder 74 | target/ 75 | 76 | # IPython Notebook 77 | .ipynb_checkpoints 78 | 79 | # pyenv 80 | .python-version 81 | 82 | # celery beat schedule file 83 | celerybeat-schedule 84 | 85 | # dotenv 86 | .env 87 | 88 | # virtualenv 89 | venv/ 90 | ENV/ 91 | 92 | # Spyder project settings 93 | .spyderproject 94 | 95 | # Rope project settings 96 | .ropeproject 97 | 98 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include requirements.txt -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | tidyextractors 4 | ============== 5 | 6 | Overview 7 | -------- 8 | 9 | ``tidyextractors`` makes extracting data from supported sources as painless as possible, delivering you a populated Pandas DataFrame in just a few lines of code. ``tidyextractors`` was inspired by `Hadley Wickham's (2014) paper `_ which introduces "tidy data" as a conceptual framework for data preparation. 10 | 11 | For more information, including code examples, API reference, and general documentation, click `HERE `_. 12 | 13 | Features 14 | -------- 15 | 16 | * Extracts data with minimal effort. 17 | * Creates readable code that requires minimal explanation. 18 | * Exports Pandas Dataframes to maximize compatibility with the Python data science ecosystem. 19 | 20 | Currently Implemented Data Sources 21 | ---------------------------------- 22 | 23 | * `Local Git Repositories `_ 24 | * `Twitter User Data (including Tweets) using the Twitter API `_ 25 | * `Emails stored in the Mbox file format. `_ 26 | 27 | Installing 28 | ---------- 29 | 30 | Just run ``pip3 install tidyextractors``. 31 | -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line. 5 | SPHINXOPTS = 6 | SPHINXBUILD = python3 -msphinx 7 | SPHINXPROJ = tidyextractors 8 | SOURCEDIR = source 9 | BUILDDIR = build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 21 | -------------------------------------------------------------------------------- /docs/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=python -msphinx 9 | ) 10 | set SOURCEDIR=source 11 | set BUILDDIR=build 12 | set SPHINXPROJ=tidyextractors 13 | 14 | if "%1" == "" goto help 15 | 16 | %SPHINXBUILD% >NUL 2>NUL 17 | if errorlevel 9009 ( 18 | echo. 19 | echo.The Sphinx module was not found. Make sure you have Sphinx installed, 20 | echo.then set the SPHINXBUILD environment variable to point to the full 21 | echo.path of the 'sphinx-build' executable. Alternatively you may add the 22 | echo.Sphinx directory to PATH. 23 | echo. 24 | echo.If you don't have Sphinx installed, grab it from 25 | echo.http://sphinx-doc.org/ 26 | exit /b 1 27 | ) 28 | 29 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% 30 | goto end 31 | 32 | :help 33 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% 34 | 35 | :end 36 | popd 37 | -------------------------------------------------------------------------------- /docs/source/api_docs.rst: -------------------------------------------------------------------------------- 1 | API Documentation 2 | ================================================== 3 | 4 | An in-depth look at the ``tidyextractors`` interface. 5 | 6 | .. toctree:: 7 | :maxdepth: 1 8 | :caption: Contents: 9 | 10 | BaseExtractor 11 | GitExtractor 12 | MboxExtractor 13 | TwitterExtractor 14 | -------------------------------------------------------------------------------- /docs/source/base.rst: -------------------------------------------------------------------------------- 1 | ``BaseExtractor`` 2 | ================= 3 | 4 | The ``BaseExtractor`` is the foundation for all data extractors in this module. 5 | 6 | .. warning:: 7 | 8 | The ``BaseExtractor`` should never be created on its own. This page is intended for people who want to contribute to the ``tidyextractors`` project or just want to understand some of what is going on under the hood. 9 | 10 | 11 | For developers, note that the internal interface is not documented on this site. See the source code for the full documentation of the internal interface. 12 | 13 | .. automodule:: tidyextractors 14 | :members: 15 | 16 | .. autoclass:: BaseExtractor 17 | :members: 18 | -------------------------------------------------------------------------------- /docs/source/conf.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | # 4 | # tidyextractors documentation build configuration file, created by 5 | # sphinx-quickstart on Mon Jun 19 10:24:08 2017. 6 | # 7 | # This file is execfile()d with the current directory set to its 8 | # containing dir. 9 | # 10 | # Note that not all possible configuration values are present in this 11 | # autogenerated file. 12 | # 13 | # All configuration values have a default; values that are commented out 14 | # serve to show the default. 15 | 16 | # If extensions (or modules to document with autodoc) are in another directory, 17 | # add these directories to sys.path here. If the directory is relative to the 18 | # documentation root, use os.path.abspath to make it absolute, like shown here. 19 | # 20 | import os 21 | import sys 22 | sys.path.insert(0, os.path.abspath('../..')) 23 | 24 | #print(os.path.abspath('../..')) 25 | 26 | import sphinx_rtd_theme 27 | # import tidyextractors 28 | # import tidyextractors.tidygit 29 | # import tidyextractors.tidymbox 30 | # import tidyextractors.tidytwitter 31 | 32 | 33 | # -- General configuration ------------------------------------------------ 34 | 35 | # If your documentation needs a minimal Sphinx version, state it here. 36 | # 37 | # needs_sphinx = '1.0' 38 | 39 | # Add any Sphinx extension module names here, as strings. They can be 40 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom 41 | # ones. 42 | extensions = ['sphinx.ext.autodoc', 43 | 'sphinx.ext.mathjax'] 44 | 45 | # Add any paths that contain templates here, relative to this directory. 46 | templates_path = ['_templates'] 47 | 48 | # The suffix(es) of source filenames. 49 | # You can specify multiple suffix as a list of string: 50 | # 51 | # source_suffix = ['.rst', '.md'] 52 | source_suffix = '.rst' 53 | 54 | # The master toctree document. 55 | master_doc = 'index' 56 | 57 | # General information about the project. 58 | project = 'tidyextractors' 59 | copyright = '2017, Joel Becker, Jillian Anderson, Steve McColl, John McLevey' 60 | author = 'Joel Becker, Jillian Anderson, Steve McColl, John McLevey' 61 | 62 | # The version info for the project you're documenting, acts as replacement for 63 | # |version| and |release|, also used in various other places throughout the 64 | # built documents. 65 | # 66 | # The short X.Y version. 67 | version = '0.2' 68 | # The full version, including alpha/beta/rc tags. 69 | release = '0.2.1' 70 | 71 | # The language for content autogenerated by Sphinx. Refer to documentation 72 | # for a list of supported languages. 73 | # 74 | # This is also used if you do content translation via gettext catalogs. 75 | # Usually you set "language" from the command line for these cases. 76 | language = None 77 | 78 | # List of patterns, relative to source directory, that match files and 79 | # directories to ignore when looking for source files. 80 | # This patterns also effect to html_static_path and html_extra_path 81 | exclude_patterns = [] 82 | 83 | # The name of the Pygments (syntax highlighting) style to use. 84 | pygments_style = 'sphinx' 85 | 86 | # If true, `todo` and `todoList` produce output, else they produce nothing. 87 | todo_include_todos = False 88 | 89 | 90 | # -- Options for HTML output ---------------------------------------------- 91 | 92 | # The theme to use for HTML and HTML Help pages. See the documentation for 93 | # a list of builtin themes. 94 | # 95 | html_theme = 'sphinx_rtd_theme' 96 | html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] 97 | 98 | # Theme options are theme-specific and customize the look and feel of a theme 99 | # further. For a list of options available for each theme, see the 100 | # documentation. 101 | # 102 | # html_theme_options = {} 103 | 104 | # Add any paths that contain custom static files (such as style sheets) here, 105 | # relative to this directory. They are copied after the builtin static files, 106 | # so a file named "default.css" will overwrite the builtin "default.css". 107 | html_static_path = ['_static'] 108 | 109 | 110 | # -- Options for HTMLHelp output ------------------------------------------ 111 | 112 | # Output file base name for HTML help builder. 113 | htmlhelp_basename = 'tidyextractorsdoc' 114 | 115 | 116 | # -- Options for LaTeX output --------------------------------------------- 117 | 118 | latex_elements = { 119 | # The paper size ('letterpaper' or 'a4paper'). 120 | # 121 | # 'papersize': 'letterpaper', 122 | 123 | # The font size ('10pt', '11pt' or '12pt'). 124 | # 125 | # 'pointsize': '10pt', 126 | 127 | # Additional stuff for the LaTeX preamble. 128 | # 129 | # 'preamble': '', 130 | 131 | # Latex figure (float) alignment 132 | # 133 | # 'figure_align': 'htbp', 134 | } 135 | 136 | # Grouping the document tree into LaTeX files. List of tuples 137 | # (source start file, target name, title, 138 | # author, documentclass [howto, manual, or own class]). 139 | latex_documents = [ 140 | (master_doc, 'tidyextractors.tex', 'tidyextractors Documentation', 141 | 'Joel Becker, Jillian Anderson, Steve McColl, John McLevey', 'manual'), 142 | ] 143 | 144 | 145 | # -- Options for manual page output --------------------------------------- 146 | 147 | # One entry per manual page. List of tuples 148 | # (source start file, name, description, authors, manual section). 149 | man_pages = [ 150 | (master_doc, 'tidyextractors', 'tidyextractors Documentation', 151 | [author], 1) 152 | ] 153 | 154 | 155 | # -- Options for Texinfo output ------------------------------------------- 156 | 157 | # Grouping the document tree into Texinfo files. List of tuples 158 | # (source start file, target name, title, author, 159 | # dir menu entry, description, category) 160 | texinfo_documents = [ 161 | (master_doc, 'tidyextractors', 'tidyextractors Documentation', 162 | author, 'tidyextractors', 'One line description of project.', 163 | 'Miscellaneous'), 164 | ] 165 | -------------------------------------------------------------------------------- /docs/source/contributing.rst: -------------------------------------------------------------------------------- 1 | Contributing 2 | ============ 3 | 4 | Our hope is that ``tidyextractors`` will expand to include numerous new data sources. If there is a particular kind of data you are interested in extracting, or which to contribute to the package, please contact Joel Becker (`mail@joelbecker.ca `_) or Jillian Anderson (jillianderson8@gmail.com) and we will respond ASAP. 5 | 6 | Creating an Extractor 7 | --------------------- 8 | 9 | Contributing a new extractor is relatively simple. Broadly speaking, you need to create a submodule with an extractor class inheriting from ``BaseExtractor``. To create this class (e.g. ``NewExtractor``) you need to do the following: 10 | 11 | * Define a ``NewExtractor._extract`` method, which should extract data and assign it to ``NewExtractor._data``. This method will be called by ``BaseExtractor.__init__`` during initialization. 12 | * Create a method to return each data format (e.g. ``commits``, ``changes``). -------------------------------------------------------------------------------- /docs/source/git_overview.rst: -------------------------------------------------------------------------------- 1 | Git Repository Data Extraction 2 | =============================== 3 | 4 | The ``tidyextractors.tidygit`` submodule lets you extract Git log data from a local Git repository. This page will guide you through the process. 5 | 6 | 7 | A Minimal Code Example 8 | ------------------------------ 9 | 10 | .. code-block:: python 11 | 12 | from tidyextractors.tidygit import GitExtractor 13 | 14 | # Extract data from a local Git repo 15 | gx = GitExtractor('./your/repo/dir/') 16 | 17 | # Commit data in a Pandas DataFrame. 18 | commits_df = gx.commits(drop_collections=True) 19 | 20 | # Commit/file keyed change data in a Pandas DataFrame 21 | changes_df = gx.changes() 22 | 23 | Step 1: Prepare Your Git Repo 24 | ---------------------------------- 25 | 26 | All you need to get started is the path to a local Git repository. If you want to extract data from a repository hosted on GitHub, download or clone the repository to your computer. 27 | 28 | Step 2: Extract Data 29 | ------------------------- 30 | 31 | You can extract data from any local Git repository using the ``GitExtractor``: 32 | 33 | .. code-block:: python 34 | 35 | from tidyextractors.tidygit import GitExtractor 36 | 37 | gx = GitExtractor('./your/repo/dir/') 38 | 39 | You may need to wait while the data is being extracted, but all the data is now stored inside the extractor object. You just need a bit more code to get it in your preferred format. 40 | 41 | Step 3: Get Pandas Data 42 | -------------------------- 43 | 44 | Now, you can call a ``GitExtractor`` method to return data in a Pandas DataFrame. 45 | 46 | .. code-block:: python 47 | 48 | # Commit data in a Pandas DataFrame. 49 | commits_df = gx.commits(drop_collections=True) 50 | 51 | # Commit/file keyed change data in a Pandas DataFrame 52 | changes_df = gx.changes() 53 | 54 | .. note:: 55 | 56 | ``GitExtractor.commits()`` drops columns with collections of data in cells (i.e. ``list``, ``set``, and ``dicts``) because "tidy data" requires only atomic values in cells. 57 | If you don't want data dropped, change the optional ``drop_collections`` argument to false. 58 | -------------------------------------------------------------------------------- /docs/source/index.rst: -------------------------------------------------------------------------------- 1 | .. tidyextractors documentation master file, created by 2 | sphinx-quickstart on Mon Jun 19 10:24:08 2017. 3 | You can adapt this file completely to your liking, but it should at least 4 | contain the root `toctree` directive. 5 | 6 | tidyextractors 7 | ================= 8 | 9 | .. toctree:: 10 | :maxdepth: 2 11 | :caption: About tidyextractors 12 | 13 | Overview 14 | What is "Tidy Data"? 15 | Installation Guide 16 | 17 | .. toctree:: 18 | :maxdepth: 2 19 | :caption: Data Extraction 20 | 21 | Extract Git Data 22 | Extract Mbox Data 23 | Extract Twitter Data 24 | 25 | .. toctree:: 26 | :maxdepth: 2 27 | :caption: API Reference 28 | 29 | API Reference 30 | 31 | .. toctree:: 32 | :maxdepth: 2 33 | :caption: Developer 34 | 35 | Contributing 36 | -------------------------------------------------------------------------------- /docs/source/install.rst: -------------------------------------------------------------------------------- 1 | Installation 2 | ============ 3 | 4 | With ``pip`` 5 | ------------ 6 | 7 | Run ``pip install tidyextractors`` in your terminal. This will install the most recently released stable version of ``tidyextractors``. 8 | 9 | The Hard Way 10 | ------------ 11 | 12 | Clone the project's `GitHub repository `_ and run ``pip install .`` in the cloned directory. 13 | 14 | Note this will install the current state of the project as it is on GitHub. This may not correspond to an official release and is not guaranteed to be stable. 15 | -------------------------------------------------------------------------------- /docs/source/mbox_overview.rst: -------------------------------------------------------------------------------- 1 | Mbox Data Extraction 2 | =============================== 3 | 4 | Mbox is a file format used to store mailbox data on Unix operating systems. The ``tidyextractors.tidymbox`` submodule lets you extract user data from Mbox files with minimal effort. This page will guide you through the process. 5 | 6 | A Minimal Code Example 7 | ------------------------------ 8 | 9 | 10 | .. code-block:: python 11 | 12 | from tidyextractors.tidymbox as MboxExtractor 13 | 14 | # Extracts all mbox files in this directory. 15 | mx = MboxExtractor('./your/mbox/dir/') 16 | 17 | # Email messages in a Pandas DataFrame. 18 | email_df = mx.emails(drop_collections=True) 19 | 20 | # MessageID/receiver keyed Pandas DataFrame. 21 | sends_df = mx.sends() 22 | 23 | Step 1: Prepare Your Mbox Files 24 | ---------------------------------- 25 | 26 | You can extract data from a single Mbox file, or multiple Mbox files. However, all these files must be in a single directory: 27 | 28 | .. code-block:: bash 29 | 30 | ls -1 ./your/mbox/dir/ 31 | file1.mbox 32 | file2.mbox 33 | file3.mbox 34 | 35 | Step 2: Extract Data 36 | ------------------------- 37 | 38 | Once you have consolidated your Mbox files, you can extract data from them using the ``MboxExtractor``: 39 | 40 | .. code-block:: python 41 | 42 | from tidyextractors.tidymbox as MboxExtractor 43 | 44 | # All mbox files in the directory 45 | mx = MboxExtractor('./your/mbox/dir/') 46 | 47 | # Only one mbox file 48 | mx = MboxExtractor('./your/mbox/dir/file1.mbox') 49 | 50 | You may need to wait while the data is being extracted, but all the data is now stored inside the extractor object. You just need a bit more code to get it in your preferred format. 51 | 52 | Step 3: Get Pandas Data 53 | -------------------------- 54 | 55 | Now, you can call an ``MboxExtractor`` method to return data in a Pandas DataFrame. 56 | 57 | .. code-block:: python 58 | 59 | # Email messages in a Pandas DataFrame. 60 | email_df = mx.emails(drop_collections=True) 61 | 62 | # MessageID/receiver keyed Pandas DataFrame. 63 | sends_df = mx.sends() 64 | 65 | .. note:: 66 | 67 | ``MboxExtractor.emails()`` drops columns with collections of data in cells (i.e. ``list``, ``set``, and ``dicts``) because "tidy data" requires only atomic values in cells. 68 | If you don't want data dropped, change the optional ``drop_collections`` argument to false. 69 | 70 | .. note:: 71 | 72 | This submodule's internals were adapted from Phil Deutsch's 73 | `mbox-to-pandas `_ script with his permission. 74 | -------------------------------------------------------------------------------- /docs/source/overview.rst: -------------------------------------------------------------------------------- 1 | Overview: Data Extraction Made Simple 2 | ============================================== 3 | 4 | ``tidyextractors`` makes extracting data from supported sources as painless as possible, delivering a populated Pandas DataFrame in three lines of code. ``tidyextractors`` was inspired by `Hadley Wickham's (2014) paper `_ which introduces "tidy data" as a conceptual framework for data preparation. 5 | 6 | Features 7 | ----------------- 8 | 9 | * Extracts data with minimal effort. 10 | * Creates readable code that requires minimal explanation. 11 | * Exports Pandas Dataframes to maximize compatibility with the Python data science ecosystem. 12 | 13 | Data Sources Implemented 14 | ------------------------------------------ 15 | 16 | ``tidyextractors`` currently has submodules for extracting data from the following sources: 17 | 18 | * Local Git Repositories 19 | * Twitter User Data (including Tweets) using the Twitter API 20 | * Emails stored in the ``mbox`` file format. 21 | -------------------------------------------------------------------------------- /docs/source/tidy_data.rst: -------------------------------------------------------------------------------- 1 | What is Tidy Data? 2 | ======================== 3 | 4 | `Hadley Wickham (2014) `_ introduced "tidy data" to describe data that has been cleaned and reshaped in a way that is ready for analysis. The concept of tidy data inspired ``tidyextractors``, which provides a convenient interface for extracting data in a tidy format. However, what is a tidy format? 5 | 6 | Our Definition of Tidy Data 7 | --------------------------------- 8 | 9 | We consider data to be "tidy" if it satisfies the following constraints: 10 | 11 | * Data values are atomic. No cell contains a collection of items (e.g. a list, set, or dictionary). 12 | * Each row is a single observation. This is to say that each row represents a single "entity" (e.g. such as a commit, a change to a file, or a tweet) which can be uniquely identified by a primary key (e.g. MessageID for an email, or MessageID and recipient for an email "send"). 13 | * Each column is a single variable. 14 | 15 | This definition intentionally allows for a certain degree of data redundancy, which would be eliminated in traditional database normalizations, such as BCNF. 16 | 17 | Choosing Output Formats 18 | ----------------------------------- 19 | 20 | We have a few guiding principals for deciding which output formats to implement for a given extractor: 21 | 22 | * If an entity would have its own table in a normalized database, it should be available as an output format. 23 | * Dataset should include all variables that have meaningful information about the table's defining unit of observation, even if this data may be redundant between rows. 24 | * In general, more data is preferred to less data, so long as it is meaningful. It is easier to drop data than to integrate data. 25 | 26 | Not Your Grandfather's Tidy Data 27 | ------------------------------------ 28 | 29 | If you are familiar with Hadley's paper, you may notice that our definition is different from his. We did this because we find the original definition to be self-contradictory. Hadley claims that tidy data is "Codd’s 3rd normal form, but with the constraints framed in statistical language, and the focus put on a single dataset rather than the many connected datasets common in relational databases." However, Codd's 3rd normal form `requires` multiple tables. 30 | 31 | We agree with Hadley's claim that single table datasets are optimal for data analysis. We also agree with his practice of preferring single datasets at the cost of some data redundancy. We feel that our definition of tidy data is in the spirit of Hadley's original paper. 32 | -------------------------------------------------------------------------------- /docs/source/tidygit.rst: -------------------------------------------------------------------------------- 1 | ``GitExtractor`` API Documentation 2 | ======================================= 3 | 4 | .. automodule:: tidyextractors.tidygit 5 | :members: 6 | 7 | .. autoclass:: GitExtractor 8 | :members: commits, changes, raw 9 | -------------------------------------------------------------------------------- /docs/source/tidymbox.rst: -------------------------------------------------------------------------------- 1 | ``MboxExtractor`` API Documentation 2 | ======================================= 3 | 4 | .. automodule:: tidyextractors.tidymbox 5 | :members: 6 | 7 | .. autoclass:: MboxExtractor 8 | :members: emails, sends, raw 9 | 10 | .. note:: 11 | 12 | This submodule's internals were adapted from Phil Deutsch's 13 | `mbox-to-pandas `_ script with his permission. 14 | -------------------------------------------------------------------------------- /docs/source/tidytwitter.rst: -------------------------------------------------------------------------------- 1 | ``TwitterExtractor`` API Documentation 2 | ======================================= 3 | 4 | .. automodule:: tidyextractors.tidytwitter 5 | :members: 6 | 7 | .. autoclass:: TwitterExtractor 8 | :members: users, tweets, raw 9 | -------------------------------------------------------------------------------- /docs/source/twitter_overview.rst: -------------------------------------------------------------------------------- 1 | Twitter Data Extraction 2 | ======================= 3 | 4 | The ``tidyextractors.tidytwitter`` submodule lets you extract user data from Twitter with minimal effort. This page will guide you through the process. 5 | 6 | A Minimal Code Example 7 | ---------------------- 8 | 9 | .. code-block:: python 10 | 11 | from tidyextractors.tidytwitter import TwitterExtractor 12 | 13 | # Your Twitter API credentails. See below for how to get them! 14 | credentials = { 15 | 'access_token': '', 16 | 'access_secret': '', 17 | 'consumer_key': '', 18 | 'consumer_secret': '' 19 | } 20 | 21 | # A list of users for data extraction. 22 | users = ['user1','user2','user3'] 23 | 24 | # Extract Twitter data. 25 | tx = TwitterExtractor(users, extract_tweets=True, **credentials) 26 | 27 | # Twitter user profile data in a Pandas DataFrame 28 | user_df = tx.users(drop_collections=True) 29 | 30 | # User/tweet keyed Pandas DataFrame 31 | tweet_df = tx.tweets() 32 | 33 | Step 1: Get API Credentials 34 | --------------------------- 35 | 36 | To extract data using the Twitter API, you will first need to obtain API credentials. Your API credentials contain four pieces of information: 37 | 38 | * ``access_token`` 39 | * ``access_secret`` 40 | * ``consumer_key`` 41 | * ``consumer_secret`` 42 | 43 | To get these credentials, check out the Twitter developer documentation: https://dev.twitter.com/oauth/overview/application-owner-access-tokens 44 | 45 | Step 2: Extract Data 46 | -------------------- 47 | 48 | Once you have your API credentials, you can extract user data with the ``TwitterExtractor``: 49 | 50 | .. warning:: 51 | 52 | The Twitter API enforces rate limits, so be careful when downloading large amounts of data. 53 | For a raw report on your remaining limit, call ``tx._api.rate_limit_status()`` after extraction. 54 | 55 | .. note:: 56 | 57 | As per the limit imposed by the Twitter API, only the 3,200 most recent tweets will be downloaded for each user. 58 | 59 | .. code-block:: python 60 | 61 | from tidyextractors.tidytwitter import TwitterExtractor 62 | 63 | credentials = { 64 | # Randomly generated example credentials for demonstration only 65 | 'access_token': '985689236-R0EjHQJZLya6gb82R5g8Odb4UMwkhQy4Q2AxzBnB', 66 | 'access_secret': 'CVuVV0LSf74PQt2HH6zt08aeumGdMvlZtKF7BbHvRmX4r', 67 | 'consumer_key': 'F47AzSRag0KvVFG4eJYexuDqB', 68 | 'consumer_secret': 'lovnyqIA1oKs0jI4A27VXLLSUWrKc0hnNzyTu39NWIjSiq1xxj' 69 | } 70 | 71 | 72 | # User names may have leading "@" but this is not required. 73 | users = ['user1','user2','user3'] 74 | 75 | # Users' tweets are extracted by default, but this may be disabled. 76 | tx = TwitterExtractor(users, extract_tweets=True, **credentials) 77 | 78 | You may need to wait while the data is being extracted, but all the data is now stored inside the extractor object. You just need a bit more code to get it in your preferred format. 79 | 80 | Step 3: Get Pandas Data 81 | ----------------------- 82 | 83 | Now, you can call a ``TwitterExtractor`` method to return data in a Pandas DataFrame. 84 | 85 | .. code-block:: python 86 | 87 | # Twitter user profile data in a Pandas DataFrame 88 | user_df = tx.users(drop_collections=True) 89 | 90 | # User/tweet keyed Pandas DataFrame 91 | tweet_df = tx.tweets() 92 | 93 | .. note:: 94 | 95 | ``TwitterExtractor.users()`` drops columns with collections of data in cells (i.e. ``list``, ``set``, and ``dicts``) because "tidy data" requires only atomic values in cells. 96 | If you don't want data dropped, change the optional ``drop_collections`` argument to false. 97 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | tqdm 2 | nltk 3 | petl 4 | numpy 5 | pandas 6 | tweepy 7 | mailbox 8 | gitpython 9 | sphinx_rtd_theme -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [metadata] 2 | description-file = README.rst -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************************************* 2 | # Copyright (C) 2017 Joel Becker, Jillian Anderson, Steve McColl and Dr. John McLevey 3 | # 4 | # This file is part of the tidyextractors package developed for Dr John McLevey's Networks Lab 5 | # at the University of Waterloo. For more information, see 6 | # http://tidyextractors.readthedocs.io/en/latest/ 7 | # 8 | # tidyextractors is free software: you can redistribute it and/or modify it under the terms of 9 | # the GNU General Public License as published by the Free Software Foundation, either version 3 10 | # of the License, or (at your option) any later version. 11 | # 12 | # tidyextractors is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 13 | # without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 14 | # See the GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License along with tidyextractors. 17 | # If not, see . 18 | # ********************************************************************************************* 19 | 20 | """A setuptools based setup module. 21 | 22 | See: 23 | https://packaging.python.org/en/latest/distributing.html 24 | https://github.com/pypa/sampleproject 25 | """ 26 | import pip 27 | from os import path 28 | from codecs import open 29 | from setuptools import setup, find_packages 30 | from pip.req import parse_requirements 31 | 32 | # handle newer versions of pip 33 | #try: 34 | # from pip._internal.req import parse_requirements 35 | #except ImportError: 36 | # from pip.req import parse_requirements 37 | 38 | 39 | here = path.abspath(path.dirname(__file__)) 40 | 41 | # !!! Update version here! 42 | version_string = '0.3.4' 43 | 44 | # Parse requirements 45 | # parse_requirements() returns generator of pip.req.InstallRequirement objects 46 | install_reqs = parse_requirements('requirements.txt', session=pip.download.PipSession()) 47 | 48 | # reqs is a list of requirement 49 | # e.g. ['django==1.5.1', 'mezzanine==1.4.6'] 50 | reqs = [str(ir.req) for ir in install_reqs] 51 | 52 | # Get the long description from the README file 53 | with open(path.join(here, 'README.rst'), encoding='utf-8') as f: 54 | long_description = f.read() 55 | 56 | setup( 57 | name='tidyextractors', 58 | 59 | # Versions should comply with PEP440. For a discussion on single-sourcing 60 | # the version across setup.py and the project code, see 61 | # https://packaging.python.org/en/latest/single_source_version.html 62 | version=version_string, 63 | 64 | description='A collection of tools for extracting data into tidy DataFrames.', 65 | long_description=long_description, 66 | 67 | # The project's main homepage. 68 | url='https://github.com/networks-lab/tidyextractors/', 69 | download_url='https://github.com/networks-lab/tidyextractors/archive/{}.tar.gz'.format(version_string), 70 | 71 | 72 | # Author details 73 | author='networks-lab', 74 | author_email='john.mclevey@uwaterloo.ca', 75 | 76 | # Choose your license 77 | license='GPLv3', 78 | 79 | # See https://pypi.python.org/pypi?%3Aaction=list_classifiers 80 | classifiers=[ 81 | # How mature is this project? Common values are 82 | # 3 - Alpha 83 | # 4 - Beta 84 | # 5 - Production/Stable 85 | 'Development Status :: 1 - Planning', 86 | 87 | # Indicate who your project is intended for 88 | 'License :: OSI Approved :: GNU General Public License v3 (GPLv3)', 89 | 'Programming Language :: Python :: 3.4', 90 | 'Intended Audience :: Science/Research', 91 | 'Topic :: Scientific/Engineering :: Information Analysis', 92 | 'Topic :: Scientific/Engineering :: Mathematics', 93 | 'Topic :: Sociology', 94 | 'Topic :: Software Development :: Version Control :: Git' 95 | 96 | ], 97 | 98 | # What does your project relate to? 99 | keywords='Git Twitter Pandas Tidy Data mbox', 100 | 101 | # You can just specify the packages manually here if your project is 102 | # simple. Or you can use find_packages(). 103 | packages=find_packages(), 104 | 105 | # Alternatively, if you want to distribute just a my_module.py, uncomment 106 | # this: 107 | # py_modules=["my_module"], 108 | 109 | # List run-time dependencies here. These will be installed by pip when 110 | # your project is installed. For an analysis of "install_requires" vs pip's 111 | # requirements files see: 112 | # https://packaging.python.org/en/latest/requirements.html 113 | install_requires=reqs, 114 | 115 | # List additional groups of dependencies here (e.g. development 116 | # dependencies). You can install these using the following syntax, 117 | # for example: 118 | # $ pip install -e .[dev,test] 119 | # extras_require={ 120 | # 'dev': ['check-manifest'], 121 | # 'test': ['coverage'], 122 | # }, 123 | 124 | # If there are test_data files included in your packages that need to be 125 | # installed, specify them here. If using Python 2.6 or less, then these 126 | # have to be included in MANIFEST.in as well. 127 | # package_data={ 128 | # 'sample': ['package_data.dat'], 129 | # }, 130 | 131 | # Although 'package_data' is the preferred approach, in some case you may 132 | # need to place test_data files outside of your packages. See: 133 | # http://docs.python.org/3.4/distutils/setupscript.html#installing-additional-files # noqa 134 | # In this case, 'data_file' will be installed into '/my_data' 135 | # data_files=[('my_data', ['test_data/data_file'])], 136 | 137 | # To provide executable scripts, use entry points in preference to the 138 | # "scripts" keyword. Entry points provide cross-platform support and allow 139 | # pip to create the appropriate form of executable for the target platform. 140 | # entry_points={ 141 | # 'console_scripts': [ 142 | # 'sample=sample:main', 143 | # ], 144 | # }, 145 | ) 146 | -------------------------------------------------------------------------------- /test/git_data/git/COMMIT_EDITMSG: -------------------------------------------------------------------------------- 1 | Sketch continues into the Lumberjack Song. 2 | -------------------------------------------------------------------------------- /test/git_data/git/HEAD: -------------------------------------------------------------------------------- 1 | ref: refs/heads/master 2 | -------------------------------------------------------------------------------- /test/git_data/git/config: -------------------------------------------------------------------------------- 1 | [core] 2 | repositoryformatversion = 0 3 | filemode = true 4 | bare = false 5 | logallrefupdates = true 6 | ignorecase = true 7 | precomposeunicode = true 8 | -------------------------------------------------------------------------------- /test/git_data/git/description: -------------------------------------------------------------------------------- 1 | Unnamed repository; edit this file 'description' to name the repository. 2 | -------------------------------------------------------------------------------- /test/git_data/git/hooks/applypatch-msg.sample: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # An example hook script to check the commit log message taken by 4 | # applypatch from an e-mail message. 5 | # 6 | # The hook should exit with non-zero status after issuing an 7 | # appropriate message if it wants to stop the commit. The hook is 8 | # allowed to edit the commit message file. 9 | # 10 | # To enable this hook, rename this file to "applypatch-msg". 11 | 12 | . git-sh-setup 13 | commitmsg="$(git rev-parse --git-path hooks/commit-msg)" 14 | test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"} 15 | : 16 | -------------------------------------------------------------------------------- /test/git_data/git/hooks/commit-msg.sample: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # An example hook script to check the commit log message. 4 | # Called by "git commit" with one argument, the name of the file 5 | # that has the commit message. The hook should exit with non-zero 6 | # status after issuing an appropriate message if it wants to stop the 7 | # commit. The hook is allowed to edit the commit message file. 8 | # 9 | # To enable this hook, rename this file to "commit-msg". 10 | 11 | # Uncomment the below to add a Signed-off-by line to the message. 12 | # Doing this in a hook is a bad idea in general, but the prepare-commit-msg 13 | # hook is more suited to it. 14 | # 15 | # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') 16 | # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" 17 | 18 | # This example catches duplicate Signed-off-by lines. 19 | 20 | test "" = "$(grep '^Signed-off-by: ' "$1" | 21 | sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { 22 | echo >&2 Duplicate Signed-off-by lines. 23 | exit 1 24 | } 25 | -------------------------------------------------------------------------------- /test/git_data/git/hooks/post-update.sample: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # An example hook script to prepare a packed repository for use over 4 | # dumb transports. 5 | # 6 | # To enable this hook, rename this file to "post-update". 7 | 8 | exec git update-server-info 9 | -------------------------------------------------------------------------------- /test/git_data/git/hooks/pre-applypatch.sample: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # An example hook script to verify what is about to be committed 4 | # by applypatch from an e-mail message. 5 | # 6 | # The hook should exit with non-zero status after issuing an 7 | # appropriate message if it wants to stop the commit. 8 | # 9 | # To enable this hook, rename this file to "pre-applypatch". 10 | 11 | . git-sh-setup 12 | precommit="$(git rev-parse --git-path hooks/pre-commit)" 13 | test -x "$precommit" && exec "$precommit" ${1+"$@"} 14 | : 15 | -------------------------------------------------------------------------------- /test/git_data/git/hooks/pre-commit.sample: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # An example hook script to verify what is about to be committed. 4 | # Called by "git commit" with no arguments. The hook should 5 | # exit with non-zero status after issuing an appropriate message if 6 | # it wants to stop the commit. 7 | # 8 | # To enable this hook, rename this file to "pre-commit". 9 | 10 | if git rev-parse --verify HEAD >/dev/null 2>&1 11 | then 12 | against=HEAD 13 | else 14 | # Initial commit: diff against an empty tree object 15 | against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 16 | fi 17 | 18 | # If you want to allow non-ASCII filenames set this variable to true. 19 | allownonascii=$(git config --bool hooks.allownonascii) 20 | 21 | # Redirect output to stderr. 22 | exec 1>&2 23 | 24 | # Cross platform projects tend to avoid non-ASCII filenames; prevent 25 | # them from being added to the repository. We exploit the fact that the 26 | # printable range starts at the space character and ends with tilde. 27 | if [ "$allownonascii" != "true" ] && 28 | # Note that the use of brackets around a tr range is ok here, (it's 29 | # even required, for portability to Solaris 10's /usr/bin/tr), since 30 | # the square bracket bytes happen to fall in the designated range. 31 | test $(git diff --cached --name-only --diff-filter=A -z $against | 32 | LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 33 | then 34 | cat <<\EOF 35 | Error: Attempt to add a non-ASCII file name. 36 | 37 | This can cause problems if you want to work with people on other platforms. 38 | 39 | To be portable it is advisable to rename the file. 40 | 41 | If you know what you are doing you can disable this check using: 42 | 43 | git config hooks.allownonascii true 44 | EOF 45 | exit 1 46 | fi 47 | 48 | # If there are whitespace errors, print the offending file names and fail. 49 | exec git diff-index --check --cached $against -- 50 | -------------------------------------------------------------------------------- /test/git_data/git/hooks/pre-push.sample: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # An example hook script to verify what is about to be pushed. Called by "git 4 | # push" after it has checked the remote status, but before anything has been 5 | # pushed. If this script exits with a non-zero status nothing will be pushed. 6 | # 7 | # This hook is called with the following parameters: 8 | # 9 | # $1 -- Name of the remote to which the push is being done 10 | # $2 -- URL to which the push is being done 11 | # 12 | # If pushing without using a named remote those arguments will be equal. 13 | # 14 | # Information about the commits which are being pushed is supplied as lines to 15 | # the standard input in the form: 16 | # 17 | # 18 | # 19 | # This sample shows how to prevent push of commits where the log message starts 20 | # with "WIP" (work in progress). 21 | 22 | remote="$1" 23 | url="$2" 24 | 25 | z40=0000000000000000000000000000000000000000 26 | 27 | while read local_ref local_sha remote_ref remote_sha 28 | do 29 | if [ "$local_sha" = $z40 ] 30 | then 31 | # Handle delete 32 | : 33 | else 34 | if [ "$remote_sha" = $z40 ] 35 | then 36 | # New branch, examine all commits 37 | range="$local_sha" 38 | else 39 | # Update to existing branch, examine new commits 40 | range="$remote_sha..$local_sha" 41 | fi 42 | 43 | # Check for WIP commit 44 | commit=`git rev-list -n 1 --grep '^WIP' "$range"` 45 | if [ -n "$commit" ] 46 | then 47 | echo >&2 "Found WIP commit in $local_ref, not pushing" 48 | exit 1 49 | fi 50 | fi 51 | done 52 | 53 | exit 0 54 | -------------------------------------------------------------------------------- /test/git_data/git/hooks/pre-rebase.sample: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # Copyright (c) 2006, 2008 Junio C Hamano 4 | # 5 | # The "pre-rebase" hook is run just before "git rebase" starts doing 6 | # its job, and can prevent the command from running by exiting with 7 | # non-zero status. 8 | # 9 | # The hook is called with the following parameters: 10 | # 11 | # $1 -- the upstream the series was forked from. 12 | # $2 -- the branch being rebased (or empty when rebasing the current branch). 13 | # 14 | # This sample shows how to prevent topic branches that are already 15 | # merged to 'next' branch from getting rebased, because allowing it 16 | # would result in rebasing already published history. 17 | 18 | publish=next 19 | basebranch="$1" 20 | if test "$#" = 2 21 | then 22 | topic="refs/heads/$2" 23 | else 24 | topic=`git symbolic-ref HEAD` || 25 | exit 0 ;# we do not interrupt rebasing detached HEAD 26 | fi 27 | 28 | case "$topic" in 29 | refs/heads/??/*) 30 | ;; 31 | *) 32 | exit 0 ;# we do not interrupt others. 33 | ;; 34 | esac 35 | 36 | # Now we are dealing with a topic branch being rebased 37 | # on top of master. Is it OK to rebase it? 38 | 39 | # Does the topic really exist? 40 | git show-ref -q "$topic" || { 41 | echo >&2 "No such branch $topic" 42 | exit 1 43 | } 44 | 45 | # Is topic fully merged to master? 46 | not_in_master=`git rev-list --pretty=oneline ^master "$topic"` 47 | if test -z "$not_in_master" 48 | then 49 | echo >&2 "$topic is fully merged to master; better remove it." 50 | exit 1 ;# we could allow it, but there is no point. 51 | fi 52 | 53 | # Is topic ever merged to next? If so you should not be rebasing it. 54 | only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` 55 | only_next_2=`git rev-list ^master ${publish} | sort` 56 | if test "$only_next_1" = "$only_next_2" 57 | then 58 | not_in_topic=`git rev-list "^$topic" master` 59 | if test -z "$not_in_topic" 60 | then 61 | echo >&2 "$topic is already up-to-date with master" 62 | exit 1 ;# we could allow it, but there is no point. 63 | else 64 | exit 0 65 | fi 66 | else 67 | not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` 68 | /usr/bin/perl -e ' 69 | my $topic = $ARGV[0]; 70 | my $msg = "* $topic has commits already merged to public branch:\n"; 71 | my (%not_in_next) = map { 72 | /^([0-9a-f]+) /; 73 | ($1 => 1); 74 | } split(/\n/, $ARGV[1]); 75 | for my $elem (map { 76 | /^([0-9a-f]+) (.*)$/; 77 | [$1 => $2]; 78 | } split(/\n/, $ARGV[2])) { 79 | if (!exists $not_in_next{$elem->[0]}) { 80 | if ($msg) { 81 | print STDERR $msg; 82 | undef $msg; 83 | } 84 | print STDERR " $elem->[1]\n"; 85 | } 86 | } 87 | ' "$topic" "$not_in_next" "$not_in_master" 88 | exit 1 89 | fi 90 | 91 | exit 0 92 | 93 | ################################################################ 94 | 95 | This sample hook safeguards topic branches that have been 96 | published from being rewound. 97 | 98 | The workflow assumed here is: 99 | 100 | * Once a topic branch forks from "master", "master" is never 101 | merged into it again (either directly or indirectly). 102 | 103 | * Once a topic branch is fully cooked and merged into "master", 104 | it is deleted. If you need to build on top of it to correct 105 | earlier mistakes, a new topic branch is created by forking at 106 | the tip of the "master". This is not strictly necessary, but 107 | it makes it easier to keep your history simple. 108 | 109 | * Whenever you need to test or publish your changes to topic 110 | branches, merge them into "next" branch. 111 | 112 | The script, being an example, hardcodes the publish branch name 113 | to be "next", but it is trivial to make it configurable via 114 | $GIT_DIR/config mechanism. 115 | 116 | With this workflow, you would want to know: 117 | 118 | (1) ... if a topic branch has ever been merged to "next". Young 119 | topic branches can have stupid mistakes you would rather 120 | clean up before publishing, and things that have not been 121 | merged into other branches can be easily rebased without 122 | affecting other people. But once it is published, you would 123 | not want to rewind it. 124 | 125 | (2) ... if a topic branch has been fully merged to "master". 126 | Then you can delete it. More importantly, you should not 127 | build on top of it -- other people may already want to 128 | change things related to the topic as patches against your 129 | "master", so if you need further changes, it is better to 130 | fork the topic (perhaps with the same name) afresh from the 131 | tip of "master". 132 | 133 | Let's look at this example: 134 | 135 | o---o---o---o---o---o---o---o---o---o "next" 136 | / / / / 137 | / a---a---b A / / 138 | / / / / 139 | / / c---c---c---c B / 140 | / / / \ / 141 | / / / b---b C \ / 142 | / / / / \ / 143 | ---o---o---o---o---o---o---o---o---o---o---o "master" 144 | 145 | 146 | A, B and C are topic branches. 147 | 148 | * A has one fix since it was merged up to "next". 149 | 150 | * B has finished. It has been fully merged up to "master" and "next", 151 | and is ready to be deleted. 152 | 153 | * C has not merged to "next" at all. 154 | 155 | We would want to allow C to be rebased, refuse A, and encourage 156 | B to be deleted. 157 | 158 | To compute (1): 159 | 160 | git rev-list ^master ^topic next 161 | git rev-list ^master next 162 | 163 | if these match, topic has not merged in next at all. 164 | 165 | To compute (2): 166 | 167 | git rev-list master..topic 168 | 169 | if this is empty, it is fully merged to "master". 170 | -------------------------------------------------------------------------------- /test/git_data/git/hooks/prepare-commit-msg.sample: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # An example hook script to prepare the commit log message. 4 | # Called by "git commit" with the name of the file that has the 5 | # commit message, followed by the description of the commit 6 | # message's source. The hook's purpose is to edit the commit 7 | # message file. If the hook fails with a non-zero status, 8 | # the commit is aborted. 9 | # 10 | # To enable this hook, rename this file to "prepare-commit-msg". 11 | 12 | # This hook includes three examples. The first comments out the 13 | # "Conflicts:" part of a merge commit. 14 | # 15 | # The second includes the output of "git diff --name-status -r" 16 | # into the message, just before the "git status" output. It is 17 | # commented because it doesn't cope with --amend or with squashed 18 | # commits. 19 | # 20 | # The third example adds a Signed-off-by line to the message, that can 21 | # still be edited. This is rarely a good idea. 22 | 23 | case "$2,$3" in 24 | merge,) 25 | /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; 26 | 27 | # ,|template,) 28 | # /usr/bin/perl -i.bak -pe ' 29 | # print "\n" . `git diff --cached --name-status -r` 30 | # if /^#/ && $first++ == 0' "$1" ;; 31 | 32 | *) ;; 33 | esac 34 | 35 | # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') 36 | # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" 37 | -------------------------------------------------------------------------------- /test/git_data/git/hooks/update.sample: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # An example hook script to block unannotated tags from entering. 4 | # Called by "git receive-pack" with arguments: refname sha1-old sha1-new 5 | # 6 | # To enable this hook, rename this file to "update". 7 | # 8 | # Config 9 | # ------ 10 | # hooks.allowunannotated 11 | # This boolean sets whether unannotated tags will be allowed into the 12 | # repository. By default they won't be. 13 | # hooks.allowdeletetag 14 | # This boolean sets whether deleting tags will be allowed in the 15 | # repository. By default they won't be. 16 | # hooks.allowmodifytag 17 | # This boolean sets whether a tag may be modified after creation. By default 18 | # it won't be. 19 | # hooks.allowdeletebranch 20 | # This boolean sets whether deleting branches will be allowed in the 21 | # repository. By default they won't be. 22 | # hooks.denycreatebranch 23 | # This boolean sets whether remotely creating branches will be denied 24 | # in the repository. By default this is allowed. 25 | # 26 | 27 | # --- Command line 28 | refname="$1" 29 | oldrev="$2" 30 | newrev="$3" 31 | 32 | # --- Safety check 33 | if [ -z "$GIT_DIR" ]; then 34 | echo "Don't run this script from the command line." >&2 35 | echo " (if you want, you could supply GIT_DIR then run" >&2 36 | echo " $0 )" >&2 37 | exit 1 38 | fi 39 | 40 | if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then 41 | echo "usage: $0 " >&2 42 | exit 1 43 | fi 44 | 45 | # --- Config 46 | allowunannotated=$(git config --bool hooks.allowunannotated) 47 | allowdeletebranch=$(git config --bool hooks.allowdeletebranch) 48 | denycreatebranch=$(git config --bool hooks.denycreatebranch) 49 | allowdeletetag=$(git config --bool hooks.allowdeletetag) 50 | allowmodifytag=$(git config --bool hooks.allowmodifytag) 51 | 52 | # check for no description 53 | projectdesc=$(sed -e '1q' "$GIT_DIR/description") 54 | case "$projectdesc" in 55 | "Unnamed repository"* | "") 56 | echo "*** Project description file hasn't been set" >&2 57 | exit 1 58 | ;; 59 | esac 60 | 61 | # --- Check types 62 | # if $newrev is 0000...0000, it's a commit to delete a ref. 63 | zero="0000000000000000000000000000000000000000" 64 | if [ "$newrev" = "$zero" ]; then 65 | newrev_type=delete 66 | else 67 | newrev_type=$(git cat-file -t $newrev) 68 | fi 69 | 70 | case "$refname","$newrev_type" in 71 | refs/tags/*,commit) 72 | # un-annotated tag 73 | short_refname=${refname##refs/tags/} 74 | if [ "$allowunannotated" != "true" ]; then 75 | echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 76 | echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 77 | exit 1 78 | fi 79 | ;; 80 | refs/tags/*,delete) 81 | # delete tag 82 | if [ "$allowdeletetag" != "true" ]; then 83 | echo "*** Deleting a tag is not allowed in this repository" >&2 84 | exit 1 85 | fi 86 | ;; 87 | refs/tags/*,tag) 88 | # annotated tag 89 | if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 90 | then 91 | echo "*** Tag '$refname' already exists." >&2 92 | echo "*** Modifying a tag is not allowed in this repository." >&2 93 | exit 1 94 | fi 95 | ;; 96 | refs/heads/*,commit) 97 | # branch 98 | if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then 99 | echo "*** Creating a branch is not allowed in this repository" >&2 100 | exit 1 101 | fi 102 | ;; 103 | refs/heads/*,delete) 104 | # delete branch 105 | if [ "$allowdeletebranch" != "true" ]; then 106 | echo "*** Deleting a branch is not allowed in this repository" >&2 107 | exit 1 108 | fi 109 | ;; 110 | refs/remotes/*,commit) 111 | # tracking branch 112 | ;; 113 | refs/remotes/*,delete) 114 | # delete tracking branch 115 | if [ "$allowdeletebranch" != "true" ]; then 116 | echo "*** Deleting a tracking branch is not allowed in this repository" >&2 117 | exit 1 118 | fi 119 | ;; 120 | *) 121 | # Anything else (is there anything else?) 122 | echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 123 | exit 1 124 | ;; 125 | esac 126 | 127 | # --- Finished 128 | exit 0 129 | -------------------------------------------------------------------------------- /test/git_data/git/index: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/index -------------------------------------------------------------------------------- /test/git_data/git/info/exclude: -------------------------------------------------------------------------------- 1 | # git ls-files --others --exclude-from=.git/info/exclude 2 | # Lines that start with '#' are comments. 3 | # For a project mostly in C, the following would be a good set of 4 | # exclude patterns (uncomment them if you want to use them): 5 | # *.[oa] 6 | # *~ 7 | -------------------------------------------------------------------------------- /test/git_data/git/objects/01/0bad36fac6965df178b5fbef2ec637666f3c01: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/01/0bad36fac6965df178b5fbef2ec637666f3c01 -------------------------------------------------------------------------------- /test/git_data/git/objects/02/5fd86ee626aa8a5c5235ec8d7c623d3313c199: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/02/5fd86ee626aa8a5c5235ec8d7c623d3313c199 -------------------------------------------------------------------------------- /test/git_data/git/objects/02/7cd791354af14986f2fe6eb020cbff42d35dda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/02/7cd791354af14986f2fe6eb020cbff42d35dda -------------------------------------------------------------------------------- /test/git_data/git/objects/03/bee5aa80280750edfe76db99e102b4455ad48b: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/03/bee5aa80280750edfe76db99e102b4455ad48b -------------------------------------------------------------------------------- /test/git_data/git/objects/03/ff2bcb1fb6e6ef93a0da60bff5574766de2ed5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/03/ff2bcb1fb6e6ef93a0da60bff5574766de2ed5 -------------------------------------------------------------------------------- /test/git_data/git/objects/05/0c11812526a6fc2a0fb42d27d2c5c9b1336f2a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/05/0c11812526a6fc2a0fb42d27d2c5c9b1336f2a -------------------------------------------------------------------------------- /test/git_data/git/objects/05/1ac4f2fc1f7014921ae276df6a85cf462e5e7e: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/05/1ac4f2fc1f7014921ae276df6a85cf462e5e7e -------------------------------------------------------------------------------- /test/git_data/git/objects/06/cca1b59f986af5f6f7546e5d8bd4db5bb41f5d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/06/cca1b59f986af5f6f7546e5d8bd4db5bb41f5d -------------------------------------------------------------------------------- /test/git_data/git/objects/07/2409e65d7a84e9acec060c80728c9828de095a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/07/2409e65d7a84e9acec060c80728c9828de095a -------------------------------------------------------------------------------- /test/git_data/git/objects/07/c4064135d4def1664d4a7e6cce851c9c450586: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/07/c4064135d4def1664d4a7e6cce851c9c450586 -------------------------------------------------------------------------------- /test/git_data/git/objects/08/16e1bf9d9cabfe44f3a70eaeb2a22e5e6be8ba: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/08/16e1bf9d9cabfe44f3a70eaeb2a22e5e6be8ba -------------------------------------------------------------------------------- /test/git_data/git/objects/09/b07d250ed69289b412b2eea04e638080cabcfd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/09/b07d250ed69289b412b2eea04e638080cabcfd -------------------------------------------------------------------------------- /test/git_data/git/objects/0c/126519de47bf804378b04fbb67c463c21dba0c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/0c/126519de47bf804378b04fbb67c463c21dba0c -------------------------------------------------------------------------------- /test/git_data/git/objects/0c/70d24f1d10489d909ea5eefa3843b2b05f24ee: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/0c/70d24f1d10489d909ea5eefa3843b2b05f24ee -------------------------------------------------------------------------------- /test/git_data/git/objects/0c/a0f7eb4a6912c2eeb961543e97860bebbdc542: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/0c/a0f7eb4a6912c2eeb961543e97860bebbdc542 -------------------------------------------------------------------------------- /test/git_data/git/objects/0d/0711f064d83e5b964712ff81dd4adae9568090: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/0d/0711f064d83e5b964712ff81dd4adae9568090 -------------------------------------------------------------------------------- /test/git_data/git/objects/0d/75fd6c7c3bd51c9ae2f6397ae24fee5d5a823b: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/0d/75fd6c7c3bd51c9ae2f6397ae24fee5d5a823b -------------------------------------------------------------------------------- /test/git_data/git/objects/0f/2091515311cabe69c1f8b1267797c5b8822dd6: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/0f/2091515311cabe69c1f8b1267797c5b8822dd6 -------------------------------------------------------------------------------- /test/git_data/git/objects/0f/61ccce81d9effa8472ebaf80a846e753c4d64e: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/0f/61ccce81d9effa8472ebaf80a846e753c4d64e -------------------------------------------------------------------------------- /test/git_data/git/objects/11/bc75b2fe02022822f2aeaacc8e952f73686dc4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/11/bc75b2fe02022822f2aeaacc8e952f73686dc4 -------------------------------------------------------------------------------- /test/git_data/git/objects/12/8b788d7e9cf7f2e48c725d15857a269ac398dc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/12/8b788d7e9cf7f2e48c725d15857a269ac398dc -------------------------------------------------------------------------------- /test/git_data/git/objects/13/3dd255cb2e0b9a74fefbc1b75376db59cba81f: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/13/3dd255cb2e0b9a74fefbc1b75376db59cba81f -------------------------------------------------------------------------------- /test/git_data/git/objects/15/6f39c235948e9726e70a56b25076fdf6156e09: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/15/6f39c235948e9726e70a56b25076fdf6156e09 -------------------------------------------------------------------------------- /test/git_data/git/objects/16/0903ab40547f408a9319f1481df88b0c83356c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/16/0903ab40547f408a9319f1481df88b0c83356c -------------------------------------------------------------------------------- /test/git_data/git/objects/16/55c241cd5b218e99cce9bd13ced10712d3c62a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/16/55c241cd5b218e99cce9bd13ced10712d3c62a -------------------------------------------------------------------------------- /test/git_data/git/objects/16/f816144d17f704c60b50beab2d85c0e1108996: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/16/f816144d17f704c60b50beab2d85c0e1108996 -------------------------------------------------------------------------------- /test/git_data/git/objects/16/f82e328b5957f8ebf20a40418d4d7d47c4e699: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/16/f82e328b5957f8ebf20a40418d4d7d47c4e699 -------------------------------------------------------------------------------- /test/git_data/git/objects/19/b422b6b270805c8246da5c4d0f76c2c3516ddb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/19/b422b6b270805c8246da5c4d0f76c2c3516ddb -------------------------------------------------------------------------------- /test/git_data/git/objects/1c/aa95c4e277d33460b0428273f9999602ab4075: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/1c/aa95c4e277d33460b0428273f9999602ab4075 -------------------------------------------------------------------------------- /test/git_data/git/objects/1c/ae65f7eb24b2671f64f275ee328c580969bf39: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/1c/ae65f7eb24b2671f64f275ee328c580969bf39 -------------------------------------------------------------------------------- /test/git_data/git/objects/1e/30b55680a304dbe73c34f13ad85494b554db7d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/1e/30b55680a304dbe73c34f13ad85494b554db7d -------------------------------------------------------------------------------- /test/git_data/git/objects/1f/4b37be2c7ae3e5da9e2cee286d713c75a715cd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/1f/4b37be2c7ae3e5da9e2cee286d713c75a715cd -------------------------------------------------------------------------------- /test/git_data/git/objects/20/b1b5a3488894d6cf0ca94552e3c6ffdbde4e7c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/20/b1b5a3488894d6cf0ca94552e3c6ffdbde4e7c -------------------------------------------------------------------------------- /test/git_data/git/objects/23/c9cef5261968d1a210297bad00b7e1e2e62cfa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/23/c9cef5261968d1a210297bad00b7e1e2e62cfa -------------------------------------------------------------------------------- /test/git_data/git/objects/24/9da961f3c1410acdeecb252f8d792f81e167c3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/24/9da961f3c1410acdeecb252f8d792f81e167c3 -------------------------------------------------------------------------------- /test/git_data/git/objects/25/2407247dfea8ca1972222a14b97f8d8ea6549e: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/25/2407247dfea8ca1972222a14b97f8d8ea6549e -------------------------------------------------------------------------------- /test/git_data/git/objects/25/815ca44e0972ecb7a8f5468bc5f8d2e85e5f83: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/25/815ca44e0972ecb7a8f5468bc5f8d2e85e5f83 -------------------------------------------------------------------------------- /test/git_data/git/objects/25/f5bf5ef3a7b519143d62793727246d08d40770: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/25/f5bf5ef3a7b519143d62793727246d08d40770 -------------------------------------------------------------------------------- /test/git_data/git/objects/26/917e0bfb3558e9057536d0c4a1f3f65daf448f: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/26/917e0bfb3558e9057536d0c4a1f3f65daf448f -------------------------------------------------------------------------------- /test/git_data/git/objects/28/206af6232d86fa2e64e560fbc213839d68642a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/28/206af6232d86fa2e64e560fbc213839d68642a -------------------------------------------------------------------------------- /test/git_data/git/objects/28/34e135e97d99995cb31ac0486590e4f054e672: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/28/34e135e97d99995cb31ac0486590e4f054e672 -------------------------------------------------------------------------------- /test/git_data/git/objects/29/f2dd0dfe7d955c1289e5c09d74f3bbb01d2b60: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/29/f2dd0dfe7d955c1289e5c09d74f3bbb01d2b60 -------------------------------------------------------------------------------- /test/git_data/git/objects/2b/33f7923a853eec8b819835f84fdb002591fee0: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/2b/33f7923a853eec8b819835f84fdb002591fee0 -------------------------------------------------------------------------------- /test/git_data/git/objects/2b/f8358382bb4bf05d8f4787d1fc5116c90891ce: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/2b/f8358382bb4bf05d8f4787d1fc5116c90891ce -------------------------------------------------------------------------------- /test/git_data/git/objects/2f/90cf9d0341d76992828c57e7557985bb571ad8: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/2f/90cf9d0341d76992828c57e7557985bb571ad8 -------------------------------------------------------------------------------- /test/git_data/git/objects/30/4d23cf90348287d5bd0b3ff34396ed39432461: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/30/4d23cf90348287d5bd0b3ff34396ed39432461 -------------------------------------------------------------------------------- /test/git_data/git/objects/30/93785a17f5ddc4d66159bca4253f470fdcef85: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/30/93785a17f5ddc4d66159bca4253f470fdcef85 -------------------------------------------------------------------------------- /test/git_data/git/objects/32/b66532fbc42e2e92d70db1de069aac8ac7f22d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/32/b66532fbc42e2e92d70db1de069aac8ac7f22d -------------------------------------------------------------------------------- /test/git_data/git/objects/33/0ae3869e76997f4855e0b301b00383f33d8521: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/33/0ae3869e76997f4855e0b301b00383f33d8521 -------------------------------------------------------------------------------- /test/git_data/git/objects/33/42e07756583476342b5eb80431ba3f40860580: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/33/42e07756583476342b5eb80431ba3f40860580 -------------------------------------------------------------------------------- /test/git_data/git/objects/33/8f036105032b2c13aa624bb74d698d4adeed47: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/33/8f036105032b2c13aa624bb74d698d4adeed47 -------------------------------------------------------------------------------- /test/git_data/git/objects/33/e0169a3804feb7f8f59bd3ed06e3995f6edca7: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/33/e0169a3804feb7f8f59bd3ed06e3995f6edca7 -------------------------------------------------------------------------------- /test/git_data/git/objects/34/ea2709080ec4e9c2ea0103d72db77b8b42ba95: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/34/ea2709080ec4e9c2ea0103d72db77b8b42ba95 -------------------------------------------------------------------------------- /test/git_data/git/objects/35/72e019aa433a5421add562ef476d1195d5909b: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/35/72e019aa433a5421add562ef476d1195d5909b -------------------------------------------------------------------------------- /test/git_data/git/objects/35/d142206cdaa37037ae956adbe3baab22ca3959: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/35/d142206cdaa37037ae956adbe3baab22ca3959 -------------------------------------------------------------------------------- /test/git_data/git/objects/36/bade49e237d4cfa23c3168cb409f278707bd45: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/36/bade49e237d4cfa23c3168cb409f278707bd45 -------------------------------------------------------------------------------- /test/git_data/git/objects/36/d97f7ca2f509f440dbc9d024629e3e794a4c09: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/36/d97f7ca2f509f440dbc9d024629e3e794a4c09 -------------------------------------------------------------------------------- /test/git_data/git/objects/39/90e7069bd55c7441f4d197fa95331b539e7ccf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/39/90e7069bd55c7441f4d197fa95331b539e7ccf -------------------------------------------------------------------------------- /test/git_data/git/objects/3a/f3766e42b3b39f3152498b8b32fa01c36bf8f2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/3a/f3766e42b3b39f3152498b8b32fa01c36bf8f2 -------------------------------------------------------------------------------- /test/git_data/git/objects/3e/24f1df64044c816094c9e202d4cf71e54f6886: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/3e/24f1df64044c816094c9e202d4cf71e54f6886 -------------------------------------------------------------------------------- /test/git_data/git/objects/3e/fd7610a7979faf407a1f846ce86bbd110cf89d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/3e/fd7610a7979faf407a1f846ce86bbd110cf89d -------------------------------------------------------------------------------- /test/git_data/git/objects/40/9feb3a6f51087a54f78b7653cab6e1f5229af8: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/40/9feb3a6f51087a54f78b7653cab6e1f5229af8 -------------------------------------------------------------------------------- /test/git_data/git/objects/41/3cb81d545bf64b678b86f74dfc7e3ab7e21359: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/41/3cb81d545bf64b678b86f74dfc7e3ab7e21359 -------------------------------------------------------------------------------- /test/git_data/git/objects/41/f02c9bfd84166c561830a981a91cb9bf3f842e: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/41/f02c9bfd84166c561830a981a91cb9bf3f842e -------------------------------------------------------------------------------- /test/git_data/git/objects/42/97d430205e60b99db5718ba9d94c90fe5dc620: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/42/97d430205e60b99db5718ba9d94c90fe5dc620 -------------------------------------------------------------------------------- /test/git_data/git/objects/42/e2e607b75b45a0c7c1d7330bfea852f1c1f685: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/42/e2e607b75b45a0c7c1d7330bfea852f1c1f685 -------------------------------------------------------------------------------- /test/git_data/git/objects/43/0aa6bb8814359c8bed68d36bdd13f976172849: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/43/0aa6bb8814359c8bed68d36bdd13f976172849 -------------------------------------------------------------------------------- /test/git_data/git/objects/43/ee097ac54aa20631826a3b2032e9bf75fe3d83: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/43/ee097ac54aa20631826a3b2032e9bf75fe3d83 -------------------------------------------------------------------------------- /test/git_data/git/objects/44/171f590f5023c5b8e1a5379e9caa3821e452dc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/44/171f590f5023c5b8e1a5379e9caa3821e452dc -------------------------------------------------------------------------------- /test/git_data/git/objects/46/6273ca346ab6c33c78e016c24011f4aa8fd404: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/46/6273ca346ab6c33c78e016c24011f4aa8fd404 -------------------------------------------------------------------------------- /test/git_data/git/objects/49/0b3fd63ee5e111c932c0cb0579b04a34503f7f: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/49/0b3fd63ee5e111c932c0cb0579b04a34503f7f -------------------------------------------------------------------------------- /test/git_data/git/objects/4a/07ccb2d291e15f29944955f04e2df6067e5710: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/4a/07ccb2d291e15f29944955f04e2df6067e5710 -------------------------------------------------------------------------------- /test/git_data/git/objects/4a/aa93fb23a75853d89574d76d5e868ce6a228cb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/4a/aa93fb23a75853d89574d76d5e868ce6a228cb -------------------------------------------------------------------------------- /test/git_data/git/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904: -------------------------------------------------------------------------------- 1 | x+)JMU0` 2 | , -------------------------------------------------------------------------------- /test/git_data/git/objects/4c/39557de87a360f1602c13afbbdc72b63b1608c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/4c/39557de87a360f1602c13afbbdc72b63b1608c -------------------------------------------------------------------------------- /test/git_data/git/objects/4c/3c937730d646e2b018f536edb8cf329e60f053: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/4c/3c937730d646e2b018f536edb8cf329e60f053 -------------------------------------------------------------------------------- /test/git_data/git/objects/4c/d59d6fe530d876f2dab6b3c2de7253238b98cd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/4c/d59d6fe530d876f2dab6b3c2de7253238b98cd -------------------------------------------------------------------------------- /test/git_data/git/objects/4e/2cf37683359e50ebc85cfccfc235907b0234ae: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/4e/2cf37683359e50ebc85cfccfc235907b0234ae -------------------------------------------------------------------------------- /test/git_data/git/objects/4f/86b1551e3470ab1ebb87742e6704d615353c3d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/4f/86b1551e3470ab1ebb87742e6704d615353c3d -------------------------------------------------------------------------------- /test/git_data/git/objects/51/26bdecc5b2d7d92eef1e31b4bbff7b4300a7a5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/51/26bdecc5b2d7d92eef1e31b4bbff7b4300a7a5 -------------------------------------------------------------------------------- /test/git_data/git/objects/51/2a8037773b22530c5928d6456460e1c054a2c1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/51/2a8037773b22530c5928d6456460e1c054a2c1 -------------------------------------------------------------------------------- /test/git_data/git/objects/51/5612b3e5466542b1325aff16ccdc02ab34dd60: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/51/5612b3e5466542b1325aff16ccdc02ab34dd60 -------------------------------------------------------------------------------- /test/git_data/git/objects/52/02b077a5f29602bd2671149a1f194e2ff4a59b: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/52/02b077a5f29602bd2671149a1f194e2ff4a59b -------------------------------------------------------------------------------- /test/git_data/git/objects/52/a02cc1f0ca27b95f96ca49ac97a5d800b5aca5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/52/a02cc1f0ca27b95f96ca49ac97a5d800b5aca5 -------------------------------------------------------------------------------- /test/git_data/git/objects/53/da6e9308d900dce7f70b5e36dd733657f4d8ab: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/53/da6e9308d900dce7f70b5e36dd733657f4d8ab -------------------------------------------------------------------------------- /test/git_data/git/objects/54/583510dece02dbbc4ff559ab7c6f9e25e174a5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/54/583510dece02dbbc4ff559ab7c6f9e25e174a5 -------------------------------------------------------------------------------- /test/git_data/git/objects/54/78c4229d514a7512b26dcca0f60548f834b679: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/54/78c4229d514a7512b26dcca0f60548f834b679 -------------------------------------------------------------------------------- /test/git_data/git/objects/55/800a7b02ff7e4748ad58cc69f04576f5083b98: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/55/800a7b02ff7e4748ad58cc69f04576f5083b98 -------------------------------------------------------------------------------- /test/git_data/git/objects/55/a77a5dbd7334ff9bcff22510a324fa14758864: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/55/a77a5dbd7334ff9bcff22510a324fa14758864 -------------------------------------------------------------------------------- /test/git_data/git/objects/55/f83b0a22ce00589889169451f67aae09745466: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/55/f83b0a22ce00589889169451f67aae09745466 -------------------------------------------------------------------------------- /test/git_data/git/objects/56/e0d89e80ac4ac0659467d41c71c6702ff14df6: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/56/e0d89e80ac4ac0659467d41c71c6702ff14df6 -------------------------------------------------------------------------------- /test/git_data/git/objects/57/9ab67409eb2b7ce59f50f424f9881f2dfd0c6d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/57/9ab67409eb2b7ce59f50f424f9881f2dfd0c6d -------------------------------------------------------------------------------- /test/git_data/git/objects/58/1edc53c2914455398755c395c558fe3c3043f6: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/58/1edc53c2914455398755c395c558fe3c3043f6 -------------------------------------------------------------------------------- /test/git_data/git/objects/58/257ba2ea0bd123ad0f0c6566196a1d3a368e72: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/58/257ba2ea0bd123ad0f0c6566196a1d3a368e72 -------------------------------------------------------------------------------- /test/git_data/git/objects/58/410baf93ebf3ed9147f25c5dbfd65304c42fbb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/58/410baf93ebf3ed9147f25c5dbfd65304c42fbb -------------------------------------------------------------------------------- /test/git_data/git/objects/58/4a7679837a136fdd4f46dd30de55c4b7014ee8: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/58/4a7679837a136fdd4f46dd30de55c4b7014ee8 -------------------------------------------------------------------------------- /test/git_data/git/objects/59/08c4eb2c48b7b88fe9c43a76028685ffa563cd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/59/08c4eb2c48b7b88fe9c43a76028685ffa563cd -------------------------------------------------------------------------------- /test/git_data/git/objects/5c/2fe1d2de2e84020cdd4936c220cdeba877eb0d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/5c/2fe1d2de2e84020cdd4936c220cdeba877eb0d -------------------------------------------------------------------------------- /test/git_data/git/objects/5d/3a4b91c4bd0045cbff6d0ac1508fafab471137: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/5d/3a4b91c4bd0045cbff6d0ac1508fafab471137 -------------------------------------------------------------------------------- /test/git_data/git/objects/5d/b1fcea2e1e1f466e0d37d2d187fa2b10fc1ffc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/5d/b1fcea2e1e1f466e0d37d2d187fa2b10fc1ffc -------------------------------------------------------------------------------- /test/git_data/git/objects/5e/d9c3fac12e7855c02b13dcaa2a8fc0957477a6: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/5e/d9c3fac12e7855c02b13dcaa2a8fc0957477a6 -------------------------------------------------------------------------------- /test/git_data/git/objects/5f/427e5f6c9e18150ac270327d48301a7fbc97c9: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/5f/427e5f6c9e18150ac270327d48301a7fbc97c9 -------------------------------------------------------------------------------- /test/git_data/git/objects/5f/42cef4bc0b1379a88e825c7a5214f3b9e1b038: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/5f/42cef4bc0b1379a88e825c7a5214f3b9e1b038 -------------------------------------------------------------------------------- /test/git_data/git/objects/5f/f2123cd8487db817a66f6604393e9839582b70: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/5f/f2123cd8487db817a66f6604393e9839582b70 -------------------------------------------------------------------------------- /test/git_data/git/objects/60/0ff317a189208fca1416cbaf72cf954b452820: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/60/0ff317a189208fca1416cbaf72cf954b452820 -------------------------------------------------------------------------------- /test/git_data/git/objects/60/aa79e0fbb2bdce9961f89b4b9e49cefdb0958a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/60/aa79e0fbb2bdce9961f89b4b9e49cefdb0958a -------------------------------------------------------------------------------- /test/git_data/git/objects/64/2688757a1b8edd9b60d7b7cae21b2fb1f447c2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/64/2688757a1b8edd9b60d7b7cae21b2fb1f447c2 -------------------------------------------------------------------------------- /test/git_data/git/objects/64/c62ab9155ea339c6ac5629efae641996f38678: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/64/c62ab9155ea339c6ac5629efae641996f38678 -------------------------------------------------------------------------------- /test/git_data/git/objects/65/1a69c662ed4af98a0cc8dc01e6b53e4741ff25: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/65/1a69c662ed4af98a0cc8dc01e6b53e4741ff25 -------------------------------------------------------------------------------- /test/git_data/git/objects/65/c482304ed7d92e6db5cd5a9dd89e6f0b9cbbb1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/65/c482304ed7d92e6db5cd5a9dd89e6f0b9cbbb1 -------------------------------------------------------------------------------- /test/git_data/git/objects/66/3a5bf6ecbfe096de29a7a8290afe494aa7e24d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/66/3a5bf6ecbfe096de29a7a8290afe494aa7e24d -------------------------------------------------------------------------------- /test/git_data/git/objects/66/80bc824b6a25286344736a1502f04b8567fc74: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/66/80bc824b6a25286344736a1502f04b8567fc74 -------------------------------------------------------------------------------- /test/git_data/git/objects/66/ee6a99bf38c93f4a6e0cb54be1e4327d96bb3d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/66/ee6a99bf38c93f4a6e0cb54be1e4327d96bb3d -------------------------------------------------------------------------------- /test/git_data/git/objects/67/52f71d6881a3b40cd4004d2768f6a213894fb0: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/67/52f71d6881a3b40cd4004d2768f6a213894fb0 -------------------------------------------------------------------------------- /test/git_data/git/objects/68/1bc4728a137581fc30cc3800d59ad676d16c48: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/68/1bc4728a137581fc30cc3800d59ad676d16c48 -------------------------------------------------------------------------------- /test/git_data/git/objects/6a/ba3142983a0c31740b04757e22d36945a5dd08: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/6a/ba3142983a0c31740b04757e22d36945a5dd08 -------------------------------------------------------------------------------- /test/git_data/git/objects/6b/2f24b4943a6db940ea3543af251222fc523404: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/6b/2f24b4943a6db940ea3543af251222fc523404 -------------------------------------------------------------------------------- /test/git_data/git/objects/6b/3aaa101c00f2e9082211986ccaa53c7e55352d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/6b/3aaa101c00f2e9082211986ccaa53c7e55352d -------------------------------------------------------------------------------- /test/git_data/git/objects/6e/2bc8bfa0c22c44a5a727ecb7ef25e31f0af637: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/6e/2bc8bfa0c22c44a5a727ecb7ef25e31f0af637 -------------------------------------------------------------------------------- /test/git_data/git/objects/6e/4780add72110d0c6e6524695fffcf83819a3b2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/6e/4780add72110d0c6e6524695fffcf83819a3b2 -------------------------------------------------------------------------------- /test/git_data/git/objects/6e/7b022e4f13009cbdf771eaa6dff718572086d3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/6e/7b022e4f13009cbdf771eaa6dff718572086d3 -------------------------------------------------------------------------------- /test/git_data/git/objects/6f/6192f6e98f575bc7ffb386a3e8b9509af76c93: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/6f/6192f6e98f575bc7ffb386a3e8b9509af76c93 -------------------------------------------------------------------------------- /test/git_data/git/objects/70/43732c57f96e42f25c99dc09a135f54a3083eb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/70/43732c57f96e42f25c99dc09a135f54a3083eb -------------------------------------------------------------------------------- /test/git_data/git/objects/70/a628e6992eec4b237ffb21b425846235785c42: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/70/a628e6992eec4b237ffb21b425846235785c42 -------------------------------------------------------------------------------- /test/git_data/git/objects/72/6230215959f5819299414e42cc423008164d68: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/72/6230215959f5819299414e42cc423008164d68 -------------------------------------------------------------------------------- /test/git_data/git/objects/74/ab28d379edcb02294fe013b04e3948b4ae96c3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/74/ab28d379edcb02294fe013b04e3948b4ae96c3 -------------------------------------------------------------------------------- /test/git_data/git/objects/74/e6792756ba6eaca6525bfbd3a38d87a41a8734: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/74/e6792756ba6eaca6525bfbd3a38d87a41a8734 -------------------------------------------------------------------------------- /test/git_data/git/objects/75/9aab8cbcc031075e66cee042d43c5b34a9069f: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/75/9aab8cbcc031075e66cee042d43c5b34a9069f -------------------------------------------------------------------------------- /test/git_data/git/objects/76/2906cba2ff3e7441706d26b783e6534c9d01c7: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/76/2906cba2ff3e7441706d26b783e6534c9d01c7 -------------------------------------------------------------------------------- /test/git_data/git/objects/76/3d6b338b9b3557177ca7803e9adc89ca7670b9: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/76/3d6b338b9b3557177ca7803e9adc89ca7670b9 -------------------------------------------------------------------------------- /test/git_data/git/objects/78/4db8dcd5ef86e29e6d31e69848317cd59a780c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/78/4db8dcd5ef86e29e6d31e69848317cd59a780c -------------------------------------------------------------------------------- /test/git_data/git/objects/79/2e8411cc47a8a0d6ffcb15f001e2038aef5a78: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/79/2e8411cc47a8a0d6ffcb15f001e2038aef5a78 -------------------------------------------------------------------------------- /test/git_data/git/objects/7a/3d8abbe884f2470cc378de7dc728b132c66ee2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/7a/3d8abbe884f2470cc378de7dc728b132c66ee2 -------------------------------------------------------------------------------- /test/git_data/git/objects/7a/68589a533365f38ab199f59d9f28c43cfe7b0f: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/7a/68589a533365f38ab199f59d9f28c43cfe7b0f -------------------------------------------------------------------------------- /test/git_data/git/objects/7a/a94255299a58358db04b0c52438601c8592cc5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/7a/a94255299a58358db04b0c52438601c8592cc5 -------------------------------------------------------------------------------- /test/git_data/git/objects/7e/12eba89fbaa135890b14b794ca448486867fb2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/7e/12eba89fbaa135890b14b794ca448486867fb2 -------------------------------------------------------------------------------- /test/git_data/git/objects/7f/e7fd769124d51898615c2618384d5a032058fc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/7f/e7fd769124d51898615c2618384d5a032058fc -------------------------------------------------------------------------------- /test/git_data/git/objects/80/527b0b8751d4775d8fcda5bca6e079eb690208: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/80/527b0b8751d4775d8fcda5bca6e079eb690208 -------------------------------------------------------------------------------- /test/git_data/git/objects/81/1b117b47eee74e0705ead4125b3324bcc6ff89: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/81/1b117b47eee74e0705ead4125b3324bcc6ff89 -------------------------------------------------------------------------------- /test/git_data/git/objects/81/6c339c354f2ec71e874ffce29fddde5b13435f: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/81/6c339c354f2ec71e874ffce29fddde5b13435f -------------------------------------------------------------------------------- /test/git_data/git/objects/82/a079cc92ae7f1982f73089bc85eb4f78517fc4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/82/a079cc92ae7f1982f73089bc85eb4f78517fc4 -------------------------------------------------------------------------------- /test/git_data/git/objects/83/f63bbc16503a3f594c1a06be851dd2d1f9a30b: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/83/f63bbc16503a3f594c1a06be851dd2d1f9a30b -------------------------------------------------------------------------------- /test/git_data/git/objects/84/1083feca295d4c66779cf7de8936990da29b19: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/84/1083feca295d4c66779cf7de8936990da29b19 -------------------------------------------------------------------------------- /test/git_data/git/objects/84/a95768b63313ffc31b1e3ff155822cff612d7a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/84/a95768b63313ffc31b1e3ff155822cff612d7a -------------------------------------------------------------------------------- /test/git_data/git/objects/85/55cdcb240f55fbc96a1a1e83242da101dfacb4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/85/55cdcb240f55fbc96a1a1e83242da101dfacb4 -------------------------------------------------------------------------------- /test/git_data/git/objects/85/783d1ea0fb9cf201fe6245459d89b0c679ec59: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/85/783d1ea0fb9cf201fe6245459d89b0c679ec59 -------------------------------------------------------------------------------- /test/git_data/git/objects/85/8b96ac521a30404139a10d13d40373d5802e76: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/85/8b96ac521a30404139a10d13d40373d5802e76 -------------------------------------------------------------------------------- /test/git_data/git/objects/87/b5248662096d751cc9a4dc303cb9e4a1526c47: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/87/b5248662096d751cc9a4dc303cb9e4a1526c47 -------------------------------------------------------------------------------- /test/git_data/git/objects/88/111303ffd9a760ad498502c10f2ad0a37b273b: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/88/111303ffd9a760ad498502c10f2ad0a37b273b -------------------------------------------------------------------------------- /test/git_data/git/objects/88/99668bb5abf30394d25fdb5248545850e01611: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/88/99668bb5abf30394d25fdb5248545850e01611 -------------------------------------------------------------------------------- /test/git_data/git/objects/89/33bebed6cb6ade83e198d51f7069b7dc1cfc6b: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/89/33bebed6cb6ade83e198d51f7069b7dc1cfc6b -------------------------------------------------------------------------------- /test/git_data/git/objects/89/be5efe8b457c739668a0f42b4c9b76162bcf85: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/89/be5efe8b457c739668a0f42b4c9b76162bcf85 -------------------------------------------------------------------------------- /test/git_data/git/objects/8a/00c1c606dd113976d3dfe823bbc416fa7579a6: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/8a/00c1c606dd113976d3dfe823bbc416fa7579a6 -------------------------------------------------------------------------------- /test/git_data/git/objects/8a/28e121a0625faab91da8da1a4b3b6f1f1c89ee: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/8a/28e121a0625faab91da8da1a4b3b6f1f1c89ee -------------------------------------------------------------------------------- /test/git_data/git/objects/8a/8b3efd3c431737432e20ed0c8ade8d7dcb89d5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/8a/8b3efd3c431737432e20ed0c8ade8d7dcb89d5 -------------------------------------------------------------------------------- /test/git_data/git/objects/8a/cba56447e5ea53c22e4a341844ffc4347dc4f9: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/8a/cba56447e5ea53c22e4a341844ffc4347dc4f9 -------------------------------------------------------------------------------- /test/git_data/git/objects/8b/7efa1df60c4c1cbf42abd669978ed586ae93c0: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/8b/7efa1df60c4c1cbf42abd669978ed586ae93c0 -------------------------------------------------------------------------------- /test/git_data/git/objects/8b/ef0bcb2aefe0e550f638674da243694220cb0e: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/8b/ef0bcb2aefe0e550f638674da243694220cb0e -------------------------------------------------------------------------------- /test/git_data/git/objects/8c/6fff2d02bddf18f72adf3e345b43cf7bc7baca: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/8c/6fff2d02bddf18f72adf3e345b43cf7bc7baca -------------------------------------------------------------------------------- /test/git_data/git/objects/8d/3b4c8b8591a1670b32ea6ed643f4261b9a0724: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/8d/3b4c8b8591a1670b32ea6ed643f4261b9a0724 -------------------------------------------------------------------------------- /test/git_data/git/objects/8d/fd51fb4b00bb10fd569cd12ed3ba94120cb3fe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/8d/fd51fb4b00bb10fd569cd12ed3ba94120cb3fe -------------------------------------------------------------------------------- /test/git_data/git/objects/8e/1070059a3144df73c25c587be799e2480b13ce: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/8e/1070059a3144df73c25c587be799e2480b13ce -------------------------------------------------------------------------------- /test/git_data/git/objects/8f/45a55623d3f51444e3d223cdaf668d394d09c2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/8f/45a55623d3f51444e3d223cdaf668d394d09c2 -------------------------------------------------------------------------------- /test/git_data/git/objects/90/b745512b67a0f14bf6009b9a6b125e9afd0fa3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/90/b745512b67a0f14bf6009b9a6b125e9afd0fa3 -------------------------------------------------------------------------------- /test/git_data/git/objects/92/0635a60d660032d60588316f66004eba1f6754: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/92/0635a60d660032d60588316f66004eba1f6754 -------------------------------------------------------------------------------- /test/git_data/git/objects/92/3361ee6cc1ae0c92e57ae6cfa2f7953dd05743: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/92/3361ee6cc1ae0c92e57ae6cfa2f7953dd05743 -------------------------------------------------------------------------------- /test/git_data/git/objects/92/66b9075c8fe4bf342777631a8014b8547cc10f: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/92/66b9075c8fe4bf342777631a8014b8547cc10f -------------------------------------------------------------------------------- /test/git_data/git/objects/92/bd1dbdb4baac231e07e397b029bff666cce4a5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/92/bd1dbdb4baac231e07e397b029bff666cce4a5 -------------------------------------------------------------------------------- /test/git_data/git/objects/93/a2e3451b3b98ecb1462804f5e01b836501f0d7: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/93/a2e3451b3b98ecb1462804f5e01b836501f0d7 -------------------------------------------------------------------------------- /test/git_data/git/objects/97/6a4741981170548070b8c69123939855b28c38: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/97/6a4741981170548070b8c69123939855b28c38 -------------------------------------------------------------------------------- /test/git_data/git/objects/98/9c930901e38d02e93319fc3c3f70b173565cca: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/98/9c930901e38d02e93319fc3c3f70b173565cca -------------------------------------------------------------------------------- /test/git_data/git/objects/9a/b368d31c531705afd2d756992fbcad47005e5a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/9a/b368d31c531705afd2d756992fbcad47005e5a -------------------------------------------------------------------------------- /test/git_data/git/objects/9b/4d25385fe3970d295b52b8be3cdf31f9148860: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/9b/4d25385fe3970d295b52b8be3cdf31f9148860 -------------------------------------------------------------------------------- /test/git_data/git/objects/9c/0e4c149a4b428889e62ae9a91e1b8278f30dd7: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/9c/0e4c149a4b428889e62ae9a91e1b8278f30dd7 -------------------------------------------------------------------------------- /test/git_data/git/objects/9e/24a25c1a9cb1b57de5fbfbee383d601eb58039: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/9e/24a25c1a9cb1b57de5fbfbee383d601eb58039 -------------------------------------------------------------------------------- /test/git_data/git/objects/9e/32107ae8c380abae6a1d3143044e70613551c5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/9e/32107ae8c380abae6a1d3143044e70613551c5 -------------------------------------------------------------------------------- /test/git_data/git/objects/9e/5de8aa20b0631f19841f5a4b60e3f0f8197ea0: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/9e/5de8aa20b0631f19841f5a4b60e3f0f8197ea0 -------------------------------------------------------------------------------- /test/git_data/git/objects/9f/0bcbbbbda18c13c6cf2a34bf74a106818753e9: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/9f/0bcbbbbda18c13c6cf2a34bf74a106818753e9 -------------------------------------------------------------------------------- /test/git_data/git/objects/9f/b4dc4bba6397c643dddcdcbf1c2d8f3ae027fe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/9f/b4dc4bba6397c643dddcdcbf1c2d8f3ae027fe -------------------------------------------------------------------------------- /test/git_data/git/objects/9f/d26c27710f7ddf3ad76fb103d61ebd3e98cb44: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/9f/d26c27710f7ddf3ad76fb103d61ebd3e98cb44 -------------------------------------------------------------------------------- /test/git_data/git/objects/a1/b1a150b43f8beda71dac3a7a35b8eb35a9f5fd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/a1/b1a150b43f8beda71dac3a7a35b8eb35a9f5fd -------------------------------------------------------------------------------- /test/git_data/git/objects/a1/c114a79444b5fb103cc6e2c4ca7c7affc8fd78: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/a1/c114a79444b5fb103cc6e2c4ca7c7affc8fd78 -------------------------------------------------------------------------------- /test/git_data/git/objects/a2/c8337b850e88e42d3f38b46810f4db6bb9ed5b: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/a2/c8337b850e88e42d3f38b46810f4db6bb9ed5b -------------------------------------------------------------------------------- /test/git_data/git/objects/a6/93385d1b0a9e277adb2cd64adcf915dc8587ab: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/a6/93385d1b0a9e277adb2cd64adcf915dc8587ab -------------------------------------------------------------------------------- /test/git_data/git/objects/a6/9b147a549b0eac5b18458cdc2891f5dbee6525: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/a6/9b147a549b0eac5b18458cdc2891f5dbee6525 -------------------------------------------------------------------------------- /test/git_data/git/objects/a8/0160ce24609135e79bb9dde416e6f65b23de9e: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/a8/0160ce24609135e79bb9dde416e6f65b23de9e -------------------------------------------------------------------------------- /test/git_data/git/objects/a8/706b58d19bba3484a7a9375a989ff52cc548b5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/a8/706b58d19bba3484a7a9375a989ff52cc548b5 -------------------------------------------------------------------------------- /test/git_data/git/objects/a8/b8e4c7cad383ff09e3160a11c8206f918689f5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/a8/b8e4c7cad383ff09e3160a11c8206f918689f5 -------------------------------------------------------------------------------- /test/git_data/git/objects/aa/27df06dab350e7c783e2b5a9475b4d7afca971: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/aa/27df06dab350e7c783e2b5a9475b4d7afca971 -------------------------------------------------------------------------------- /test/git_data/git/objects/aa/abd8d7f90e6170efbe7e598136a54150ca0252: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/aa/abd8d7f90e6170efbe7e598136a54150ca0252 -------------------------------------------------------------------------------- /test/git_data/git/objects/ac/14b1581b03b1aea494785568e6c0a9db8da8cb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/ac/14b1581b03b1aea494785568e6c0a9db8da8cb -------------------------------------------------------------------------------- /test/git_data/git/objects/ac/95222160088b4e604f3e34f64c506254dea2e1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/ac/95222160088b4e604f3e34f64c506254dea2e1 -------------------------------------------------------------------------------- /test/git_data/git/objects/ad/951e0c0e312c04e3f7757dfcd72e096bd8f047: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/ad/951e0c0e312c04e3f7757dfcd72e096bd8f047 -------------------------------------------------------------------------------- /test/git_data/git/objects/ae/dc34d6e0c2cd748453219a4283020b3793f972: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/ae/dc34d6e0c2cd748453219a4283020b3793f972 -------------------------------------------------------------------------------- /test/git_data/git/objects/af/01d4ead2846bed64a8e7dbae8c9658478b6cff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/af/01d4ead2846bed64a8e7dbae8c9658478b6cff -------------------------------------------------------------------------------- /test/git_data/git/objects/b1/60721c96cc432b7be703ad33ed5c8b61030369: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/b1/60721c96cc432b7be703ad33ed5c8b61030369 -------------------------------------------------------------------------------- /test/git_data/git/objects/b1/6a3a32d9daa7c03accb88fbb55b5c84ed15b9c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/b1/6a3a32d9daa7c03accb88fbb55b5c84ed15b9c -------------------------------------------------------------------------------- /test/git_data/git/objects/b2/507872e8a1de19f5faa69745d1fbc7e21acb43: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/b2/507872e8a1de19f5faa69745d1fbc7e21acb43 -------------------------------------------------------------------------------- /test/git_data/git/objects/b2/5a8cff89b4c9cb5b04be8436633d462e16aaef: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/b2/5a8cff89b4c9cb5b04be8436633d462e16aaef -------------------------------------------------------------------------------- /test/git_data/git/objects/b2/8f8a066d6133a3e8861893f138683c8eec93a5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/b2/8f8a066d6133a3e8861893f138683c8eec93a5 -------------------------------------------------------------------------------- /test/git_data/git/objects/b5/a3c34d8eefe35ad00133a43540d8a9249bde6a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/b5/a3c34d8eefe35ad00133a43540d8a9249bde6a -------------------------------------------------------------------------------- /test/git_data/git/objects/b5/c0974dc4d85566d14e1a7f466dc6105958fd22: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/b5/c0974dc4d85566d14e1a7f466dc6105958fd22 -------------------------------------------------------------------------------- /test/git_data/git/objects/b6/1bff3ed1e24f867900820e0410e37f083a39e6: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/b6/1bff3ed1e24f867900820e0410e37f083a39e6 -------------------------------------------------------------------------------- /test/git_data/git/objects/b7/53531ee69abe17d59138fd4d3bf8b8fe0505b7: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/b7/53531ee69abe17d59138fd4d3bf8b8fe0505b7 -------------------------------------------------------------------------------- /test/git_data/git/objects/b7/6e25b553a4c435ad3275f6fb52c4a0dce57a5a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/b7/6e25b553a4c435ad3275f6fb52c4a0dce57a5a -------------------------------------------------------------------------------- /test/git_data/git/objects/b7/78c916f8b8103533902b1bd2b3dbcb941385de: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/b7/78c916f8b8103533902b1bd2b3dbcb941385de -------------------------------------------------------------------------------- /test/git_data/git/objects/b7/bf960cfda2c64dc506f3dbee06cd568b8de9b3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/b7/bf960cfda2c64dc506f3dbee06cd568b8de9b3 -------------------------------------------------------------------------------- /test/git_data/git/objects/b7/ce7f2d7a491ada70895cf75cd343bb7f377ca1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/b7/ce7f2d7a491ada70895cf75cd343bb7f377ca1 -------------------------------------------------------------------------------- /test/git_data/git/objects/b9/542794d676fe39bf8c731c6f6cfd84df37f09d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/b9/542794d676fe39bf8c731c6f6cfd84df37f09d -------------------------------------------------------------------------------- /test/git_data/git/objects/bb/884446bc4f3fecc342e33c858a2fe540c63c98: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/bb/884446bc4f3fecc342e33c858a2fe540c63c98 -------------------------------------------------------------------------------- /test/git_data/git/objects/bc/3f705a94ca4fad91e15ec46d7f9525066f5c64: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/bc/3f705a94ca4fad91e15ec46d7f9525066f5c64 -------------------------------------------------------------------------------- /test/git_data/git/objects/c1/dda01238d3e4287d0c17941e535cf61b5c150c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/c1/dda01238d3e4287d0c17941e535cf61b5c150c -------------------------------------------------------------------------------- /test/git_data/git/objects/c2/579c0b1060e81b6bde446e9dbb492e9789c105: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/c2/579c0b1060e81b6bde446e9dbb492e9789c105 -------------------------------------------------------------------------------- /test/git_data/git/objects/c4/902f7b43b94e96d0c0eae48f951b20af854f1b: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/c4/902f7b43b94e96d0c0eae48f951b20af854f1b -------------------------------------------------------------------------------- /test/git_data/git/objects/c4/ac95b6bbf90b41ec0b78c653583f7adaaef75d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/c4/ac95b6bbf90b41ec0b78c653583f7adaaef75d -------------------------------------------------------------------------------- /test/git_data/git/objects/c4/d8ee26ac9152c168b2149a6cbaca77e9ba80e1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/c4/d8ee26ac9152c168b2149a6cbaca77e9ba80e1 -------------------------------------------------------------------------------- /test/git_data/git/objects/c4/d94cd8b67a56c8cb1da229b085ef3a8257da55: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/c4/d94cd8b67a56c8cb1da229b085ef3a8257da55 -------------------------------------------------------------------------------- /test/git_data/git/objects/c8/66bc050ab520a1f61a160a604c2a5087040fab: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/c8/66bc050ab520a1f61a160a604c2a5087040fab -------------------------------------------------------------------------------- /test/git_data/git/objects/c8/e0ac5a9f88985a6de2d54fe38917289a5f8831: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/c8/e0ac5a9f88985a6de2d54fe38917289a5f8831 -------------------------------------------------------------------------------- /test/git_data/git/objects/c9/6380c2227f3390a08f40e73829010af6faddf6: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/c9/6380c2227f3390a08f40e73829010af6faddf6 -------------------------------------------------------------------------------- /test/git_data/git/objects/cd/4d03e3b4b94d421c4beebe67d23a503b5217bd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/cd/4d03e3b4b94d421c4beebe67d23a503b5217bd -------------------------------------------------------------------------------- /test/git_data/git/objects/cd/668bb538b609d10463efaa0fe470979f8dbef2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/cd/668bb538b609d10463efaa0fe470979f8dbef2 -------------------------------------------------------------------------------- /test/git_data/git/objects/cd/c72e94059a6381c40c6f9651d0fbebcae56d8c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/cd/c72e94059a6381c40c6f9651d0fbebcae56d8c -------------------------------------------------------------------------------- /test/git_data/git/objects/ce/b9b17ff1400cda3e40561d91ff781822ec93b5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/ce/b9b17ff1400cda3e40561d91ff781822ec93b5 -------------------------------------------------------------------------------- /test/git_data/git/objects/ce/c54fe276f26c876cc23b9943a2c94e76c4ff9a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/ce/c54fe276f26c876cc23b9943a2c94e76c4ff9a -------------------------------------------------------------------------------- /test/git_data/git/objects/ce/c9d5a8bd1032322111aeddf8b1069900ca7233: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/ce/c9d5a8bd1032322111aeddf8b1069900ca7233 -------------------------------------------------------------------------------- /test/git_data/git/objects/d0/42bc068e72409e970b05806dcda5e4ea40aaf5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/d0/42bc068e72409e970b05806dcda5e4ea40aaf5 -------------------------------------------------------------------------------- /test/git_data/git/objects/d2/bfacc640b33500c0cd4563294ed9c576b88b87: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/d2/bfacc640b33500c0cd4563294ed9c576b88b87 -------------------------------------------------------------------------------- /test/git_data/git/objects/d4/7350a61d7b4efa839752b2c4866a8b72e5d828: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/d4/7350a61d7b4efa839752b2c4866a8b72e5d828 -------------------------------------------------------------------------------- /test/git_data/git/objects/d4/dfdc5471bd5d9c9a0bff9e4050b2b3462d0658: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/d4/dfdc5471bd5d9c9a0bff9e4050b2b3462d0658 -------------------------------------------------------------------------------- /test/git_data/git/objects/d5/c155dbfd0e0856390106cb0a0407064f8bc4a4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/d5/c155dbfd0e0856390106cb0a0407064f8bc4a4 -------------------------------------------------------------------------------- /test/git_data/git/objects/d5/c48ef3092b5af505145aca620b41e4a10cc609: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/d5/c48ef3092b5af505145aca620b41e4a10cc609 -------------------------------------------------------------------------------- /test/git_data/git/objects/d5/d6f7c87f66fd4bba84abe718f6851c626ee18b: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/d5/d6f7c87f66fd4bba84abe718f6851c626ee18b -------------------------------------------------------------------------------- /test/git_data/git/objects/d6/a1f6f3fb60379905790a10452ac46f357c61ec: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/d6/a1f6f3fb60379905790a10452ac46f357c61ec -------------------------------------------------------------------------------- /test/git_data/git/objects/d7/4408fa37d46d251528e6e16bcf782075116df8: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/d7/4408fa37d46d251528e6e16bcf782075116df8 -------------------------------------------------------------------------------- /test/git_data/git/objects/d7/79609b0c390ce028866584a20daf1ba80c47ba: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/d7/79609b0c390ce028866584a20daf1ba80c47ba -------------------------------------------------------------------------------- /test/git_data/git/objects/d7/c3e1b47bc9b7a703489a668409a98b86805175: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/d7/c3e1b47bc9b7a703489a668409a98b86805175 -------------------------------------------------------------------------------- /test/git_data/git/objects/d8/5dc8db6579a5e4fa2c6477dc2feaf0ac2967dc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/d8/5dc8db6579a5e4fa2c6477dc2feaf0ac2967dc -------------------------------------------------------------------------------- /test/git_data/git/objects/d8/873b440d18bf607b06ad1ae6795ee70678e4ac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/d8/873b440d18bf607b06ad1ae6795ee70678e4ac -------------------------------------------------------------------------------- /test/git_data/git/objects/d8/e02f2170ebe60586f852ce5bf069c8cb62835c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/d8/e02f2170ebe60586f852ce5bf069c8cb62835c -------------------------------------------------------------------------------- /test/git_data/git/objects/d9/441b20cf38d68e2147f353925f84042c5c7879: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/d9/441b20cf38d68e2147f353925f84042c5c7879 -------------------------------------------------------------------------------- /test/git_data/git/objects/d9/e5c364a1caa0ebf1afba04b9f8f7f11acb86bb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/d9/e5c364a1caa0ebf1afba04b9f8f7f11acb86bb -------------------------------------------------------------------------------- /test/git_data/git/objects/d9/f3d016c1425403ce9e7bf6bf3a8c8dafc69421: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/d9/f3d016c1425403ce9e7bf6bf3a8c8dafc69421 -------------------------------------------------------------------------------- /test/git_data/git/objects/da/6fd93a756292495f5b74429fc381611cf0cc68: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/da/6fd93a756292495f5b74429fc381611cf0cc68 -------------------------------------------------------------------------------- /test/git_data/git/objects/db/1d9b90ad28f35d89a0571c9a84ae5735aced47: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/db/1d9b90ad28f35d89a0571c9a84ae5735aced47 -------------------------------------------------------------------------------- /test/git_data/git/objects/db/a0fe21372b7d844ebe37bf7bd5d77e37432679: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/db/a0fe21372b7d844ebe37bf7bd5d77e37432679 -------------------------------------------------------------------------------- /test/git_data/git/objects/dc/68c4328a0dfdb43a8aa41c7e2a7adb78e8aeaf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/dc/68c4328a0dfdb43a8aa41c7e2a7adb78e8aeaf -------------------------------------------------------------------------------- /test/git_data/git/objects/dd/5bdca2b6d6686be888acb1e258b1324e36c136: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/dd/5bdca2b6d6686be888acb1e258b1324e36c136 -------------------------------------------------------------------------------- /test/git_data/git/objects/dd/bdbac7a7b38a69290ca35300887fd77580dc80: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/dd/bdbac7a7b38a69290ca35300887fd77580dc80 -------------------------------------------------------------------------------- /test/git_data/git/objects/df/1adcd7caa3b439038b8e19b7fb7b57f06a4ca0: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/df/1adcd7caa3b439038b8e19b7fb7b57f06a4ca0 -------------------------------------------------------------------------------- /test/git_data/git/objects/df/29d60ad46af8a5e45313635299d4f0174752cc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/df/29d60ad46af8a5e45313635299d4f0174752cc -------------------------------------------------------------------------------- /test/git_data/git/objects/df/6c8582e9245a2ec7724949c3abf1b94d31eb70: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/df/6c8582e9245a2ec7724949c3abf1b94d31eb70 -------------------------------------------------------------------------------- /test/git_data/git/objects/df/b98ffa295c7b7bc1e447ebca81f0be73f2ce1f: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/df/b98ffa295c7b7bc1e447ebca81f0be73f2ce1f -------------------------------------------------------------------------------- /test/git_data/git/objects/e3/1e203b879f573d08a374dea42821c6a36bd6e6: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/e3/1e203b879f573d08a374dea42821c6a36bd6e6 -------------------------------------------------------------------------------- /test/git_data/git/objects/e3/ab77e5c6b709a1e6f0842ad234d62cd434f638: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/e3/ab77e5c6b709a1e6f0842ad234d62cd434f638 -------------------------------------------------------------------------------- /test/git_data/git/objects/e4/ca955c80e3ab41d03543dfb545be1c5ccd5f71: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/e4/ca955c80e3ab41d03543dfb545be1c5ccd5f71 -------------------------------------------------------------------------------- /test/git_data/git/objects/e5/01da8d646270c847690f3d9eb947f5b98c0e32: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/e5/01da8d646270c847690f3d9eb947f5b98c0e32 -------------------------------------------------------------------------------- /test/git_data/git/objects/e5/4368ee844c790c77a04ed10ed68337e64a56d4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/e5/4368ee844c790c77a04ed10ed68337e64a56d4 -------------------------------------------------------------------------------- /test/git_data/git/objects/e6/9dcf238caecae4d510a0aa6d349fe7856dd997: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/e6/9dcf238caecae4d510a0aa6d349fe7856dd997 -------------------------------------------------------------------------------- /test/git_data/git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 -------------------------------------------------------------------------------- /test/git_data/git/objects/e7/f43657f4f2825e4c6a8973808b7467496ccce4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/e7/f43657f4f2825e4c6a8973808b7467496ccce4 -------------------------------------------------------------------------------- /test/git_data/git/objects/ea/f8c3c6bf2bfdf10ca793a9b0aca67adc99bc70: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/ea/f8c3c6bf2bfdf10ca793a9b0aca67adc99bc70 -------------------------------------------------------------------------------- /test/git_data/git/objects/ec/d8907c9d159c0f5d8a62e2956e39e28241758b: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/ec/d8907c9d159c0f5d8a62e2956e39e28241758b -------------------------------------------------------------------------------- /test/git_data/git/objects/ed/7c59544705d2a2f31dd16074fbb8de6b6afc42: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/ed/7c59544705d2a2f31dd16074fbb8de6b6afc42 -------------------------------------------------------------------------------- /test/git_data/git/objects/ed/dd89ed34118757560c727d9984d9234b2788ec: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/ed/dd89ed34118757560c727d9984d9234b2788ec -------------------------------------------------------------------------------- /test/git_data/git/objects/ef/26499df24bb719849bc8da67a83821e47a193e: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/ef/26499df24bb719849bc8da67a83821e47a193e -------------------------------------------------------------------------------- /test/git_data/git/objects/f0/15e01fab7930e10847990d3a6410e6daab5079: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/f0/15e01fab7930e10847990d3a6410e6daab5079 -------------------------------------------------------------------------------- /test/git_data/git/objects/f3/23eb61d41618daac3de9584275782505ef7762: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/f3/23eb61d41618daac3de9584275782505ef7762 -------------------------------------------------------------------------------- /test/git_data/git/objects/f3/bccf1160e67bf2ac2f47e0a7083d983f8951a2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/f3/bccf1160e67bf2ac2f47e0a7083d983f8951a2 -------------------------------------------------------------------------------- /test/git_data/git/objects/f4/acc3ec0539c924f78dd0a748fd6591734703dc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/f4/acc3ec0539c924f78dd0a748fd6591734703dc -------------------------------------------------------------------------------- /test/git_data/git/objects/f5/3fa782d10e4575a4f2ffd91f8780698637c232: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/f5/3fa782d10e4575a4f2ffd91f8780698637c232 -------------------------------------------------------------------------------- /test/git_data/git/objects/f6/94c944764829eb49435a566039d4500c534cf4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/f6/94c944764829eb49435a566039d4500c534cf4 -------------------------------------------------------------------------------- /test/git_data/git/objects/f7/09202d1dff6607ec4ee70f39865bf0707b214d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/f7/09202d1dff6607ec4ee70f39865bf0707b214d -------------------------------------------------------------------------------- /test/git_data/git/objects/f8/c09d882f53ad89ec5163239c61ec12e335e03a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/f8/c09d882f53ad89ec5163239c61ec12e335e03a -------------------------------------------------------------------------------- /test/git_data/git/objects/fb/19cc652ed40a7028cf754412bffc8ad57e5900: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/fb/19cc652ed40a7028cf754412bffc8ad57e5900 -------------------------------------------------------------------------------- /test/git_data/git/objects/fb/5488fa253baed0dffe8bc051fa3181c805c7d5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/fb/5488fa253baed0dffe8bc051fa3181c805c7d5 -------------------------------------------------------------------------------- /test/git_data/git/objects/fb/6b9c8d7bc4263d075d0ae703d59ba3c3b5be12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/fb/6b9c8d7bc4263d075d0ae703d59ba3c3b5be12 -------------------------------------------------------------------------------- /test/git_data/git/objects/fd/f5f054aef45a86e05dfa1355fe3f56e2198b50: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/fd/f5f054aef45a86e05dfa1355fe3f56e2198b50 -------------------------------------------------------------------------------- /test/git_data/git/objects/ff/1c5d356a4df7723a64d11040de4eaebe35bc7f: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/ff/1c5d356a4df7723a64d11040de4eaebe35bc7f -------------------------------------------------------------------------------- /test/git_data/git/objects/ff/38a4736b3b1d8b6b4a302431be205c23ebb464: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/ff/38a4736b3b1d8b6b4a302431be205c23ebb464 -------------------------------------------------------------------------------- /test/git_data/git/objects/ff/4fa14e6e19739edc6c12fc3d1328e95b5cf3e6: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/git_data/git/objects/ff/4fa14e6e19739edc6c12fc3d1328e95b5cf3e6 -------------------------------------------------------------------------------- /test/git_data/git/refs/heads/master: -------------------------------------------------------------------------------- 1 | 763d6b338b9b3557177ca7803e9adc89ca7670b9 2 | -------------------------------------------------------------------------------- /test/mbox_data/mail_1.mbox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/mbox_data/mail_1.mbox -------------------------------------------------------------------------------- /test/mbox_data/mail_2.mbox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/mbox_data/mail_2.mbox -------------------------------------------------------------------------------- /test/mbox_data/mail_3.mbox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/mbox_data/mail_3.mbox -------------------------------------------------------------------------------- /test/mbox_data/mail_4.mbox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UWNETLAB/tidyextractors/132ee88e79cdd10102ded86136e9bc978829fd4a/test/mbox_data/mail_4.mbox -------------------------------------------------------------------------------- /test/test_base.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************************************* 2 | # Copyright (C) 2017 Joel Becker, Jillian Anderson, Steve McColl and Dr. John McLevey 3 | # 4 | # This file is part of the tidyextractors package developed for Dr John McLevey's Networks Lab 5 | # at the University of Waterloo. For more information, see 6 | # http://tidyextractors.readthedocs.io/en/latest/ 7 | # 8 | # tidyextractors is free software: you can redistribute it and/or modify it under the terms of 9 | # the GNU General Public License as published by the Free Software Foundation, either version 3 10 | # of the License, or (at your option) any later version. 11 | # 12 | # tidyextractors is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 13 | # without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 14 | # See the GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License along with tidyextractors. 17 | # If not, see . 18 | # ********************************************************************************************* 19 | 20 | import unittest 21 | import pandas as pd 22 | import tidyextractors as tx 23 | 24 | 25 | class TestBaseExtractor(unittest.TestCase): 26 | 27 | def setUp(self): 28 | self.basex = tx.BaseExtractor('') 29 | 30 | def test_construction(self): 31 | self.assertEqual(isinstance(self.basex, tx.BaseExtractor), True) 32 | 33 | def test_raw(self): 34 | self.assertEqual(isinstance(self.basex.raw(), pd.DataFrame), True) 35 | 36 | 37 | if __name__ == '__main__': 38 | unittest.main() -------------------------------------------------------------------------------- /test/test_git.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************************************* 2 | # Copyright (C) 2017 Joel Becker, Jillian Anderson, Steve McColl and Dr. John McLevey 3 | # 4 | # This file is part of the tidyextractors package developed for Dr John McLevey's Networks Lab 5 | # at the University of Waterloo. For more information, see 6 | # http://tidyextractors.readthedocs.io/en/latest/ 7 | # 8 | # tidyextractors is free software: you can redistribute it and/or modify it under the terms of 9 | # the GNU General Public License as published by the Free Software Foundation, either version 3 10 | # of the License, or (at your option) any later version. 11 | # 12 | # tidyextractors is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 13 | # without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 14 | # See the GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License along with tidyextractors. 17 | # If not, see . 18 | # ********************************************************************************************* 19 | 20 | import os 21 | import unittest 22 | import subprocess as sub 23 | import pandas as pd 24 | import tidyextractors as tx 25 | import tidyextractors.tidygit as tg 26 | 27 | 28 | class TestGitExtractor(unittest.TestCase): 29 | def setUp(self): 30 | os.rename(os.path.join('.', 'git_data', 'git/'), os.path.join('.', 'git_data', '.git/')) 31 | try: 32 | self.gx = tg.GitExtractor(os.path.join('.', 'git_data')) 33 | self.changes_df = pd.read_csv(os.path.join('.', 'git_data', 'git_changes_test.csv')) 34 | self.commits_df = pd.read_csv(os.path.join('.', 'git_data', 'git_commits_test.csv')) 35 | self.raw_df = pd.read_csv(os.path.join('.', 'git_data', 'git_raw_test.csv')) 36 | os.rename(os.path.join('.', 'git_data', '.git/'), os.path.join('.', 'git_data', 'git/')) 37 | except: 38 | os.rename(os.path.join('.', 'git_data', '.git/'), os.path.join('.', 'git_data', 'git/')) 39 | raise 40 | 41 | def test_construction(self): 42 | self.assertEqual(isinstance(self.gx, tx.BaseExtractor), True) 43 | self.assertEqual(isinstance(self.gx, tg.GitExtractor), True) 44 | 45 | def test_raw(self): 46 | check_df = self.gx.raw(drop_collections=False) 47 | expect_df = self.raw_df 48 | self.assertEqual(set(check_df.columns), set(expect_df.columns)) 49 | self.assertEqual(set(check_df['hexsha']), set(expect_df['hexsha'])) 50 | 51 | def test_commits(self): 52 | check_df = self.gx.commits(drop_collections=False) 53 | expect_df = self.commits_df 54 | self.assertEqual(set(check_df.columns), set(expect_df.columns)) 55 | self.assertEqual(set(check_df['hexsha']), set(expect_df['hexsha'])) 56 | 57 | def test_changes(self): 58 | check_df = self.gx.changes() 59 | expect_df = self.changes_df 60 | self.assertEqual(set(check_df.columns), set(expect_df.columns)) 61 | self.assertEqual(set(check_df['hexsha']), set(expect_df['hexsha'])) 62 | 63 | 64 | if __name__ == '__main__': 65 | unittest.main() 66 | -------------------------------------------------------------------------------- /test/test_mbox.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************************************* 2 | # Copyright (C) 2017 Joel Becker, Jillian Anderson, Steve McColl and Dr. John McLevey 3 | # 4 | # This file is part of the tidyextractors package developed for Dr John McLevey's Networks Lab 5 | # at the University of Waterloo. For more information, see 6 | # http://tidyextractors.readthedocs.io/en/latest/ 7 | # 8 | # tidyextractors is free software: you can redistribute it and/or modify it under the terms of 9 | # the GNU General Public License as published by the Free Software Foundation, either version 3 10 | # of the License, or (at your option) any later version. 11 | # 12 | # tidyextractors is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 13 | # without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 14 | # See the GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License along with tidyextractors. 17 | # If not, see . 18 | # ********************************************************************************************* 19 | 20 | import os 21 | import unittest 22 | import pandas as pd 23 | import tidyextractors as tx 24 | import tidyextractors.tidymbox as tm 25 | 26 | 27 | class TestMboxExtractor(unittest.TestCase): 28 | 29 | def setUp(self): 30 | self.gx = tm.MboxExtractor(os.path.join('.', 'mbox_data')) 31 | self.sends_df = pd.read_csv(os.path.join('.', 'mbox_data', 'mbox_sends_test.csv')) 32 | self.emails_df = pd.read_csv(os.path.join('.', 'mbox_data', 'mbox_emails_test.csv')) 33 | self.raw_df = pd.read_csv(os.path.join('.', 'mbox_data', 'mbox_raw_test.csv')) 34 | 35 | def test_construction(self): 36 | self.assertEqual(isinstance(self.gx, tx.BaseExtractor), True) 37 | self.assertEqual(isinstance(self.gx, tm.MboxExtractor), True) 38 | 39 | def test_raw(self): 40 | check_df = self.gx.raw(drop_collections=False) 41 | expect_df = self.raw_df 42 | self.assertEqual(set(check_df.columns),set(expect_df.columns)) 43 | self.assertEqual(set(check_df['MessageID']),set(expect_df['MessageID'])) 44 | 45 | def test_emails(self): 46 | check_df = self.gx.emails(drop_collections=False) 47 | expect_df = self.emails_df 48 | self.assertEqual(set(check_df.columns),set(expect_df.columns)) 49 | self.assertEqual(set(check_df['MessageID']),set(expect_df['MessageID'])) 50 | 51 | def test_sends(self): 52 | check_df = self.gx.sends() 53 | expect_df = self.sends_df 54 | self.assertEqual(set(check_df.columns),set(expect_df.columns)) 55 | self.assertEqual(set(check_df['MessageID']),set(expect_df['MessageID'])) 56 | 57 | 58 | if __name__ == '__main__': 59 | unittest.main() -------------------------------------------------------------------------------- /test/test_twitter.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************************************* 2 | # Copyright (C) 2017 Joel Becker, Jillian Anderson, Steve McColl and Dr. John McLevey 3 | # 4 | # This file is part of the tidyextractors package developed for Dr John McLevey's Networks Lab 5 | # at the University of Waterloo. For more information, see 6 | # http://tidyextractors.readthedocs.io/en/latest/ 7 | # 8 | # tidyextractors is free software: you can redistribute it and/or modify it under the terms of 9 | # the GNU General Public License as published by the Free Software Foundation, either version 3 10 | # of the License, or (at your option) any later version. 11 | # 12 | # tidyextractors is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 13 | # without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 14 | # See the GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License along with tidyextractors. 17 | # If not, see . 18 | # ********************************************************************************************* 19 | 20 | import os 21 | import json 22 | import unittest 23 | import pandas as pd 24 | import tidyextractors as tx 25 | import tidyextractors.tidytwitter as tm 26 | 27 | 28 | class TestTwitterExtractor(unittest.TestCase): 29 | 30 | def setUp(self): 31 | 32 | # Get credentials 33 | with open(os.path.join('.','twitter_data','txrc')) as txrc: 34 | credentials = json.loads(txrc.read()) 35 | 36 | # Normal setup 37 | self.tx = tm.TwitterExtractor(['whatifnumbers'], **credentials) 38 | self.tweets_df = pd.read_csv(os.path.join('.', 'twitter_data', 'twitter_tweets_test.csv')) 39 | self.users_df = pd.read_csv(os.path.join('.', 'twitter_data', 'twitter_users_test.csv')) 40 | self.raw_df = pd.read_csv(os.path.join('.', 'twitter_data', 'twitter_raw_test.csv')) 41 | 42 | def test_construction(self): 43 | self.assertEqual(isinstance(self.tx, tx.BaseExtractor), True) 44 | self.assertEqual(isinstance(self.tx, tm.TwitterExtractor), True) 45 | 46 | def test_raw(self): 47 | check_df = self.tx.raw(drop_collections=False) 48 | expect_df = self.raw_df 49 | self.assertEqual(set(check_df.columns),set(expect_df.columns)) 50 | self.assertEqual(set(expect_df['id']).issubset(set(check_df['id'])), True) 51 | 52 | def test_users(self): 53 | check_df = self.tx.users(drop_collections=False) 54 | expect_df = self.users_df 55 | self.assertEqual(set(check_df.columns),set(expect_df.columns)) 56 | self.assertEqual(set(expect_df['id']).issubset(set(check_df['id'])), True) 57 | 58 | def test_tweets(self): 59 | check_df = self.tx.tweets() 60 | expect_df = self.tweets_df 61 | self.assertEqual(set(check_df.columns),set(expect_df.columns)) 62 | self.assertEqual(set(expect_df['id']).issubset(set(check_df['id'])), True) 63 | 64 | 65 | if __name__ == '__main__': 66 | unittest.main() -------------------------------------------------------------------------------- /test/twitter_data/placeholder.txt: -------------------------------------------------------------------------------- 1 | Lorum ipsum etc. etc. -------------------------------------------------------------------------------- /test/twitter_data/twitter_raw_test.csv: -------------------------------------------------------------------------------- 1 | contributors_enabled,created_at,default_profile,default_profile_image,description,entities,favourites_count,follow_request_sent,followers_count,following,friends_count,geo_enabled,has_extended_profile,id,id_str,is_translation_enabled,is_translator,lang,listed_count,location,name,notifications,profile_background_color,profile_background_image_url,profile_background_image_url_https,profile_background_tile,profile_image_url,profile_image_url_https,profile_link_color,profile_location,profile_sidebar_border_color,profile_sidebar_fill_color,profile_text_color,profile_use_background_image,protected,screen_name,statuses_count,time_zone,translator_type,tweets,url,utc_offset,verified 2 | False,2013-01-26 00:52:29,True,False,"Numbers I've estimated, calculated, or found while researching questions for my What If blog","{'url': {'urls': [{'url': 'http://t.co/LrnYfNue', 'expanded_url': 'http://what-if.xkcd.com/', 'display_url': 'what-if.xkcd.com', 'indices': [0, 20]}]}, 'description': {'urls': []}}",4,False,58810,True,45,False,False,1120626926,1120626926,False,False,en,824,,What-If Numbers,False,C0DEED,http://abs.twimg.com/images/themes/theme1/bg.png,https://abs.twimg.com/images/themes/theme1/bg.png,False,http://pbs.twimg.com/profile_images/378800000628114455/89bedffcd96cb835f5ba2af584eba8fb_normal.png,https://pbs.twimg.com/profile_images/378800000628114455/89bedffcd96cb835f5ba2af584eba8fb_normal.png,1DA1F2,,C0DEED,DDEEF6,333333,True,False,whatifnumbers,47,Eastern Time (US & Canada),none,"{'844214562924707841': {'created': datetime.datetime(2017, 3, 21, 15, 50, 11), 'text': '87,500,000,000: Current world population in gallons', 'retweet': False, 'rt_author': ''}, '481766640095600641': {'created': datetime.datetime(2014, 6, 25, 11, 51, 32), 'text': '1,961: Number of non-librarians in the US per librarian', 'retweet': False, 'rt_author': ''}, '469907852812091392': {'created': datetime.datetime(2014, 5, 23, 18, 28, 57), 'text': '950: Approximate total amount of pet snake in the US, in miles', 'retweet': False, 'rt_author': ''}, '443793302450483200': {'created': datetime.datetime(2014, 3, 12, 16, 59, 3), 'text': '2: Minimum diameter, in centimeters, of a rope made of DNA strands that would be strong enough to lift a human', 'retweet': False, 'rt_author': ''}, '443793093599313920': {'created': datetime.datetime(2014, 3, 12, 16, 58, 13), 'text': '22.1: Average weight, in kilograms, of a human leg', 'retweet': False, 'rt_author': ''}, '443793031355826176': {'created': datetime.datetime(2014, 3, 12, 16, 57, 58), 'text': ""1: Number of What If books I'm announcing today http://t.co/ZMW4wLIldd"", 'retweet': False, 'rt_author': ''}, '418047114682200064': {'created': datetime.datetime(2013, 12, 31, 15, 52, 53), 'text': '0.000000000000000056: Growth rate of a baby in units of the speed of light', 'retweet': False, 'rt_author': ''}, '404221580407877634': {'created': datetime.datetime(2013, 11, 23, 12, 15, 9), 'text': '100,000,000,000,000,000,000: Approximate number of transistors in the world', 'retweet': False, 'rt_author': ''}, '404221492637859840': {'created': datetime.datetime(2013, 11, 23, 12, 14, 48), 'text': '10,000,000,000,000,000: Approximate number of ants in the world', 'retweet': False, 'rt_author': ''}, '402517328811679744': {'created': datetime.datetime(2013, 11, 18, 19, 23, 4), 'text': ""20.1: Heat production, in kilowatts, of a nuclear submarine's crew."", 'retweet': False, 'rt_author': ''}, '393128801766342656': {'created': datetime.datetime(2013, 10, 23, 21, 36, 24), 'text': '326: Weight of a Tesla Roadster sports car measured in gallon jugs of water', 'retweet': False, 'rt_author': ''}, '392257300276056065': {'created': datetime.datetime(2013, 10, 21, 11, 53, 22), 'text': '1.85: Height, in meters, of Bill Nye', 'retweet': False, 'rt_author': ''}, '392257234266099712': {'created': datetime.datetime(2013, 10, 21, 11, 53, 7), 'text': '1.85: Average length, in meters, of the human genome', 'retweet': False, 'rt_author': ''}, '377771154930298880': {'created': datetime.datetime(2013, 9, 11, 12, 30, 36), 'text': '101: Global number of civilians per soldier', 'retweet': False, 'rt_author': ''}, '377032830343057409': {'created': datetime.datetime(2013, 9, 9, 11, 36, 46), 'text': ""119: Amount of time, in years, for which the Curiosity rover's generator could power a Nintendo Gamecube and LCD monitor"", 'retweet': False, 'rt_author': ''}, '362590509451067392': {'created': datetime.datetime(2013, 7, 31, 15, 8, 8), 'text': '7,010,000,000: Total number of living human teeth in the US', 'retweet': False, 'rt_author': ''}, '347080913349398530': {'created': datetime.datetime(2013, 6, 18, 19, 58, 32), 'text': '21.4: Total annual rainfall in California, measured in units of the volume of San Francisco Bay', 'retweet': False, 'rt_author': ''}, '345569282773630978': {'created': datetime.datetime(2013, 6, 14, 15, 51, 52), 'text': '4,500: Number of dogs in the United States for every wolf', 'retweet': False, 'rt_author': ''}, '340874841924190208': {'created': datetime.datetime(2013, 6, 1, 16, 57, 50), 'text': '121: Length, in miles, of the Suez Canal', 'retweet': False, 'rt_author': ''}, '340874807480573952': {'created': datetime.datetime(2013, 6, 1, 16, 57, 41), 'text': '120: Combined length, in miles, of all living blue whales', 'retweet': False, 'rt_author': ''}, '340874782075650048': {'created': datetime.datetime(2013, 6, 1, 16, 57, 35), 'text': '4,132: Length, in miles, of the Nile River', 'retweet': False, 'rt_author': ''}, '340874740573036544': {'created': datetime.datetime(2013, 6, 1, 16, 57, 25), 'text': '4,500: Combined length, in miles, of all living sperm whales', 'retweet': False, 'rt_author': ''}, '329733456265371648': {'created': datetime.datetime(2013, 5, 1, 23, 5, 56), 'text': '6.5: Mass, in grams, of a kilometer-long strand of human hair', 'retweet': False, 'rt_author': ''}, '323854084845228033': {'created': datetime.datetime(2013, 4, 15, 17, 43, 25), 'text': '71.169: Northernmost latitude, in degrees, reachable from the tropics by driving on paved roads', 'retweet': False, 'rt_author': ''}, '321061776135450624': {'created': datetime.datetime(2013, 4, 8, 0, 47, 47), 'text': '216: Minimum possible ping time, in milliseconds, to the opposite side of the world via surface fiber-optic cables', 'retweet': False, 'rt_author': ''}, '315057804031442945': {'created': datetime.datetime(2013, 3, 22, 11, 10, 8), 'text': ""2,210: Distance to the Alpha Centauri system, measured in units of Voyager 2's current distance from us"", 'retweet': False, 'rt_author': ''}, '313912147526692865': {'created': datetime.datetime(2013, 3, 19, 7, 17, 42), 'text': '3.5: Internal pressure, in standard Earth atmospheres, at which a human eye will rupture', 'retweet': False, 'rt_author': ''}, '307908868661469184': {'created': datetime.datetime(2013, 3, 2, 17, 42, 49), 'text': '270: Temperature, in degrees Fahrenheit, four miles below Washington, DC.', 'retweet': False, 'rt_author': ''}, '306520604885012481': {'created': datetime.datetime(2013, 2, 26, 21, 46, 21), 'text': '20: Top speed, in miles per hour, of a roadrunner', 'retweet': False, 'rt_author': ''}, '306520580310573057': {'created': datetime.datetime(2013, 2, 26, 21, 46, 15), 'text': '40: Top speed, in miles per hour, of a coyote', 'retweet': False, 'rt_author': ''}, '303862950219894784': {'created': datetime.datetime(2013, 2, 19, 13, 45, 47), 'text': ""0.0362: Usain Bolt's peak Mach number"", 'retweet': False, 'rt_author': ''}, '301688247472508928': {'created': datetime.datetime(2013, 2, 13, 13, 44, 17), 'text': '498: Current R/C glider speed record in miles per hour, set using dynamic soaring (example video of earlier record: http://t.co/2qdKyUrQ )', 'retweet': False, 'rt_author': ''}, '301686924341555201': {'created': datetime.datetime(2013, 2, 13, 13, 39, 2), 'text': '215: Length in kilometers at which a dangling piece of Kevlar cable in uniform Earth surface gravity will break under its own weight', 'retweet': False, 'rt_author': ''}, '298785571508195328': {'created': datetime.datetime(2013, 2, 5, 13, 30, 6), 'text': '2.18: Ounces of gold it would take to buy one ounce of 64GB MicroSD cards', 'retweet': False, 'rt_author': ''}, '298532109646168064': {'created': datetime.datetime(2013, 2, 4, 20, 42, 56), 'text': '1.61: Storage capacity, in petabytes, of a gallon jug of MicroSD cards', 'retweet': False, 'rt_author': ''}, '298075995372662785': {'created': datetime.datetime(2013, 2, 3, 14, 30, 29), 'text': '3.4: Breaking strength, in pounds, of the tape in a standard audio cassette', 'retweet': False, 'rt_author': ''}, '297873745199128577': {'created': datetime.datetime(2013, 2, 3, 1, 6, 49), 'text': '12: US adult cigarette consumption in 1963 in cigarettes per person per day', 'retweet': False, 'rt_author': ''}, '297341476713660417': {'created': datetime.datetime(2013, 2, 1, 13, 51, 47), 'text': '107: Speed record in miles per hour for a bicycle going downhill on a volcano', 'retweet': False, 'rt_author': ''}, '296921437317500929': {'created': datetime.datetime(2013, 1, 31, 10, 2, 41), 'text': '3.14: Circumference-to-diameter ratio of a circle, rooms-to-presidents ratio of the White House', 'retweet': False, 'rt_author': ''}, '296908796045979648': {'created': datetime.datetime(2013, 1, 31, 9, 12, 27), 'text': ""24.3: Area in square meters of a Cessna 172 Skyhawk's shadow when parked on a runway with the sun directly overhead"", 'retweet': False, 'rt_author': ''}, '295935545245327360': {'created': datetime.datetime(2013, 1, 28, 16, 45, 6), 'text': '460,000: EPA statistical value of a human life measured in Bitcoins', 'retweet': False, 'rt_author': ''}, '295885348553232385': {'created': datetime.datetime(2013, 1, 28, 13, 25, 39), 'text': '2.3: Approximate volume of a Roomba in gallons', 'retweet': False, 'rt_author': ''}, '295876347442626560': {'created': datetime.datetime(2013, 1, 28, 12, 49, 53), 'text': '14.2: Turkey consumption rate of the average American in milligrams per minute', 'retweet': False, 'rt_author': ''}, '295060639796322304': {'created': datetime.datetime(2013, 1, 26, 6, 48, 33), 'text': '17,450: Highest ground speed, in miles per hour, at which a human has died (crew of Soyuz 11)', 'retweet': False, 'rt_author': ''}, '295054897332768770': {'created': datetime.datetime(2013, 1, 26, 6, 25, 44), 'text': '1.98: Glide ratio of a northern flying squirrel', 'retweet': False, 'rt_author': ''}, '295054725001379840': {'created': datetime.datetime(2013, 1, 26, 6, 25, 2), 'text': '6.1: Average US adult alcohol consumption in the year 1825 in shots of 80-proof liquor per person per day', 'retweet': False, 'rt_author': ''}, '295054577177329665': {'created': datetime.datetime(2013, 1, 26, 6, 24, 27), 'text': '3.27: Number of years it would take the Amazon to fill the Great Lakes', 'retweet': False, 'rt_author': ''}}",http://t.co/LrnYfNue,-14400,False 3 | -------------------------------------------------------------------------------- /test/twitter_data/twitter_tweets_test.csv: -------------------------------------------------------------------------------- 1 | id,id_str,lang,location,name,protected,screen_name,time_zone,tweet_id,utc_offset,tweets/created,tweets/retweet,tweets/rt_author,tweets/text 2 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),844214562924707841,-14400,2017-03-21 15:50:11,False,,"87,500,000,000: Current world population in gallons" 3 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),481766640095600641,-14400,2014-06-25 11:51:32,False,,"1,961: Number of non-librarians in the US per librarian" 4 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),469907852812091392,-14400,2014-05-23 18:28:57,False,,"950: Approximate total amount of pet snake in the US, in miles" 5 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),443793302450483200,-14400,2014-03-12 16:59:03,False,,"2: Minimum diameter, in centimeters, of a rope made of DNA strands that would be strong enough to lift a human" 6 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),443793093599313920,-14400,2014-03-12 16:58:13,False,,"22.1: Average weight, in kilograms, of a human leg" 7 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),443793031355826176,-14400,2014-03-12 16:57:58,False,,1: Number of What If books I'm announcing today http://t.co/ZMW4wLIldd 8 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),418047114682200064,-14400,2013-12-31 15:52:53,False,,0.000000000000000056: Growth rate of a baby in units of the speed of light 9 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),404221580407877634,-14400,2013-11-23 12:15:09,False,,"100,000,000,000,000,000,000: Approximate number of transistors in the world" 10 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),404221492637859840,-14400,2013-11-23 12:14:48,False,,"10,000,000,000,000,000: Approximate number of ants in the world" 11 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),402517328811679744,-14400,2013-11-18 19:23:04,False,,"20.1: Heat production, in kilowatts, of a nuclear submarine's crew." 12 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),393128801766342656,-14400,2013-10-23 21:36:24,False,,326: Weight of a Tesla Roadster sports car measured in gallon jugs of water 13 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),392257300276056065,-14400,2013-10-21 11:53:22,False,,"1.85: Height, in meters, of Bill Nye" 14 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),392257234266099712,-14400,2013-10-21 11:53:07,False,,"1.85: Average length, in meters, of the human genome" 15 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),377771154930298880,-14400,2013-09-11 12:30:36,False,,101: Global number of civilians per soldier 16 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),377032830343057409,-14400,2013-09-09 11:36:46,False,,"119: Amount of time, in years, for which the Curiosity rover's generator could power a Nintendo Gamecube and LCD monitor" 17 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),362590509451067392,-14400,2013-07-31 15:08:08,False,,"7,010,000,000: Total number of living human teeth in the US" 18 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),347080913349398530,-14400,2013-06-18 19:58:32,False,,"21.4: Total annual rainfall in California, measured in units of the volume of San Francisco Bay" 19 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),345569282773630978,-14400,2013-06-14 15:51:52,False,,"4,500: Number of dogs in the United States for every wolf" 20 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),340874841924190208,-14400,2013-06-01 16:57:50,False,,"121: Length, in miles, of the Suez Canal" 21 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),340874807480573952,-14400,2013-06-01 16:57:41,False,,"120: Combined length, in miles, of all living blue whales" 22 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),340874782075650048,-14400,2013-06-01 16:57:35,False,,"4,132: Length, in miles, of the Nile River" 23 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),340874740573036544,-14400,2013-06-01 16:57:25,False,,"4,500: Combined length, in miles, of all living sperm whales" 24 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),329733456265371648,-14400,2013-05-01 23:05:56,False,,"6.5: Mass, in grams, of a kilometer-long strand of human hair" 25 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),323854084845228033,-14400,2013-04-15 17:43:25,False,,"71.169: Northernmost latitude, in degrees, reachable from the tropics by driving on paved roads" 26 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),321061776135450624,-14400,2013-04-08 00:47:47,False,,"216: Minimum possible ping time, in milliseconds, to the opposite side of the world via surface fiber-optic cables" 27 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),315057804031442945,-14400,2013-03-22 11:10:08,False,,"2,210: Distance to the Alpha Centauri system, measured in units of Voyager 2's current distance from us" 28 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),313912147526692865,-14400,2013-03-19 07:17:42,False,,"3.5: Internal pressure, in standard Earth atmospheres, at which a human eye will rupture" 29 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),307908868661469184,-14400,2013-03-02 17:42:49,False,,"270: Temperature, in degrees Fahrenheit, four miles below Washington, DC." 30 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),306520604885012481,-14400,2013-02-26 21:46:21,False,,"20: Top speed, in miles per hour, of a roadrunner" 31 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),306520580310573057,-14400,2013-02-26 21:46:15,False,,"40: Top speed, in miles per hour, of a coyote" 32 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),303862950219894784,-14400,2013-02-19 13:45:47,False,,0.0362: Usain Bolt's peak Mach number 33 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),301688247472508928,-14400,2013-02-13 13:44:17,False,,"498: Current R/C glider speed record in miles per hour, set using dynamic soaring (example video of earlier record: http://t.co/2qdKyUrQ )" 34 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),301686924341555201,-14400,2013-02-13 13:39:02,False,,215: Length in kilometers at which a dangling piece of Kevlar cable in uniform Earth surface gravity will break under its own weight 35 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),298785571508195328,-14400,2013-02-05 13:30:06,False,,2.18: Ounces of gold it would take to buy one ounce of 64GB MicroSD cards 36 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),298532109646168064,-14400,2013-02-04 20:42:56,False,,"1.61: Storage capacity, in petabytes, of a gallon jug of MicroSD cards" 37 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),298075995372662785,-14400,2013-02-03 14:30:29,False,,"3.4: Breaking strength, in pounds, of the tape in a standard audio cassette" 38 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),297873745199128577,-14400,2013-02-03 01:06:49,False,,12: US adult cigarette consumption in 1963 in cigarettes per person per day 39 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),297341476713660417,-14400,2013-02-01 13:51:47,False,,107: Speed record in miles per hour for a bicycle going downhill on a volcano 40 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),296921437317500929,-14400,2013-01-31 10:02:41,False,,"3.14: Circumference-to-diameter ratio of a circle, rooms-to-presidents ratio of the White House" 41 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),296908796045979648,-14400,2013-01-31 09:12:27,False,,24.3: Area in square meters of a Cessna 172 Skyhawk's shadow when parked on a runway with the sun directly overhead 42 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),295935545245327360,-14400,2013-01-28 16:45:06,False,,"460,000: EPA statistical value of a human life measured in Bitcoins" 43 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),295885348553232385,-14400,2013-01-28 13:25:39,False,,2.3: Approximate volume of a Roomba in gallons 44 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),295876347442626560,-14400,2013-01-28 12:49:53,False,,14.2: Turkey consumption rate of the average American in milligrams per minute 45 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),295060639796322304,-14400,2013-01-26 06:48:33,False,,"17,450: Highest ground speed, in miles per hour, at which a human has died (crew of Soyuz 11)" 46 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),295054897332768770,-14400,2013-01-26 06:25:44,False,,1.98: Glide ratio of a northern flying squirrel 47 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),295054725001379840,-14400,2013-01-26 06:25:02,False,,6.1: Average US adult alcohol consumption in the year 1825 in shots of 80-proof liquor per person per day 48 | 1120626926,1120626926,en,,What-If Numbers,False,whatifnumbers,Eastern Time (US & Canada),295054577177329665,-14400,2013-01-26 06:24:27,False,,3.27: Number of years it would take the Amazon to fill the Great Lakes 49 | -------------------------------------------------------------------------------- /tidyextractors/__init__.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************************************* 2 | # Copyright (C) 2017 Joel Becker, Jillian Anderson, Steve McColl and Dr. John McLevey 3 | # 4 | # This file is part of the tidyextractors package developed for Dr John McLevey's Networks Lab 5 | # at the University of Waterloo. For more information, see 6 | # http://tidyextractors.readthedocs.io/en/latest/ 7 | # 8 | # tidyextractors is free software: you can redistribute it and/or modify it under the terms of 9 | # the GNU General Public License as published by the Free Software Foundation, either version 3 10 | # of the License, or (at your option) any later version. 11 | # 12 | # tidyextractors is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 13 | # without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 14 | # See the GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License along with tidyextractors. 17 | # If not, see . 18 | # ********************************************************************************************* 19 | 20 | from tidyextractors.base_extractor import BaseExtractor 21 | import tidyextractors.tidygit as tidygit 22 | import tidyextractors.tidymbox as tidymbox 23 | import tidyextractors.tidytwitter as tidytwitter 24 | -------------------------------------------------------------------------------- /tidyextractors/tidygit/__init__.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************************************* 2 | # Copyright (C) 2017 Joel Becker, Jillian Anderson, Steve McColl and Dr. John McLevey 3 | # 4 | # This file is part of the tidyextractors package developed for Dr John McLevey's Networks Lab 5 | # at the University of Waterloo. For more information, see 6 | # http://tidyextractors.readthedocs.io/en/latest/ 7 | # 8 | # tidyextractors is free software: you can redistribute it and/or modify it under the terms of 9 | # the GNU General Public License as published by the Free Software Foundation, either version 3 10 | # of the License, or (at your option) any later version. 11 | # 12 | # tidyextractors is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 13 | # without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 14 | # See the GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License along with tidyextractors. 17 | # If not, see . 18 | # ********************************************************************************************* 19 | 20 | from tidyextractors.tidygit.git_extractor import GitExtractor -------------------------------------------------------------------------------- /tidyextractors/tidygit/get_log.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************************************* 2 | # Copyright (C) 2017 Joel Becker, Jillian Anderson, Steve McColl and Dr. John McLevey 3 | # 4 | # This file is part of the tidyextractors package developed for Dr John McLevey's Networks Lab 5 | # at the University of Waterloo. For more information, see 6 | # http://tidyextractors.readthedocs.io/en/latest/ 7 | # 8 | # tidyextractors is free software: you can redistribute it and/or modify it under the terms of 9 | # the GNU General Public License as published by the Free Software Foundation, either version 3 10 | # of the License, or (at your option) any later version. 11 | # 12 | # tidyextractors is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 13 | # without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 14 | # See the GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License along with tidyextractors. 17 | # If not, see . 18 | # ********************************************************************************************* 19 | 20 | import git 21 | import tqdm 22 | import pandas as pd 23 | from tidyextractors.tidygit.git_object_handlers import git_object_handlers_lookup 24 | 25 | # TODO: Increase get_log efficiency i.e. using gitnet implementation 26 | 27 | # A default list of attributes to be extracted. 28 | simple_attributes = ['author', 29 | 'author_tz_offset', 30 | 'authored_date', 31 | 'authored_datetime', 32 | 'encoding', 33 | 'hexsha', 34 | 'stats', 35 | 'summary', 36 | 'type' 37 | ] 38 | 39 | def handle_object(name, obj): 40 | """ 41 | This helper function handles incoming test_data for make_object_dict. 42 | If thereis a special handler in git_object_handlers_lookup, this 43 | is used. Otherwise, the given name:obj pair is returned 44 | as-is. 45 | :param name: String 46 | :param obj: The object to be processed. 47 | :return: A dictionary of attributes. 48 | """ 49 | if type(obj) in git_object_handlers_lookup: 50 | return git_object_handlers_lookup[type(obj)](name, obj) 51 | else: 52 | return {name:obj} 53 | 54 | 55 | def make_object_dict(obj, keep=[]): 56 | """ 57 | Processes an object, exporting its data as a nested dictionary. 58 | Individual objects are handled using handle_object. 59 | :param obj: The object to be processed. 60 | :param keep: Object attributes to be kept. Defaults to all attributes. 61 | :return: A dictionary of attributes. 62 | """ 63 | data = {} 64 | if keep == []: 65 | get_attrs = dir(obj) 66 | else: 67 | get_attrs = keep 68 | 69 | for attr in get_attrs: 70 | datum = getattr(obj,attr) 71 | data.update(handle_object(attr,datum)) 72 | return data 73 | 74 | 75 | def extract_log(rpath,extract=simple_attributes): 76 | """ 77 | Extracts Git commit test_data from a local repository. 78 | :param rpath: The path to a local Git repo. 79 | :param extract: A list of attribute name strings. 80 | :return: A Pandas dataframe containing Git commit test_data. 81 | """ 82 | # Get repo 83 | m_repo = git.Repo(rpath) 84 | 85 | # Count commits 86 | count = 0 87 | m_commits = m_repo.iter_commits() 88 | for commit in m_commits: 89 | count += 1 90 | 91 | # Initialize progress bar and index 92 | 93 | with tqdm.tqdm(total=count) as pbar: 94 | 95 | # Get commits again 96 | m_commits = m_repo.iter_commits() 97 | 98 | # Setup test_data extraction 99 | update_interval = max(min(count//100,100),5) 100 | index = 0 101 | buffer = [] 102 | 103 | # Extract commit test_data 104 | while True: 105 | 106 | # Add the next commit to the buffer 107 | try: 108 | next_commit = next(m_commits) 109 | buffer.append(make_object_dict(next_commit,extract)) 110 | index += 1 111 | if index%update_interval == 0: 112 | pbar.update(update_interval) 113 | 114 | # If no more commits, clear the buffer 115 | except StopIteration: 116 | break 117 | 118 | # final_df = pd.concat(sub_df_list) 119 | return pd.DataFrame(buffer) 120 | 121 | -------------------------------------------------------------------------------- /tidyextractors/tidygit/git_extractor.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************************************* 2 | # Copyright (C) 2017 Joel Becker, Jillian Anderson, Steve McColl and Dr. John McLevey 3 | # 4 | # This file is part of the tidyextractors package developed for Dr John McLevey's Networks Lab 5 | # at the University of Waterloo. For more information, see 6 | # http://tidyextractors.readthedocs.io/en/latest/ 7 | # 8 | # tidyextractors is free software: you can redistribute it and/or modify it under the terms of 9 | # the GNU General Public License as published by the Free Software Foundation, either version 3 10 | # of the License, or (at your option) any later version. 11 | # 12 | # tidyextractors is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 13 | # without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 14 | # See the GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License along with tidyextractors. 17 | # If not, see . 18 | # ********************************************************************************************* 19 | 20 | from tidyextractors import BaseExtractor 21 | from tidyextractors.tidygit.get_log import extract_log 22 | 23 | 24 | class GitExtractor(BaseExtractor): 25 | """ 26 | The ``GitExtractor`` class is for extracting data from local git repositories. This class 27 | has methods for outputting data into the ``changes`` and ``commits`` tidy formats, and a 28 | raw untidy format. 29 | 30 | :param str source: The path to a local git repository 31 | :param bool auto_extract: Defaults to True. If True, data is extracted automatically. 32 | Otherwise, extraction must be initiated through the internal interface. 33 | """ 34 | def _extract(self, source, *args, **kwargs): 35 | """ 36 | Extracts data from a local git repository. Mutates _data. 37 | :param str source: The path to a local git repository. 38 | :param args: Arbitrary arguments for extensibility. 39 | :param kwargs: Arbitrary keyword arguments for extensibility. 40 | 41 | :return: None 42 | """ 43 | # Extract git test_data 44 | self._data = extract_log(source) 45 | 46 | # Shorten hashes 47 | self._data['hexsha'] = self._data['hexsha'].apply(lambda s: s[:7]) 48 | 49 | def commits(self, drop_collections=True): 50 | """ 51 | Returns a table of git log data, with "commits" as rows/observations. 52 | 53 | :param bool drop_collections: Defaults to True. Indicates whether columns with lists/dicts/sets will be dropped. 54 | 55 | :return: pandas.DataFrame 56 | """ 57 | base_df = self._data 58 | if drop_collections is True: 59 | out_df = self._drop_collections(base_df) 60 | else: 61 | out_df = base_df 62 | return out_df 63 | 64 | def changes(self): 65 | """ 66 | Returns a table of git log data, with "changes" as rows/observations. 67 | 68 | .. note:: 69 | 70 | drop_collections is not available for this method, since there are no meaningful collections to keep. 71 | 72 | :return: pandas.DataFrame 73 | """ 74 | return self.expand_on('hexsha', 'changes', rename1='hexsha', rename2='file') -------------------------------------------------------------------------------- /tidyextractors/tidygit/git_object_handlers.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************************************* 2 | # Copyright (C) 2017 Joel Becker, Jillian Anderson, Steve McColl and Dr. John McLevey 3 | # 4 | # This file is part of the tidyextractors package developed for Dr John McLevey's Networks Lab 5 | # at the University of Waterloo. For more information, see 6 | # http://tidyextractors.readthedocs.io/en/latest/ 7 | # 8 | # tidyextractors is free software: you can redistribute it and/or modify it under the terms of 9 | # the GNU General Public License as published by the Free Software Foundation, either version 3 10 | # of the License, or (at your option) any later version. 11 | # 12 | # tidyextractors is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 13 | # without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 14 | # See the GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License along with tidyextractors. 17 | # If not, see . 18 | # ********************************************************************************************* 19 | 20 | import git 21 | 22 | 23 | # All handlers have the following pattern: 24 | # handler(name,object) => dictionary of attributes 25 | # attributes in the dict will become values in rows 26 | # of the output dataframe. 27 | 28 | 29 | def handle_stats(name, obj): 30 | """ 31 | Stats object handler. 32 | :param name: Unused String 33 | :param obj: GitPython Stats 34 | :return: Dictionary of attributes. 35 | """ 36 | return {'total_deletions': obj.total['deletions'], 37 | 'total_insertions': obj.total['insertions'], 38 | 'total_lines': obj.total['lines'], 39 | 'total_files': obj.total['files'], 40 | 'changes': obj.files} 41 | 42 | 43 | def handle_actor(name, obj): 44 | """ 45 | Actor object handler. 46 | :param name: Unused String 47 | :param obj: GitPython Actor 48 | :return: Dictionary of attributes. 49 | """ 50 | return {'author_name': obj.name, 51 | 'author_email': obj.email} 52 | 53 | 54 | # Handler functions to turn objects into usable attributes. 55 | # Functions return a dictionary of attributes, which 56 | # will appear in a row of the pandas dataframe. 57 | 58 | git_object_handlers_lookup = {git.Stats: handle_stats, 59 | git.Actor: handle_actor} -------------------------------------------------------------------------------- /tidyextractors/tidymbox/__init__.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************************************* 2 | # Copyright (C) 2017 Joel Becker, Jillian Anderson, Steve McColl and Dr. John McLevey 3 | # 4 | # This file is part of the tidyextractors package developed for Dr John McLevey's Networks Lab 5 | # at the University of Waterloo. For more information, see 6 | # http://tidyextractors.readthedocs.io/en/latest/ 7 | # 8 | # tidyextractors is free software: you can redistribute it and/or modify it under the terms of 9 | # the GNU General Public License as published by the Free Software Foundation, either version 3 10 | # of the License, or (at your option) any later version. 11 | # 12 | # tidyextractors is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 13 | # without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 14 | # See the GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License along with tidyextractors. 17 | # If not, see . 18 | # ********************************************************************************************* 19 | 20 | from tidyextractors.tidymbox.mbox_extractor import MboxExtractor 21 | -------------------------------------------------------------------------------- /tidyextractors/tidymbox/mbox_extractor.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************************************* 2 | # Copyright (C) 2017 Joel Becker, Jillian Anderson, Steve McColl and Dr. John McLevey 3 | # 4 | # This file is part of the tidyextractors package developed for Dr John McLevey's Networks Lab 5 | # at the University of Waterloo. For more information, see 6 | # http://tidyextractors.readthedocs.io/en/latest/ 7 | # 8 | # tidyextractors is free software: you can redistribute it and/or modify it under the terms of 9 | # the GNU General Public License as published by the Free Software Foundation, either version 3 10 | # of the License, or (at your option) any later version. 11 | # 12 | # tidyextractors is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 13 | # without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 14 | # See the GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License along with tidyextractors. 17 | # If not, see . 18 | # ********************************************************************************************* 19 | 20 | import pandas as pd 21 | from tidyextractors import BaseExtractor 22 | from tidyextractors.tidymbox.mbox_to_pandas import mbox_to_pandas 23 | 24 | 25 | class MboxExtractor(BaseExtractor): 26 | """ 27 | The ``MboxExtractor`` class is for extracting data from local Mbox files. This class 28 | has methods for outputting data into the ``emails`` and ``sends`` tidy formats, and a 29 | raw untidy format. 30 | 31 | :param str source: The path to either a single mbox file or a directory containing multiple mbox files. 32 | :param bool auto_extract: Defaults to True. If True, data is extracted automatically. 33 | Otherwise, extraction must be initiated through the internal interface. 34 | """ 35 | 36 | def _extract(self, source, *args, **kwargs): 37 | """ 38 | Extracts data from mbox files. Mutates _data. 39 | 40 | :param str source: The path to one or more mbox files. 41 | :param args: Arbitrary arguments for extensibility. 42 | :param kwargs: Arbitrary keyword arguments for extensibility. 43 | :return: None 44 | """ 45 | # Extract data 46 | self._data = mbox_to_pandas(source) 47 | self._data['MessageID'] = pd.Series(range(0,len(self._data))) 48 | 49 | def emails(self, drop_collections = True): 50 | """ 51 | Returns a table of mbox message data, with "messages" as rows/observations. 52 | 53 | :param bool drop_collections: Defaults to True. Indicates whether columns with lists/dicts/sets will be dropped. 54 | 55 | :return: pandas.DataFrame 56 | """ 57 | base_df = self._data 58 | if drop_collections is True: 59 | out_df = self._drop_collections(base_df) 60 | else: 61 | out_df = base_df 62 | return out_df 63 | 64 | def sends(self): 65 | """ 66 | Returns a table of mbox message data, with "sender/recipient" pairs as rows/observations. 67 | 68 | .. note:: 69 | 70 | Rows may have a recipient from either "TO" or "CC". SendType column specifies this for each row. 71 | 72 | .. note:: 73 | 74 | drop_collections is not available for this method, since there are no meaningful collections to keep. 75 | 76 | :return: pandas.DataFrame 77 | """ 78 | # Expand on each "to" field 79 | on_to_df = self.expand_on('From', 'To', rename1='From', rename2='Recipient') 80 | on_cc_df = self.expand_on('From', 'Cc', rename1='From', rename2='Recipient') 81 | 82 | # Specify how it was sent 83 | on_to_df['SendType'] = 'To' 84 | on_cc_df['SendType'] = 'Cc' 85 | 86 | # Combine dataframes 87 | output_df = pd.concat([on_to_df, on_cc_df]) 88 | 89 | return self._drop_collections(output_df) 90 | -------------------------------------------------------------------------------- /tidyextractors/tidymbox/mbox_to_pandas.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************************************* 2 | # Copyright (C) 2017 Joel Becker, Jillian Anderson, Steve McColl and Dr. John McLevey 3 | # 4 | # This file is part of the tidyextractors package developed for Dr John McLevey's Networks Lab 5 | # at the University of Waterloo. For more information, see 6 | # http://tidyextractors.readthedocs.io/en/latest/ 7 | # 8 | # tidyextractors is free software: you can redistribute it and/or modify it under the terms of 9 | # the GNU General Public License as published by the Free Software Foundation, either version 3 10 | # of the License, or (at your option) any later version. 11 | # 12 | # tidyextractors is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 13 | # without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 14 | # See the GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License along with tidyextractors. 17 | # If not, see . 18 | # ********************************************************************************************* 19 | 20 | import os 21 | import re 22 | import tqdm 23 | import mailbox 24 | import warnings 25 | import pandas as pd 26 | import email.utils as email 27 | import email.header as header 28 | 29 | # Adapted from Phil Deutsch's "mbox-analysis" https://github.com/phildeutsch/mbox-analysis 30 | 31 | def clean_addresses(addresses): 32 | """ 33 | Cleans email address. 34 | :param addresses: List of strings (email addresses) 35 | :return: List of strings (cleaned email addresses) 36 | """ 37 | if addresses is None: 38 | return [] 39 | addresses = addresses.replace("\'", "") 40 | address_list = re.split('[,;]', addresses) 41 | clean_list = [] 42 | for address in address_list: 43 | temp_clean_address = clean_address(address) 44 | clean_list.append(temp_clean_address) 45 | return clean_list 46 | 47 | 48 | def clean_address(address): 49 | """ 50 | Cleans a single email address. 51 | :param address: String (email address) 52 | :return: String (clean email address) 53 | """ 54 | if isinstance(address, header.Header): 55 | return clean_address(address.encode('ascii')) 56 | 57 | elif isinstance(address, str): 58 | address = address.replace("<", "") 59 | address = address.replace(">", "") 60 | address = address.replace("\"", "") 61 | address = address.replace("\n", " ") 62 | address = address.replace("MAILER-DAEMON", "") 63 | address = address.lower().strip() 64 | 65 | email = None 66 | for word in address.split(' '): 67 | email_regex = re.compile( 68 | "^[a-zA-Z0-9._%-]+@[a-zA-Z0-9._%-]+.[a-zA-Z]{2,6}$" 69 | ) 70 | email = re.match(email_regex, word) 71 | if email is not None: 72 | clean_email = email.group(0) 73 | if email is None: 74 | if address.split(' ')[-1].find('@') > -1: 75 | clean_email = address.split(' ')[-1].strip() 76 | elif address.split(' ')[-1].find('?') > -1: 77 | clean_email = 'n/a' 78 | else: 79 | clean_email = address 80 | 81 | return clean_email 82 | 83 | elif address is None: 84 | return None 85 | 86 | else: 87 | raise ValueError('An unexpected type was given to clean_address. Address was {}'.format(address)) 88 | return None 89 | 90 | 91 | def get_body(message): 92 | """ 93 | Extracts body text from an mbox message. 94 | :param message: Mbox message 95 | :return: String 96 | """ 97 | try: 98 | sm = str(message) 99 | body_start = sm.find('iamunique', sm.find('iamunique')+1) 100 | body_start = sm.find('Content-Transfer-Encoding', body_start+1) 101 | body_start = sm.find('\n', body_start+1)+1 102 | 103 | body_end = sm.find('From: ', body_start + 1) 104 | if body_end == -1: 105 | body_end = sm.find('iamunique', body_start + 1) 106 | body_end = sm.find('\n', body_end - 25) 107 | body = sm[body_start:body_end] 108 | 109 | body = body.replace("=20\n", "") 110 | body = body.replace("=FC", "ü") 111 | body = body.replace("=F6", "ö") 112 | body = body.replace("=84", "\"") 113 | body = body.replace("=94", "\"") 114 | body = body.replace("=96", "-") 115 | body = body.replace("=92", "\'") 116 | body = body.replace("=93", "\"") 117 | body = body.replace("=E4", "ä") 118 | body = body.replace("=DF", "ss") 119 | body = body.replace("=", "") 120 | body = body.replace("\"", "") 121 | body = body.replace("\'", "") 122 | except: 123 | body = None 124 | 125 | return body 126 | 127 | 128 | def write_table(mboxfile, mailTable): 129 | """ 130 | Takes a list and extends it with lists of data, which is 131 | extracted from mbox messages. 132 | :param mboxfile: Mbox file name/path 133 | :param mailTable: A list (of lists) 134 | :return: An extended list of lists 135 | """ 136 | mail_box_contents = mailbox.mbox(mboxfile) 137 | 138 | m_pbar = tqdm.tqdm(range(0,len(mail_box_contents))) 139 | m_pbar.set_description('Extracting mbox messages...') 140 | 141 | count = 0 142 | update_interval = min(50,len(mail_box_contents)) 143 | 144 | for message in mail_box_contents: 145 | count += 1 146 | if count % update_interval == 0: 147 | m_pbar.update(update_interval) 148 | clean_from = clean_address(message['From']) 149 | clean_to = clean_addresses(message['To']) 150 | clean_cc = clean_addresses(message['Cc']) 151 | 152 | try: 153 | clean_date = email.parsedate_to_datetime(message['Date']) 154 | except: 155 | clean_date = None 156 | 157 | mailTable.append([ 158 | clean_from, 159 | clean_to, 160 | clean_cc, 161 | clean_date, 162 | message['Subject'], 163 | get_body(message) 164 | ]) 165 | 166 | 167 | def mbox_to_pandas(mbox_path): 168 | """ 169 | Extracts all mbox messages from mbox files in mbox_path. 170 | :param mbox_path: Path to an mbox file OR a directory containing mbox files. 171 | :return: A Pandas DataFrame with messages as rows/observations. 172 | """ 173 | if os.path.isfile(mbox_path): 174 | mbox_files = [mbox_path] 175 | else: 176 | mbox_files = [os.path.join(dirpath, f) for dirpath, dirnames, files in os.walk(mbox_path) for f in files if f.endswith('mbox')] 177 | 178 | mail_table = [] 179 | 180 | f_pbar = tqdm.tqdm(range(0,len(mbox_files))) 181 | f_pbar.set_description('Extracting mbox files...') 182 | 183 | for mbox_file in mbox_files: 184 | write_table(mbox_file, mail_table) 185 | f_pbar.update(1) 186 | 187 | df_out = pd.DataFrame(mail_table) 188 | df_out.columns = ['From', 'To', 'Cc', 'Date', 'Subject', 'Body'] 189 | df_out['NumTo'] = df_out['To'].map(lambda i: len(i)) 190 | df_out['NumCC'] = df_out['Cc'].map(lambda i: len(i)) 191 | return df_out -------------------------------------------------------------------------------- /tidyextractors/tidytwitter/__init__.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************************************* 2 | # Copyright (C) 2017 Joel Becker, Jillian Anderson, Steve McColl and Dr. John McLevey 3 | # 4 | # This file is part of the tidyextractors package developed for Dr John McLevey's Networks Lab 5 | # at the University of Waterloo. For more information, see 6 | # http://tidyextractors.readthedocs.io/en/latest/ 7 | # 8 | # tidyextractors is free software: you can redistribute it and/or modify it under the terms of 9 | # the GNU General Public License as published by the Free Software Foundation, either version 3 10 | # of the License, or (at your option) any later version. 11 | # 12 | # tidyextractors is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 13 | # without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 14 | # See the GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License along with tidyextractors. 17 | # If not, see . 18 | # ********************************************************************************************* 19 | 20 | from tidyextractors.tidytwitter.twitter_extractor import TwitterExtractor -------------------------------------------------------------------------------- /tidyextractors/tidytwitter/twitter_object_handlers.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************************************* 2 | # Copyright (C) 2017 Joel Becker, Jillian Anderson, Steve McColl and Dr. John McLevey 3 | # 4 | # This file is part of the tidyextractors package developed for Dr John McLevey's Networks Lab 5 | # at the University of Waterloo. For more information, see 6 | # http://tidyextractors.readthedocs.io/en/latest/ 7 | # 8 | # tidyextractors is free software: you can redistribute it and/or modify it under the terms of 9 | # the GNU General Public License as published by the Free Software Foundation, either version 3 10 | # of the License, or (at your option) any later version. 11 | # 12 | # tidyextractors is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 13 | # without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 14 | # See the GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License along with tidyextractors. 17 | # If not, see . 18 | # ********************************************************************************************* 19 | 20 | def handle_something(name, obj): 21 | return {'key':'val'} 22 | 23 | # Handler functions to turn objects into usable attributes. 24 | # Functions return a dictionary of attributes, which 25 | # will appear in a row of the pandas dataframe. 26 | 27 | twitter_object_handlers_lookup = {} --------------------------------------------------------------------------------