├── .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 = {}
--------------------------------------------------------------------------------
]