├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── .gitignore ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Cargo.lock ├── Cargo.toml ├── LICENSE.md ├── PROCESSES.md ├── PULL_REQUEST_TEMPLATE.md ├── README.md ├── alternatives.json ├── azure-pipelines.yml ├── ci ├── azure-install-rust.yml └── azure-publish-artifact.yml ├── readme-images ├── chit-logo.png ├── chit.png ├── owners.png ├── repo.png └── versions.png ├── research ├── crate.json ├── crates_of_user.json ├── github.json ├── owners.json └── research.md └── src ├── chit ├── details │ ├── alternatives │ │ └── mod.rs │ └── mod.rs ├── extract │ ├── mod.rs │ ├── owners.rs │ ├── package.rs │ └── repo.rs ├── format.rs ├── mod.rs ├── owners.rs ├── repo.rs ├── sources │ ├── crates.rs │ ├── github.rs │ └── mod.rs └── versions.rs ├── main.rs └── meta.rs /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | target 2 | .idea -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | 2 | # Change Log 3 | 4 | ### 0.1.15 - hyphenation 5 | - mthh fix a typo and added hyphens to the end of wrapping line when required. 6 | 7 | ### 0.1.14 - Make it bright 8 | - Change the color to be bright blue for text so that it is easier to read 9 | 10 | ### 0.1.13 - The nix version 11 | - Add repository url to repo command output 12 | - Change change get alternatives test to test syntax only 13 | - Add repository url to repo command output 14 | - Change change get alternatives test to test syntax only 15 | 16 | ### 0.1.12 - Pushing code quality 17 | - Change the 3 star threshold down to 750 from 1000 recent downloads 18 | - Add a new sub command repo - for things from github 19 | - Add a Owners type to the extraction model 20 | - Refactor owners to be a more functional flavour 21 | 22 | ### 0.1.11 - Refactor all the things 23 | - Refactor format module and add some tests 24 | - Refactor version to be a more functional flavour 25 | - Add a roadmap section to the readme 26 | - Added more logging options 27 | - Add error types and results for alternatives 28 | 29 | ### 0.1.10 - read the alternatives from github 30 | - luteberget reported and issue where a panic happens when listing alternatives. 31 | - 8176135 fix this! Champion! 32 | 33 | ## 0.1.9 - Let the people speak for real 34 | - Alternatives are set based because Incola suggested it and i like it a lot more 35 | 36 | ## 0.1.8 - Let the people speak - not released 37 | - Alternatives for some common crates 38 | - Show up in the details section of the chit 39 | 40 | ## 0.1.7 - Keep it simple . . . for now 41 | - Add crate categories to the output 42 | - Add crate description to the output 43 | 44 | ## 0.1.6 - The key is in the words 45 | - Refactor 46 | - All the actions to their own file 47 | - The remove_quote method usage 48 | - Add keywords to the output 49 | 50 | ## 0.1.5 - A license to ... show 51 | - Include the software license for the shown crate 52 | 53 | ## 0.1.4 - A link to the ... docs 54 | - Add external resource links for docs, crates.io and repo (Thanks to lnicola for the suggestion!) 55 | - Fix border alignment is not an issue 56 | 57 | ## 0.1.3 - nanocryk & joseluis you rule! 58 | - Multi owner support - Shoutout to nanocryk! 59 | - Speed gains and making -V arg work properly - Shoutout to joseluis! 60 | 61 | ## 0.1.2 - Bigger is better? 62 | - Include the size of the current version 63 | - Include the size of previous versions 64 | 65 | ## 0.1.1 - Great `crate help in terminal` 66 | - Make it clear what chit stands for in the docs 67 | - Add bug and feature issue templates 68 | 69 | ## 0.1.0 - Clapping my self silly 70 | - Use the command line argument parser (clap) crate - move the `owners` and `versions` code to there own subcommands 71 | - Introduce a CODE_OF_CONDUCT.md 72 | - Introduce a CONTRIBUTING.md 73 | - Add a pull request template 74 | - Add LICENSE.md 75 | 76 | ## 0.0.5 - All the versions + Star ratings 77 | - Print all the versions of a crate 78 | - Print the recent downloads of a crate 79 | - Print the star rating based on recent downloads 80 | 81 | ## 0.0.4 - Better error handling 82 | - Better error handling, less panic! 83 | - Better date format 84 | - Remove all the quotes in the output 85 | - Update the readme 86 | 87 | ## 0.0.3 - Add other crates of owner 88 | - Change the order thing apear in the chit 89 | - Add details of the other crates of an owner 90 | - better padded write abstraction 91 | - update readme with an image 92 | 93 | ## 0.0.2 - Getting better 94 | - A change log 95 | - Better visuals 96 | - Better code structure 97 | 98 | ## 0.0.1 - Initial release 99 | - First owner 100 | - Download count 101 | - Current version 102 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at heesterman.peter@gmail.com. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | For answers to common questions about this code of conduct, see 76 | https://www.contributor-covenant.org/faq 77 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | Contributing to Chit: Crate help in terminal 2 | == 3 | 4 | Thanks for taking the time to contribute to Chit! 🎉 Chit welcomes pull requests from everyone and anyone. 5 | 6 | ## Pull request process 7 | 1. Fork the Chit project 8 | 2. Create a new branch. The branch name should be prefixed with the authors github name, followed by one of [`chore`, `docs`, `feat`, `bugfix`, `refactor`, `test`] 9 | then the task. For example bobsmith/feat/add-logo 10 | 3. Make changes. Once the feature, bug or chore etc. is complete the commit message should contain whether it is a feature, bug or chore etc. for example "feat(Header): Add logo to header component" 11 | 4. Make a pull request into master. For this you will need to push to your fork and [submit a pull request][pr]. 12 | 13 | [pr]: https://github.com/peterheesterman/chit/pulls 14 | 15 | 16 | ## Passing the build 17 | 1. Run the auto formatter by using `cargo fmt` in terminal. 18 | 2. Run the tests by using the `cargo test` in terminal. 19 | 20 | 21 | ## Alternatives 22 | 23 | Please add them, i will be very happily accept suggestions and PRs for more alternatives. 24 | 25 | Please note that currently chit pulls the `alternatives.json` from `peterheesterman/github` master directly so if you want to test adding more you will need to configure the alternatives module to read a local file for development purposes. 26 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | [[package]] 4 | name = "MacTypes-sys" 5 | version = "2.1.0" 6 | source = "registry+https://github.com/rust-lang/crates.io-index" 7 | dependencies = [ 8 | "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", 9 | ] 10 | 11 | [[package]] 12 | name = "adler32" 13 | version = "1.0.3" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | 16 | [[package]] 17 | name = "ansi_term" 18 | version = "0.11.0" 19 | source = "registry+https://github.com/rust-lang/crates.io-index" 20 | dependencies = [ 21 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 22 | ] 23 | 24 | [[package]] 25 | name = "arrayvec" 26 | version = "0.4.10" 27 | source = "registry+https://github.com/rust-lang/crates.io-index" 28 | dependencies = [ 29 | "nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 30 | ] 31 | 32 | [[package]] 33 | name = "atlatl" 34 | version = "0.1.2" 35 | source = "registry+https://github.com/rust-lang/crates.io-index" 36 | dependencies = [ 37 | "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 38 | "num-traits 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", 39 | "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", 40 | ] 41 | 42 | [[package]] 43 | name = "atty" 44 | version = "0.2.11" 45 | source = "registry+https://github.com/rust-lang/crates.io-index" 46 | dependencies = [ 47 | "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", 48 | "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 49 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 50 | ] 51 | 52 | [[package]] 53 | name = "autocfg" 54 | version = "0.1.2" 55 | source = "registry+https://github.com/rust-lang/crates.io-index" 56 | 57 | [[package]] 58 | name = "base64" 59 | version = "0.10.1" 60 | source = "registry+https://github.com/rust-lang/crates.io-index" 61 | dependencies = [ 62 | "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 63 | ] 64 | 65 | [[package]] 66 | name = "bincode" 67 | version = "1.2.0" 68 | source = "registry+https://github.com/rust-lang/crates.io-index" 69 | dependencies = [ 70 | "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 71 | "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 72 | "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", 73 | ] 74 | 75 | [[package]] 76 | name = "bitflags" 77 | version = "1.0.4" 78 | source = "registry+https://github.com/rust-lang/crates.io-index" 79 | 80 | [[package]] 81 | name = "build_const" 82 | version = "0.2.1" 83 | source = "registry+https://github.com/rust-lang/crates.io-index" 84 | 85 | [[package]] 86 | name = "byteorder" 87 | version = "1.3.1" 88 | source = "registry+https://github.com/rust-lang/crates.io-index" 89 | 90 | [[package]] 91 | name = "bytes" 92 | version = "0.4.12" 93 | source = "registry+https://github.com/rust-lang/crates.io-index" 94 | dependencies = [ 95 | "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 96 | "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 97 | ] 98 | 99 | [[package]] 100 | name = "cc" 101 | version = "1.0.31" 102 | source = "registry+https://github.com/rust-lang/crates.io-index" 103 | 104 | [[package]] 105 | name = "cfg-if" 106 | version = "0.1.7" 107 | source = "registry+https://github.com/rust-lang/crates.io-index" 108 | 109 | [[package]] 110 | name = "chit" 111 | version = "0.1.15" 112 | dependencies = [ 113 | "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", 114 | "colored 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 115 | "hyphenation 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", 116 | "openssl 0.10.20 (registry+https://github.com/rust-lang/crates.io-index)", 117 | "reqwest 0.9.12 (registry+https://github.com/rust-lang/crates.io-index)", 118 | "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", 119 | "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", 120 | "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", 121 | "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", 122 | ] 123 | 124 | [[package]] 125 | name = "clap" 126 | version = "2.32.0" 127 | source = "registry+https://github.com/rust-lang/crates.io-index" 128 | dependencies = [ 129 | "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", 130 | "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", 131 | "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 132 | "strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 133 | "textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", 134 | "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 135 | "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 136 | ] 137 | 138 | [[package]] 139 | name = "cloudabi" 140 | version = "0.0.3" 141 | source = "registry+https://github.com/rust-lang/crates.io-index" 142 | dependencies = [ 143 | "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 144 | ] 145 | 146 | [[package]] 147 | name = "colored" 148 | version = "1.7.0" 149 | source = "registry+https://github.com/rust-lang/crates.io-index" 150 | dependencies = [ 151 | "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 152 | ] 153 | 154 | [[package]] 155 | name = "core-foundation" 156 | version = "0.5.1" 157 | source = "registry+https://github.com/rust-lang/crates.io-index" 158 | dependencies = [ 159 | "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 160 | "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", 161 | ] 162 | 163 | [[package]] 164 | name = "core-foundation-sys" 165 | version = "0.5.1" 166 | source = "registry+https://github.com/rust-lang/crates.io-index" 167 | dependencies = [ 168 | "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", 169 | ] 170 | 171 | [[package]] 172 | name = "crc" 173 | version = "1.8.1" 174 | source = "registry+https://github.com/rust-lang/crates.io-index" 175 | dependencies = [ 176 | "build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 177 | ] 178 | 179 | [[package]] 180 | name = "crc32fast" 181 | version = "1.2.0" 182 | source = "registry+https://github.com/rust-lang/crates.io-index" 183 | dependencies = [ 184 | "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 185 | ] 186 | 187 | [[package]] 188 | name = "crossbeam-deque" 189 | version = "0.7.1" 190 | source = "registry+https://github.com/rust-lang/crates.io-index" 191 | dependencies = [ 192 | "crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", 193 | "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 194 | ] 195 | 196 | [[package]] 197 | name = "crossbeam-epoch" 198 | version = "0.7.1" 199 | source = "registry+https://github.com/rust-lang/crates.io-index" 200 | dependencies = [ 201 | "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", 202 | "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 203 | "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 204 | "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 205 | "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 206 | "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 207 | ] 208 | 209 | [[package]] 210 | name = "crossbeam-queue" 211 | version = "0.1.2" 212 | source = "registry+https://github.com/rust-lang/crates.io-index" 213 | dependencies = [ 214 | "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 215 | ] 216 | 217 | [[package]] 218 | name = "crossbeam-utils" 219 | version = "0.6.5" 220 | source = "registry+https://github.com/rust-lang/crates.io-index" 221 | dependencies = [ 222 | "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 223 | "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 224 | ] 225 | 226 | [[package]] 227 | name = "dtoa" 228 | version = "0.4.3" 229 | source = "registry+https://github.com/rust-lang/crates.io-index" 230 | 231 | [[package]] 232 | name = "encoding_rs" 233 | version = "0.8.17" 234 | source = "registry+https://github.com/rust-lang/crates.io-index" 235 | dependencies = [ 236 | "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 237 | ] 238 | 239 | [[package]] 240 | name = "flate2" 241 | version = "1.0.7" 242 | source = "registry+https://github.com/rust-lang/crates.io-index" 243 | dependencies = [ 244 | "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 245 | "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", 246 | "miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 247 | ] 248 | 249 | [[package]] 250 | name = "fnv" 251 | version = "1.0.6" 252 | source = "registry+https://github.com/rust-lang/crates.io-index" 253 | 254 | [[package]] 255 | name = "foreign-types" 256 | version = "0.3.2" 257 | source = "registry+https://github.com/rust-lang/crates.io-index" 258 | dependencies = [ 259 | "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 260 | ] 261 | 262 | [[package]] 263 | name = "foreign-types-shared" 264 | version = "0.1.1" 265 | source = "registry+https://github.com/rust-lang/crates.io-index" 266 | 267 | [[package]] 268 | name = "fuchsia-cprng" 269 | version = "0.1.1" 270 | source = "registry+https://github.com/rust-lang/crates.io-index" 271 | 272 | [[package]] 273 | name = "fuchsia-zircon" 274 | version = "0.3.3" 275 | source = "registry+https://github.com/rust-lang/crates.io-index" 276 | dependencies = [ 277 | "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 278 | "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 279 | ] 280 | 281 | [[package]] 282 | name = "fuchsia-zircon-sys" 283 | version = "0.3.3" 284 | source = "registry+https://github.com/rust-lang/crates.io-index" 285 | 286 | [[package]] 287 | name = "futures" 288 | version = "0.1.25" 289 | source = "registry+https://github.com/rust-lang/crates.io-index" 290 | 291 | [[package]] 292 | name = "futures-cpupool" 293 | version = "0.1.8" 294 | source = "registry+https://github.com/rust-lang/crates.io-index" 295 | dependencies = [ 296 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 297 | "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", 298 | ] 299 | 300 | [[package]] 301 | name = "h2" 302 | version = "0.1.17" 303 | source = "registry+https://github.com/rust-lang/crates.io-index" 304 | dependencies = [ 305 | "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 306 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 307 | "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 308 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 309 | "http 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 310 | "indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 311 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 312 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 313 | "string 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 314 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 315 | ] 316 | 317 | [[package]] 318 | name = "http" 319 | version = "0.1.16" 320 | source = "registry+https://github.com/rust-lang/crates.io-index" 321 | dependencies = [ 322 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 323 | "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 324 | "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", 325 | ] 326 | 327 | [[package]] 328 | name = "httparse" 329 | version = "1.3.3" 330 | source = "registry+https://github.com/rust-lang/crates.io-index" 331 | 332 | [[package]] 333 | name = "hyper" 334 | version = "0.12.25" 335 | source = "registry+https://github.com/rust-lang/crates.io-index" 336 | dependencies = [ 337 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 338 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 339 | "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 340 | "h2 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", 341 | "http 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 342 | "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 343 | "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 344 | "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", 345 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 346 | "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 347 | "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 348 | "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", 349 | "tokio 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", 350 | "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 351 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 352 | "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", 353 | "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 354 | "tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 355 | "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", 356 | "want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 357 | ] 358 | 359 | [[package]] 360 | name = "hyper-tls" 361 | version = "0.3.2" 362 | source = "registry+https://github.com/rust-lang/crates.io-index" 363 | dependencies = [ 364 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 365 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 366 | "hyper 0.12.25 (registry+https://github.com/rust-lang/crates.io-index)", 367 | "native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 368 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 369 | ] 370 | 371 | [[package]] 372 | name = "hyphenation" 373 | version = "0.7.1" 374 | source = "registry+https://github.com/rust-lang/crates.io-index" 375 | dependencies = [ 376 | "atlatl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 377 | "bincode 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 378 | "hyphenation_commons 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", 379 | "pocket-resources 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 380 | "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", 381 | ] 382 | 383 | [[package]] 384 | name = "hyphenation_commons" 385 | version = "0.7.1" 386 | source = "registry+https://github.com/rust-lang/crates.io-index" 387 | dependencies = [ 388 | "atlatl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 389 | "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", 390 | ] 391 | 392 | [[package]] 393 | name = "idna" 394 | version = "0.1.5" 395 | source = "registry+https://github.com/rust-lang/crates.io-index" 396 | dependencies = [ 397 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 398 | "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 399 | "unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 400 | ] 401 | 402 | [[package]] 403 | name = "indexmap" 404 | version = "1.0.2" 405 | source = "registry+https://github.com/rust-lang/crates.io-index" 406 | 407 | [[package]] 408 | name = "iovec" 409 | version = "0.1.2" 410 | source = "registry+https://github.com/rust-lang/crates.io-index" 411 | dependencies = [ 412 | "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", 413 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 414 | ] 415 | 416 | [[package]] 417 | name = "itoa" 418 | version = "0.4.3" 419 | source = "registry+https://github.com/rust-lang/crates.io-index" 420 | 421 | [[package]] 422 | name = "kernel32-sys" 423 | version = "0.2.2" 424 | source = "registry+https://github.com/rust-lang/crates.io-index" 425 | dependencies = [ 426 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 427 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 428 | ] 429 | 430 | [[package]] 431 | name = "lazy_static" 432 | version = "1.3.0" 433 | source = "registry+https://github.com/rust-lang/crates.io-index" 434 | 435 | [[package]] 436 | name = "lazycell" 437 | version = "1.2.1" 438 | source = "registry+https://github.com/rust-lang/crates.io-index" 439 | 440 | [[package]] 441 | name = "libc" 442 | version = "0.2.50" 443 | source = "registry+https://github.com/rust-lang/crates.io-index" 444 | 445 | [[package]] 446 | name = "lock_api" 447 | version = "0.1.5" 448 | source = "registry+https://github.com/rust-lang/crates.io-index" 449 | dependencies = [ 450 | "owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 451 | "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 452 | ] 453 | 454 | [[package]] 455 | name = "log" 456 | version = "0.4.6" 457 | source = "registry+https://github.com/rust-lang/crates.io-index" 458 | dependencies = [ 459 | "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 460 | ] 461 | 462 | [[package]] 463 | name = "matches" 464 | version = "0.1.8" 465 | source = "registry+https://github.com/rust-lang/crates.io-index" 466 | 467 | [[package]] 468 | name = "memoffset" 469 | version = "0.2.1" 470 | source = "registry+https://github.com/rust-lang/crates.io-index" 471 | 472 | [[package]] 473 | name = "mime" 474 | version = "0.3.13" 475 | source = "registry+https://github.com/rust-lang/crates.io-index" 476 | dependencies = [ 477 | "unicase 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 478 | ] 479 | 480 | [[package]] 481 | name = "mime_guess" 482 | version = "2.0.0-alpha.6" 483 | source = "registry+https://github.com/rust-lang/crates.io-index" 484 | dependencies = [ 485 | "mime 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", 486 | "phf 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", 487 | "phf_codegen 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", 488 | "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 489 | ] 490 | 491 | [[package]] 492 | name = "miniz_oxide" 493 | version = "0.2.1" 494 | source = "registry+https://github.com/rust-lang/crates.io-index" 495 | dependencies = [ 496 | "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 497 | ] 498 | 499 | [[package]] 500 | name = "miniz_oxide_c_api" 501 | version = "0.2.1" 502 | source = "registry+https://github.com/rust-lang/crates.io-index" 503 | dependencies = [ 504 | "cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", 505 | "crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 506 | "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", 507 | "miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 508 | ] 509 | 510 | [[package]] 511 | name = "mio" 512 | version = "0.6.16" 513 | source = "registry+https://github.com/rust-lang/crates.io-index" 514 | dependencies = [ 515 | "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 516 | "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 517 | "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 518 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 519 | "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 520 | "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", 521 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 522 | "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 523 | "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 524 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 525 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 526 | ] 527 | 528 | [[package]] 529 | name = "miow" 530 | version = "0.2.1" 531 | source = "registry+https://github.com/rust-lang/crates.io-index" 532 | dependencies = [ 533 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 534 | "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 535 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 536 | "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 537 | ] 538 | 539 | [[package]] 540 | name = "native-tls" 541 | version = "0.2.2" 542 | source = "registry+https://github.com/rust-lang/crates.io-index" 543 | dependencies = [ 544 | "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 545 | "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", 546 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 547 | "openssl 0.10.20 (registry+https://github.com/rust-lang/crates.io-index)", 548 | "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 549 | "openssl-sys 0.9.43 (registry+https://github.com/rust-lang/crates.io-index)", 550 | "schannel 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", 551 | "security-framework 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 552 | "security-framework-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 553 | "tempfile 3.0.7 (registry+https://github.com/rust-lang/crates.io-index)", 554 | ] 555 | 556 | [[package]] 557 | name = "net2" 558 | version = "0.2.33" 559 | source = "registry+https://github.com/rust-lang/crates.io-index" 560 | dependencies = [ 561 | "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 562 | "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", 563 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 564 | ] 565 | 566 | [[package]] 567 | name = "nodrop" 568 | version = "0.1.13" 569 | source = "registry+https://github.com/rust-lang/crates.io-index" 570 | 571 | [[package]] 572 | name = "num-traits" 573 | version = "0.2.7" 574 | source = "registry+https://github.com/rust-lang/crates.io-index" 575 | dependencies = [ 576 | "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 577 | ] 578 | 579 | [[package]] 580 | name = "num_cpus" 581 | version = "1.10.0" 582 | source = "registry+https://github.com/rust-lang/crates.io-index" 583 | dependencies = [ 584 | "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", 585 | ] 586 | 587 | [[package]] 588 | name = "openssl" 589 | version = "0.10.20" 590 | source = "registry+https://github.com/rust-lang/crates.io-index" 591 | dependencies = [ 592 | "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 593 | "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 594 | "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 595 | "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 596 | "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", 597 | "openssl-sys 0.9.43 (registry+https://github.com/rust-lang/crates.io-index)", 598 | ] 599 | 600 | [[package]] 601 | name = "openssl-probe" 602 | version = "0.1.2" 603 | source = "registry+https://github.com/rust-lang/crates.io-index" 604 | 605 | [[package]] 606 | name = "openssl-src" 607 | version = "111.2.1+1.1.1b" 608 | source = "registry+https://github.com/rust-lang/crates.io-index" 609 | dependencies = [ 610 | "cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", 611 | ] 612 | 613 | [[package]] 614 | name = "openssl-sys" 615 | version = "0.9.43" 616 | source = "registry+https://github.com/rust-lang/crates.io-index" 617 | dependencies = [ 618 | "cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", 619 | "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", 620 | "openssl-src 111.2.1+1.1.1b (registry+https://github.com/rust-lang/crates.io-index)", 621 | "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", 622 | "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 623 | "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 624 | ] 625 | 626 | [[package]] 627 | name = "owning_ref" 628 | version = "0.4.0" 629 | source = "registry+https://github.com/rust-lang/crates.io-index" 630 | dependencies = [ 631 | "stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 632 | ] 633 | 634 | [[package]] 635 | name = "parking_lot" 636 | version = "0.7.1" 637 | source = "registry+https://github.com/rust-lang/crates.io-index" 638 | dependencies = [ 639 | "lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 640 | "parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 641 | ] 642 | 643 | [[package]] 644 | name = "parking_lot_core" 645 | version = "0.4.0" 646 | source = "registry+https://github.com/rust-lang/crates.io-index" 647 | dependencies = [ 648 | "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", 649 | "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 650 | "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 651 | "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", 652 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 653 | ] 654 | 655 | [[package]] 656 | name = "percent-encoding" 657 | version = "1.0.1" 658 | source = "registry+https://github.com/rust-lang/crates.io-index" 659 | 660 | [[package]] 661 | name = "phf" 662 | version = "0.7.24" 663 | source = "registry+https://github.com/rust-lang/crates.io-index" 664 | dependencies = [ 665 | "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", 666 | ] 667 | 668 | [[package]] 669 | name = "phf_codegen" 670 | version = "0.7.24" 671 | source = "registry+https://github.com/rust-lang/crates.io-index" 672 | dependencies = [ 673 | "phf_generator 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", 674 | "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", 675 | ] 676 | 677 | [[package]] 678 | name = "phf_generator" 679 | version = "0.7.24" 680 | source = "registry+https://github.com/rust-lang/crates.io-index" 681 | dependencies = [ 682 | "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", 683 | "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 684 | ] 685 | 686 | [[package]] 687 | name = "phf_shared" 688 | version = "0.7.24" 689 | source = "registry+https://github.com/rust-lang/crates.io-index" 690 | dependencies = [ 691 | "siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 692 | "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 693 | ] 694 | 695 | [[package]] 696 | name = "pkg-config" 697 | version = "0.3.14" 698 | source = "registry+https://github.com/rust-lang/crates.io-index" 699 | 700 | [[package]] 701 | name = "pocket-resources" 702 | version = "0.3.2" 703 | source = "registry+https://github.com/rust-lang/crates.io-index" 704 | 705 | [[package]] 706 | name = "proc-macro2" 707 | version = "0.4.27" 708 | source = "registry+https://github.com/rust-lang/crates.io-index" 709 | dependencies = [ 710 | "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 711 | ] 712 | 713 | [[package]] 714 | name = "quote" 715 | version = "0.6.12" 716 | source = "registry+https://github.com/rust-lang/crates.io-index" 717 | dependencies = [ 718 | "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", 719 | ] 720 | 721 | [[package]] 722 | name = "rand" 723 | version = "0.6.5" 724 | source = "registry+https://github.com/rust-lang/crates.io-index" 725 | dependencies = [ 726 | "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 727 | "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", 728 | "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 729 | "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 730 | "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 731 | "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 732 | "rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 733 | "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 734 | "rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 735 | "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 736 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 737 | ] 738 | 739 | [[package]] 740 | name = "rand_chacha" 741 | version = "0.1.1" 742 | source = "registry+https://github.com/rust-lang/crates.io-index" 743 | dependencies = [ 744 | "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 745 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 746 | ] 747 | 748 | [[package]] 749 | name = "rand_core" 750 | version = "0.3.1" 751 | source = "registry+https://github.com/rust-lang/crates.io-index" 752 | dependencies = [ 753 | "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 754 | ] 755 | 756 | [[package]] 757 | name = "rand_core" 758 | version = "0.4.0" 759 | source = "registry+https://github.com/rust-lang/crates.io-index" 760 | 761 | [[package]] 762 | name = "rand_hc" 763 | version = "0.1.0" 764 | source = "registry+https://github.com/rust-lang/crates.io-index" 765 | dependencies = [ 766 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 767 | ] 768 | 769 | [[package]] 770 | name = "rand_isaac" 771 | version = "0.1.1" 772 | source = "registry+https://github.com/rust-lang/crates.io-index" 773 | dependencies = [ 774 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 775 | ] 776 | 777 | [[package]] 778 | name = "rand_jitter" 779 | version = "0.1.3" 780 | source = "registry+https://github.com/rust-lang/crates.io-index" 781 | dependencies = [ 782 | "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", 783 | "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 784 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 785 | ] 786 | 787 | [[package]] 788 | name = "rand_os" 789 | version = "0.1.3" 790 | source = "registry+https://github.com/rust-lang/crates.io-index" 791 | dependencies = [ 792 | "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 793 | "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 794 | "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", 795 | "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 796 | "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 797 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 798 | ] 799 | 800 | [[package]] 801 | name = "rand_pcg" 802 | version = "0.1.2" 803 | source = "registry+https://github.com/rust-lang/crates.io-index" 804 | dependencies = [ 805 | "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 806 | "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 807 | ] 808 | 809 | [[package]] 810 | name = "rand_xorshift" 811 | version = "0.1.1" 812 | source = "registry+https://github.com/rust-lang/crates.io-index" 813 | dependencies = [ 814 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 815 | ] 816 | 817 | [[package]] 818 | name = "rdrand" 819 | version = "0.4.0" 820 | source = "registry+https://github.com/rust-lang/crates.io-index" 821 | dependencies = [ 822 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 823 | ] 824 | 825 | [[package]] 826 | name = "redox_syscall" 827 | version = "0.1.51" 828 | source = "registry+https://github.com/rust-lang/crates.io-index" 829 | 830 | [[package]] 831 | name = "redox_termios" 832 | version = "0.1.1" 833 | source = "registry+https://github.com/rust-lang/crates.io-index" 834 | dependencies = [ 835 | "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", 836 | ] 837 | 838 | [[package]] 839 | name = "remove_dir_all" 840 | version = "0.5.1" 841 | source = "registry+https://github.com/rust-lang/crates.io-index" 842 | dependencies = [ 843 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 844 | ] 845 | 846 | [[package]] 847 | name = "reqwest" 848 | version = "0.9.12" 849 | source = "registry+https://github.com/rust-lang/crates.io-index" 850 | dependencies = [ 851 | "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", 852 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 853 | "encoding_rs 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)", 854 | "flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", 855 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 856 | "http 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 857 | "hyper 0.12.25 (registry+https://github.com/rust-lang/crates.io-index)", 858 | "hyper-tls 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 859 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 860 | "mime 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", 861 | "mime_guess 2.0.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)", 862 | "native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 863 | "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", 864 | "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", 865 | "serde_urlencoded 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", 866 | "tokio 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", 867 | "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 868 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 869 | "tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 870 | "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", 871 | "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 872 | "uuid 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 873 | ] 874 | 875 | [[package]] 876 | name = "rustc_version" 877 | version = "0.2.3" 878 | source = "registry+https://github.com/rust-lang/crates.io-index" 879 | dependencies = [ 880 | "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 881 | ] 882 | 883 | [[package]] 884 | name = "ryu" 885 | version = "0.2.7" 886 | source = "registry+https://github.com/rust-lang/crates.io-index" 887 | 888 | [[package]] 889 | name = "schannel" 890 | version = "0.1.15" 891 | source = "registry+https://github.com/rust-lang/crates.io-index" 892 | dependencies = [ 893 | "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 894 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 895 | ] 896 | 897 | [[package]] 898 | name = "scopeguard" 899 | version = "0.3.3" 900 | source = "registry+https://github.com/rust-lang/crates.io-index" 901 | 902 | [[package]] 903 | name = "security-framework" 904 | version = "0.2.2" 905 | source = "registry+https://github.com/rust-lang/crates.io-index" 906 | dependencies = [ 907 | "core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 908 | "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 909 | "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", 910 | "security-framework-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 911 | ] 912 | 913 | [[package]] 914 | name = "security-framework-sys" 915 | version = "0.2.3" 916 | source = "registry+https://github.com/rust-lang/crates.io-index" 917 | dependencies = [ 918 | "MacTypes-sys 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 919 | "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 920 | "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", 921 | ] 922 | 923 | [[package]] 924 | name = "semver" 925 | version = "0.9.0" 926 | source = "registry+https://github.com/rust-lang/crates.io-index" 927 | dependencies = [ 928 | "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 929 | ] 930 | 931 | [[package]] 932 | name = "semver-parser" 933 | version = "0.7.0" 934 | source = "registry+https://github.com/rust-lang/crates.io-index" 935 | 936 | [[package]] 937 | name = "serde" 938 | version = "1.0.89" 939 | source = "registry+https://github.com/rust-lang/crates.io-index" 940 | dependencies = [ 941 | "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", 942 | ] 943 | 944 | [[package]] 945 | name = "serde_derive" 946 | version = "1.0.90" 947 | source = "registry+https://github.com/rust-lang/crates.io-index" 948 | dependencies = [ 949 | "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", 950 | "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", 951 | "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", 952 | ] 953 | 954 | [[package]] 955 | name = "serde_json" 956 | version = "1.0.39" 957 | source = "registry+https://github.com/rust-lang/crates.io-index" 958 | dependencies = [ 959 | "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", 960 | "ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", 961 | "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", 962 | ] 963 | 964 | [[package]] 965 | name = "serde_urlencoded" 966 | version = "0.5.4" 967 | source = "registry+https://github.com/rust-lang/crates.io-index" 968 | dependencies = [ 969 | "dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", 970 | "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", 971 | "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", 972 | "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 973 | ] 974 | 975 | [[package]] 976 | name = "siphasher" 977 | version = "0.2.3" 978 | source = "registry+https://github.com/rust-lang/crates.io-index" 979 | 980 | [[package]] 981 | name = "slab" 982 | version = "0.4.2" 983 | source = "registry+https://github.com/rust-lang/crates.io-index" 984 | 985 | [[package]] 986 | name = "smallvec" 987 | version = "0.6.9" 988 | source = "registry+https://github.com/rust-lang/crates.io-index" 989 | 990 | [[package]] 991 | name = "stable_deref_trait" 992 | version = "1.1.1" 993 | source = "registry+https://github.com/rust-lang/crates.io-index" 994 | 995 | [[package]] 996 | name = "string" 997 | version = "0.1.3" 998 | source = "registry+https://github.com/rust-lang/crates.io-index" 999 | 1000 | [[package]] 1001 | name = "strsim" 1002 | version = "0.7.0" 1003 | source = "registry+https://github.com/rust-lang/crates.io-index" 1004 | 1005 | [[package]] 1006 | name = "syn" 1007 | version = "0.15.32" 1008 | source = "registry+https://github.com/rust-lang/crates.io-index" 1009 | dependencies = [ 1010 | "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", 1011 | "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", 1012 | "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1013 | ] 1014 | 1015 | [[package]] 1016 | name = "tempfile" 1017 | version = "3.0.7" 1018 | source = "registry+https://github.com/rust-lang/crates.io-index" 1019 | dependencies = [ 1020 | "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 1021 | "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", 1022 | "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 1023 | "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", 1024 | "remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 1025 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 1026 | ] 1027 | 1028 | [[package]] 1029 | name = "termion" 1030 | version = "1.5.1" 1031 | source = "registry+https://github.com/rust-lang/crates.io-index" 1032 | dependencies = [ 1033 | "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", 1034 | "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", 1035 | "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1036 | ] 1037 | 1038 | [[package]] 1039 | name = "textwrap" 1040 | version = "0.10.0" 1041 | source = "registry+https://github.com/rust-lang/crates.io-index" 1042 | dependencies = [ 1043 | "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1044 | ] 1045 | 1046 | [[package]] 1047 | name = "textwrap" 1048 | version = "0.11.0" 1049 | source = "registry+https://github.com/rust-lang/crates.io-index" 1050 | dependencies = [ 1051 | "hyphenation 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", 1052 | "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1053 | ] 1054 | 1055 | [[package]] 1056 | name = "time" 1057 | version = "0.1.42" 1058 | source = "registry+https://github.com/rust-lang/crates.io-index" 1059 | dependencies = [ 1060 | "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", 1061 | "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", 1062 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 1063 | ] 1064 | 1065 | [[package]] 1066 | name = "tokio" 1067 | version = "0.1.17" 1068 | source = "registry+https://github.com/rust-lang/crates.io-index" 1069 | dependencies = [ 1070 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 1071 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1072 | "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", 1073 | "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", 1074 | "tokio-current-thread 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1075 | "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1076 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1077 | "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", 1078 | "tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1079 | "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", 1080 | "tokio-trace-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1081 | ] 1082 | 1083 | [[package]] 1084 | name = "tokio-current-thread" 1085 | version = "0.1.5" 1086 | source = "registry+https://github.com/rust-lang/crates.io-index" 1087 | dependencies = [ 1088 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1089 | "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1090 | ] 1091 | 1092 | [[package]] 1093 | name = "tokio-executor" 1094 | version = "0.1.6" 1095 | source = "registry+https://github.com/rust-lang/crates.io-index" 1096 | dependencies = [ 1097 | "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 1098 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1099 | ] 1100 | 1101 | [[package]] 1102 | name = "tokio-io" 1103 | version = "0.1.12" 1104 | source = "registry+https://github.com/rust-lang/crates.io-index" 1105 | dependencies = [ 1106 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 1107 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1108 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 1109 | ] 1110 | 1111 | [[package]] 1112 | name = "tokio-reactor" 1113 | version = "0.1.9" 1114 | source = "registry+https://github.com/rust-lang/crates.io-index" 1115 | dependencies = [ 1116 | "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 1117 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1118 | "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 1119 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 1120 | "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", 1121 | "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", 1122 | "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", 1123 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1124 | "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1125 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1126 | "tokio-sync 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1127 | ] 1128 | 1129 | [[package]] 1130 | name = "tokio-sync" 1131 | version = "0.1.4" 1132 | source = "registry+https://github.com/rust-lang/crates.io-index" 1133 | dependencies = [ 1134 | "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 1135 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1136 | ] 1137 | 1138 | [[package]] 1139 | name = "tokio-tcp" 1140 | version = "0.1.3" 1141 | source = "registry+https://github.com/rust-lang/crates.io-index" 1142 | dependencies = [ 1143 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 1144 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1145 | "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1146 | "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", 1147 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1148 | "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", 1149 | ] 1150 | 1151 | [[package]] 1152 | name = "tokio-threadpool" 1153 | version = "0.1.12" 1154 | source = "registry+https://github.com/rust-lang/crates.io-index" 1155 | dependencies = [ 1156 | "crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", 1157 | "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1158 | "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 1159 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1160 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 1161 | "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", 1162 | "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 1163 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1164 | "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1165 | ] 1166 | 1167 | [[package]] 1168 | name = "tokio-timer" 1169 | version = "0.2.10" 1170 | source = "registry+https://github.com/rust-lang/crates.io-index" 1171 | dependencies = [ 1172 | "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 1173 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1174 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1175 | "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1176 | ] 1177 | 1178 | [[package]] 1179 | name = "tokio-trace-core" 1180 | version = "0.1.0" 1181 | source = "registry+https://github.com/rust-lang/crates.io-index" 1182 | dependencies = [ 1183 | "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 1184 | ] 1185 | 1186 | [[package]] 1187 | name = "try-lock" 1188 | version = "0.2.2" 1189 | source = "registry+https://github.com/rust-lang/crates.io-index" 1190 | 1191 | [[package]] 1192 | name = "unicase" 1193 | version = "1.4.2" 1194 | source = "registry+https://github.com/rust-lang/crates.io-index" 1195 | dependencies = [ 1196 | "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1197 | ] 1198 | 1199 | [[package]] 1200 | name = "unicase" 1201 | version = "2.3.0" 1202 | source = "registry+https://github.com/rust-lang/crates.io-index" 1203 | dependencies = [ 1204 | "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1205 | ] 1206 | 1207 | [[package]] 1208 | name = "unicode-bidi" 1209 | version = "0.3.4" 1210 | source = "registry+https://github.com/rust-lang/crates.io-index" 1211 | dependencies = [ 1212 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1213 | ] 1214 | 1215 | [[package]] 1216 | name = "unicode-normalization" 1217 | version = "0.1.8" 1218 | source = "registry+https://github.com/rust-lang/crates.io-index" 1219 | dependencies = [ 1220 | "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", 1221 | ] 1222 | 1223 | [[package]] 1224 | name = "unicode-width" 1225 | version = "0.1.5" 1226 | source = "registry+https://github.com/rust-lang/crates.io-index" 1227 | 1228 | [[package]] 1229 | name = "unicode-xid" 1230 | version = "0.1.0" 1231 | source = "registry+https://github.com/rust-lang/crates.io-index" 1232 | 1233 | [[package]] 1234 | name = "url" 1235 | version = "1.7.2" 1236 | source = "registry+https://github.com/rust-lang/crates.io-index" 1237 | dependencies = [ 1238 | "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1239 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1240 | "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 1241 | ] 1242 | 1243 | [[package]] 1244 | name = "uuid" 1245 | version = "0.7.2" 1246 | source = "registry+https://github.com/rust-lang/crates.io-index" 1247 | dependencies = [ 1248 | "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 1249 | ] 1250 | 1251 | [[package]] 1252 | name = "vcpkg" 1253 | version = "0.2.6" 1254 | source = "registry+https://github.com/rust-lang/crates.io-index" 1255 | 1256 | [[package]] 1257 | name = "vec_map" 1258 | version = "0.8.1" 1259 | source = "registry+https://github.com/rust-lang/crates.io-index" 1260 | 1261 | [[package]] 1262 | name = "version_check" 1263 | version = "0.1.5" 1264 | source = "registry+https://github.com/rust-lang/crates.io-index" 1265 | 1266 | [[package]] 1267 | name = "want" 1268 | version = "0.0.6" 1269 | source = "registry+https://github.com/rust-lang/crates.io-index" 1270 | dependencies = [ 1271 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1272 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 1273 | "try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 1274 | ] 1275 | 1276 | [[package]] 1277 | name = "winapi" 1278 | version = "0.2.8" 1279 | source = "registry+https://github.com/rust-lang/crates.io-index" 1280 | 1281 | [[package]] 1282 | name = "winapi" 1283 | version = "0.3.6" 1284 | source = "registry+https://github.com/rust-lang/crates.io-index" 1285 | dependencies = [ 1286 | "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1287 | "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1288 | ] 1289 | 1290 | [[package]] 1291 | name = "winapi-build" 1292 | version = "0.1.1" 1293 | source = "registry+https://github.com/rust-lang/crates.io-index" 1294 | 1295 | [[package]] 1296 | name = "winapi-i686-pc-windows-gnu" 1297 | version = "0.4.0" 1298 | source = "registry+https://github.com/rust-lang/crates.io-index" 1299 | 1300 | [[package]] 1301 | name = "winapi-x86_64-pc-windows-gnu" 1302 | version = "0.4.0" 1303 | source = "registry+https://github.com/rust-lang/crates.io-index" 1304 | 1305 | [[package]] 1306 | name = "ws2_32-sys" 1307 | version = "0.2.1" 1308 | source = "registry+https://github.com/rust-lang/crates.io-index" 1309 | dependencies = [ 1310 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 1311 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1312 | ] 1313 | 1314 | [metadata] 1315 | "checksum MacTypes-sys 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eaf9f0d0b1cc33a4d2aee14fb4b2eac03462ef4db29c8ac4057327d8a71ad86f" 1316 | "checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" 1317 | "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" 1318 | "checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71" 1319 | "checksum atlatl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "32bb156841d2e2a888185b5b4f7d93d30efd3a40d1671d9628ab39536adb7ea2" 1320 | "checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" 1321 | "checksum autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a6d640bee2da49f60a4068a7fae53acde8982514ab7bae8b8cea9e88cbcfd799" 1322 | "checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" 1323 | "checksum bincode 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8ab639324e3ee8774d296864fbc0dbbb256cf1a41c490b94cba90c082915f92" 1324 | "checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" 1325 | "checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39" 1326 | "checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb" 1327 | "checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" 1328 | "checksum cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)" = "c9ce8bb087aacff865633f0bd5aeaed910fe2fe55b55f4739527f2e023a2e53d" 1329 | "checksum cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "11d43355396e872eefb45ce6342e4374ed7bc2b3a502d1b28e36d6e23c05d1f4" 1330 | "checksum clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b957d88f4b6a63b9d70d5f454ac8011819c6efa7727858f458ab71c756ce2d3e" 1331 | "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" 1332 | "checksum colored 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6e9a455e156a4271e12fd0246238c380b1e223e3736663c7a18ed8b6362028a9" 1333 | "checksum core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "286e0b41c3a20da26536c6000a280585d519fd07b3956b43aed8a79e9edce980" 1334 | "checksum core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "716c271e8613ace48344f723b60b900a93150271e5be206212d052bbc0883efa" 1335 | "checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" 1336 | "checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" 1337 | "checksum crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18cd2e169ad86297e6bc0ad9aa679aee9daa4f19e8163860faf7c164e4f5a71" 1338 | "checksum crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "04c9e3102cc2d69cd681412141b390abd55a362afc1540965dad0ad4d34280b4" 1339 | "checksum crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b" 1340 | "checksum crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f8306fcef4a7b563b76b7dd949ca48f52bc1141aa067d2ea09565f3e2652aa5c" 1341 | "checksum dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6d301140eb411af13d3115f9a562c85cc6b541ade9dfa314132244aaee7489dd" 1342 | "checksum encoding_rs 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)" = "4155785c79f2f6701f185eb2e6b4caf0555ec03477cb4c70db67b465311620ed" 1343 | "checksum flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f87e68aa82b2de08a6e037f1385455759df6e445a8df5e005b4297191dbf18aa" 1344 | "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" 1345 | "checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 1346 | "checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 1347 | "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" 1348 | "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" 1349 | "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" 1350 | "checksum futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "49e7653e374fe0d0c12de4250f0bdb60680b8c80eed558c5c7538eec9c89e21b" 1351 | "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" 1352 | "checksum h2 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "910a5e7be6283a9c91b3982fa5188368c8719cce2a3cf3b86048673bf9d9c36b" 1353 | "checksum http 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "fe67e3678f2827030e89cc4b9e7ecd16d52f132c0b940ab5005f88e821500f6a" 1354 | "checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83" 1355 | "checksum hyper 0.12.25 (registry+https://github.com/rust-lang/crates.io-index)" = "7d5b6658b016965ae301fa995306db965c93677880ea70765a84235a96eae896" 1356 | "checksum hyper-tls 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3a800d6aa50af4b5850b2b0f659625ce9504df908e9733b635720483be26174f" 1357 | "checksum hyphenation 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0493c6fb308d367d0aed7acd341adbc1c2f216c135073e4b73b652c5d0d6b54c" 1358 | "checksum hyphenation_commons 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9e3461ab51107f7beb8e0c46606d6eb7dfa48880014a29c170afad3ce6b25add" 1359 | "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" 1360 | "checksum indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7e81a7c05f79578dbc15793d8b619db9ba32b4577003ef3af1a91c416798c58d" 1361 | "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" 1362 | "checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" 1363 | "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" 1364 | "checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" 1365 | "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" 1366 | "checksum libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)" = "aab692d7759f5cd8c859e169db98ae5b52c924add2af5fbbca11d12fefb567c1" 1367 | "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" 1368 | "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" 1369 | "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" 1370 | "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" 1371 | "checksum mime 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)" = "3e27ca21f40a310bd06d9031785f4801710d566c184a6e15bad4f1d9b65f9425" 1372 | "checksum mime_guess 2.0.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)" = "30de2e4613efcba1ec63d8133f344076952090c122992a903359be5a4f99c3ed" 1373 | "checksum miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c468f2369f07d651a5d0bb2c9079f8488a66d5466efe42d0c5c6466edcb7f71e" 1374 | "checksum miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b7fe927a42e3807ef71defb191dc87d4e24479b221e67015fe38ae2b7b447bab" 1375 | "checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" 1376 | "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" 1377 | "checksum native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ff8e08de0070bbf4c31f452ea2a70db092f36f6f2e4d897adf5674477d488fb2" 1378 | "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" 1379 | "checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" 1380 | "checksum num-traits 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "d9c79c952a4a139f44a0fe205c4ee66ce239c0e6ce72cd935f5f7e2f717549dd" 1381 | "checksum num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba" 1382 | "checksum openssl 0.10.20 (registry+https://github.com/rust-lang/crates.io-index)" = "5a0d6b781aac4ac1bd6cafe2a2f0ad8c16ae8e1dd5184822a16c50139f8838d9" 1383 | "checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" 1384 | "checksum openssl-src 111.2.1+1.1.1b (registry+https://github.com/rust-lang/crates.io-index)" = "a42e4a28c5a3da4b0df51795aee275b812164c43a690caa871bfa71bf0d52439" 1385 | "checksum openssl-sys 0.9.43 (registry+https://github.com/rust-lang/crates.io-index)" = "33c86834957dd5b915623e94f2f4ab2c70dd8f6b70679824155d5ae21dbd495d" 1386 | "checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" 1387 | "checksum parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" 1388 | "checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" 1389 | "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" 1390 | "checksum phf 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "b3da44b85f8e8dfaec21adae67f95d93244b2ecf6ad2a692320598dcc8e6dd18" 1391 | "checksum phf_codegen 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "b03e85129e324ad4166b06b2c7491ae27fe3ec353af72e72cd1654c7225d517e" 1392 | "checksum phf_generator 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "09364cc93c159b8b06b1f4dd8a4398984503483891b0c26b867cf431fb132662" 1393 | "checksum phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "234f71a15de2288bcb7e3b6515828d22af7ec8598ee6d24c3b526fa0a80b67a0" 1394 | "checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c" 1395 | "checksum pocket-resources 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c135f38778ad324d9e9ee68690bac2c1a51f340fdf96ca13e2ab3914eb2e51d8" 1396 | "checksum proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4d317f9caece796be1980837fd5cb3dfec5613ebdb04ad0956deea83ce168915" 1397 | "checksum quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db" 1398 | "checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" 1399 | "checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" 1400 | "checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" 1401 | "checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" 1402 | "checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" 1403 | "checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" 1404 | "checksum rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b9ea758282efe12823e0d952ddb269d2e1897227e464919a554f2a03ef1b832" 1405 | "checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" 1406 | "checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" 1407 | "checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" 1408 | "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" 1409 | "checksum redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)" = "423e376fffca3dfa06c9e9790a9ccd282fafb3cc6e6397d01dbf64f9bacc6b85" 1410 | "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" 1411 | "checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" 1412 | "checksum reqwest 0.9.12 (registry+https://github.com/rust-lang/crates.io-index)" = "962fa64e670e70b9d3a81c3688832eb59293ef490e0af5ad169763f62016ac5e" 1413 | "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" 1414 | "checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7" 1415 | "checksum schannel 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "f2f6abf258d99c3c1c5c2131d99d064e94b7b3dd5f416483057f308fea253339" 1416 | "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" 1417 | "checksum security-framework 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfab8dda0e7a327c696d893df9ffa19cadc4bd195797997f5223cf5831beaf05" 1418 | "checksum security-framework-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3d6696852716b589dff9e886ff83778bb635150168e83afa8ac6b8a78cb82abc" 1419 | "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" 1420 | "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" 1421 | "checksum serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)" = "92514fb95f900c9b5126e32d020f5c6d40564c27a5ea6d1d7d9f157a96623560" 1422 | "checksum serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)" = "58fc82bec244f168b23d1963b45c8bf5726e9a15a9d146a067f9081aeed2de79" 1423 | "checksum serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)" = "5a23aa71d4a4d43fdbfaac00eff68ba8a06a51759a89ac3304323e800c4dd40d" 1424 | "checksum serde_urlencoded 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d48f9f99cd749a2de71d29da5f948de7f2764cc5a9d7f3c97e3514d4ee6eabf2" 1425 | "checksum siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" 1426 | "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" 1427 | "checksum smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c4488ae950c49d403731982257768f48fada354a5203fe81f9bb6f43ca9002be" 1428 | "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" 1429 | "checksum string 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b639411d0b9c738748b5397d5ceba08e648f4f1992231aa859af1a017f31f60b" 1430 | "checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550" 1431 | "checksum syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)" = "846620ec526c1599c070eff393bfeeeb88a93afa2513fc3b49f1fea84cf7b0ed" 1432 | "checksum tempfile 3.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b86c784c88d98c801132806dadd3819ed29d8600836c4088e855cdf3e178ed8a" 1433 | "checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" 1434 | "checksum textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6" 1435 | "checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" 1436 | "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" 1437 | "checksum tokio 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "1021bb1f4150435ab8f222eb7ed37c60b2d57037def63ba43085a79f387512d7" 1438 | "checksum tokio-current-thread 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c756b04680eea21902a46fca4e9f410a2332c04995af590e07ff262e2193a9a3" 1439 | "checksum tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "30c6dbf2d1ad1de300b393910e8a3aa272b724a400b6531da03eed99e329fbf0" 1440 | "checksum tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926" 1441 | "checksum tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6af16bfac7e112bea8b0442542161bfc41cbfa4466b580bdda7d18cb88b911ce" 1442 | "checksum tokio-sync 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "fda385df506bf7546e70872767f71e81640f1f251bdf2fd8eb81a0eaec5fe022" 1443 | "checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" 1444 | "checksum tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "742e511f6ce2298aeb86fc9ea0d8df81c2388c6ebae3dc8a7316e8c9df0df801" 1445 | "checksum tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2910970404ba6fa78c5539126a9ae2045d62e3713041e447f695f41405a120c6" 1446 | "checksum tokio-trace-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "350c9edade9830dc185ae48ba45667a445ab59f6167ef6d0254ec9d2430d9dd3" 1447 | "checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" 1448 | "checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" 1449 | "checksum unicase 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "41d17211f887da8e4a70a45b9536f26fc5de166b81e2d5d80de4a17fd22553bd" 1450 | "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" 1451 | "checksum unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "141339a08b982d942be2ca06ff8b076563cbe223d1befd5450716790d44e2426" 1452 | "checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526" 1453 | "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" 1454 | "checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" 1455 | "checksum uuid 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0238db0c5b605dd1cf51de0f21766f97fba2645897024461d6a00c036819a768" 1456 | "checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d" 1457 | "checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" 1458 | "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" 1459 | "checksum want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "797464475f30ddb8830cc529aaaae648d581f99e2036a928877dfde027ddf6b3" 1460 | "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" 1461 | "checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" 1462 | "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" 1463 | "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1464 | "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1465 | "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" 1466 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "chit" 3 | version = "0.1.15" 4 | authors = ["Peter Heesterman "] 5 | edition = "2018" 6 | 7 | description = "Crate help in terminal: A tool for looking up details about rust crates without going to crates.io" 8 | repository = "https://github.com/peterheesterman/chit" 9 | readme = "./README.md" 10 | keywords = ["crates", "search", "who", "list"] 11 | categories = ["command-line-utilities"] 12 | license = "MIT" 13 | 14 | [dependencies] 15 | colored = "1.7" 16 | hyphenation = "0.7.1" 17 | reqwest = "0.9" 18 | serde_json = "1.0" 19 | serde = "1.0" 20 | serde_derive = "1.0" 21 | textwrap = { version = "0.11", features = ["hyphenation"] } 22 | clap = '2.32' 23 | openssl = { version = '0.10.11', optional = true } 24 | 25 | [features] 26 | vendored-openssl = ['openssl/vendored'] 27 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Peter Heesterman 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /PROCESSES.md: -------------------------------------------------------------------------------- 1 | 2 | ## Processes 3 | 4 | ### Getting a new versions of chit into the `nixpkgs channel` 5 | - https://github.com/peterheesterman/chit/pull/55#issuecomment-493795822 6 | -------------------------------------------------------------------------------- /PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | **Description:** 2 | 3 | A clear and concise description of what we are changing and why 4 | 5 | **Related Issues: (optional)** 6 | 7 | [list issues here] 8 | 9 | **People: (optional)** 10 | 11 | Tag people here that you think need to see this 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | Chit 4 | 5 |

6 | 7 | [![Build Status](https://dev.azure.com/chitbuilds/chit/_apis/build/status/peterheesterman.chit?branchName=master)](https://dev.azure.com/chitbuilds/chit/_build/latest?definitionId=1&branchName=master) 8 | [![Downloads](https://img.shields.io/crates/d/chit.svg)](https://crates.io/crates/chit) 9 | [![Stars](https://img.shields.io/github/stars/peterheesterman/chit.svg?style=popout 10 | )](https://github.com/peterheesterman/chit/stargazers) 11 | [![Collaborators](https://img.shields.io/github/contributors/peterheesterman/chit.svg)](https://github.com/peterheesterman/chit/graphs/contributors) 12 | 13 | ## Chit: Crate help in terminal 14 | 15 | A command-line tool for looking up details about rust crates without going to crates.io. 16 | 17 | 18 | ### Chit helps answer these questions: 19 | - Who wrote this crate? What else did they write? 20 | - What alternatives are there for this crate? 21 | - How old is this crate? 22 | - What versions are there? When did they come out? 23 | - What are the download numbers over time? 24 | - Should I use this crate? 25 | - How mature is it? 26 | 27 | 28 | ### Installation 29 | 30 | Cargo installed already? `cargo install chit`. 31 | 32 | If not... find out [how to install cargo!](https://doc.rust-lang.org/cargo/getting-started/installation.html) 33 | 34 | #### Nix package manager 35 | 36 | `nix-env -iA nixpkgs.chit` 37 | 38 | ### Use 39 | 40 | `chit rocket` OR `chit --crate=rocket` 41 | 42 | 43 | 44 | `chit versions --crate=hex-buffer-serde` 45 | 46 | 47 | 48 | `chit owners --crate=hex-buffer-serde` 49 | 50 | 51 | 52 | `chit repo --crate=chit` 53 | 54 | 55 | 56 | ## Roadmap: 57 | (Would love Pull requests that build towards these objectives) 58 | - [ ] Tests 59 | - [x] Versions 60 | - [x] Owners 61 | - [ ] Crate details 62 | - [x] Add a CI pipeline that runs the tests 63 | - [x] Make a logo for chit 64 | - [x] Add another command e.g. `chit repo` which might get meta data like stars and collaborator numbers etc 65 | - [ ] Change error handling to use result types 66 | - [ ] Use some more functional programming techniques to cut the code size down 67 | - [ ] distribute through brew, apt-get, etc... 68 | - [ ] expand the repository details returned by the `repo` command 69 | 70 | ## Contributors 71 | See the [fantastic people](https://github.com/peterheesterman/chit/graphs/contributors) who have made chit. 72 | 73 | ## License 74 | This project is licensed under the MIT License - see the [LICENSE.md](./LICENSE.md) file for details 75 | 76 | -------------------------------------------------------------------------------- /alternatives.json: -------------------------------------------------------------------------------- 1 | { 2 | "description": "Index of rust crates that are alternatives to one another", 3 | "sets": [ 4 | { 5 | "name": "orms", 6 | "alternatives": [ 7 | "rustorm", 8 | "diesel" 9 | ] 10 | }, 11 | { 12 | "name": "web frameworks", 13 | "alternatives": [ 14 | "gotham", 15 | "actix-web", 16 | "iron", 17 | "nickel", 18 | "rustful", 19 | "rocket", 20 | "rustless", 21 | "saphir", 22 | "sapper", 23 | "tiny-http", 24 | "rouille", 25 | "tower-web", 26 | "sincere", 27 | "zap" 28 | ] 29 | }, 30 | { 31 | "name": "argument parsers", 32 | "alternatives": [ 33 | "getopts", 34 | "clap", 35 | "docopt", 36 | "pirate" 37 | ] 38 | }, 39 | { 40 | "name": "http requests", 41 | "alternatives": [ 42 | "reqwest", 43 | "hyper", 44 | "curl" 45 | ] 46 | }, 47 | { 48 | "name": "regex", 49 | "alternatives": [ 50 | "regex", 51 | "fancy-regex" 52 | ] 53 | }, 54 | { 55 | "name": "logging", 56 | "alternatives": [ 57 | "env_logger", 58 | "log4rs", 59 | "fern", 60 | "slog", 61 | "pretty_env_logger", 62 | "simplelog", 63 | "syslog" 64 | ] 65 | }, 66 | { 67 | "name": "json", 68 | "alternatives": [ 69 | "serde_json", 70 | "jsonway", 71 | "json" 72 | ] 73 | } 74 | ] 75 | } 76 | -------------------------------------------------------------------------------- /azure-pipelines.yml: -------------------------------------------------------------------------------- 1 | trigger: 2 | branches: 3 | include: 4 | - refs/heads/master 5 | - refs/tags/* 6 | 7 | jobs: 8 | - job: run_rustfmt 9 | displayName: "Run rust fmt" 10 | pool: 11 | vmImage: ubuntu-16.04 12 | steps: 13 | - template: ci/azure-install-rust.yml 14 | - script: | 15 | rustup component add rustfmt 16 | displayName: Install rustfmt 17 | - script: | 18 | cargo fmt --all -- --check 19 | displayName: Check formatting 20 | 21 | - job: run_cargo_test 22 | displayName: "cargo test" 23 | strategy: 24 | matrix: 25 | Linux: 26 | vmImage: ubuntu-16.04 27 | MacOS: 28 | vmImage: macOS-10.13 29 | Windows: 30 | vmImage: vs2017-win2016 31 | pool: 32 | vmImage: $(vmImage) 33 | steps: 34 | - template: ci/azure-install-rust.yml 35 | - script: cargo test 36 | displayName: Cargo test 37 | 38 | - job: create_linux_binary 39 | displayName: "Create release binaries for Linux" 40 | pool: 41 | vmImage: ubuntu-16.04 42 | steps: 43 | - template: ci/azure-install-rust.yml 44 | - script: rustup target add x86_64-unknown-linux-musl 45 | displayName: Add unknown linux target 46 | - script: | 47 | sudo apt update -y 48 | sudo apt install musl-tools -y 49 | displayName: "Install musl-tools" 50 | - script: cargo build --target x86_64-unknown-linux-musl --features vendored-openssl --release 51 | displayName: cargo build 52 | - template: ci/azure-publish-artifact.yml 53 | parameters: 54 | artifacts: target/x86_64-unknown-linux-musl/release 55 | name: dist_linux 56 | 57 | - job: create_windows_binary 58 | displayName: "Create release binaries for Windows" 59 | pool: 60 | vmImage: vs2017-win2016 61 | steps: 62 | - template: ci/azure-install-rust.yml 63 | - script: cargo build --release 64 | displayName: cargo build 65 | - template: ci/azure-publish-artifact.yml 66 | parameters: 67 | name: dist_windows 68 | 69 | - job: create_macOS_binary 70 | displayName: "Create release binaries for MacOS" 71 | pool: 72 | vmImage: macOS-10.13 73 | steps: 74 | - template: ci/azure-install-rust.yml 75 | - script: cargo build --release 76 | env: 77 | MACOSX_DEPLOYMENT_TARGET: 10.7 78 | displayName: cargo build 79 | - template: ci/azure-publish-artifact.yml 80 | parameters: 81 | name: dist_macos 82 | 83 | - job: deploy_release 84 | displayName: "Deploy release" 85 | dependsOn: 86 | - run_rustfmt 87 | - run_cargo_test 88 | - create_linux_binary 89 | - create_windows_binary 90 | - create_macOS_binary 91 | steps: 92 | - task: DownloadPipelineArtifact@0 93 | displayName: "Download release - Linux" 94 | inputs: 95 | artifactName: dist_linux 96 | targetPath: $(System.DefaultWorkingDirectory)/linux 97 | - task: ArchiveFiles@2 98 | displayName: Gather assets Linux 99 | inputs: 100 | rootFolderOrFile: $(System.DefaultWorkingDirectory)/linux/chit 101 | archiveType: 'zip' 102 | archiveFile: $(System.DefaultWorkingDirectory)/x86_64-unknown-linux-musl.zip 103 | - task: DownloadPipelineArtifact@0 104 | displayName: "Download release - Windows" 105 | inputs: 106 | artifactName: dist_windows 107 | targetPath: $(System.DefaultWorkingDirectory)/windows 108 | - task: ArchiveFiles@2 109 | displayName: Gather assets Windows 110 | inputs: 111 | rootFolderOrFile: $(System.DefaultWorkingDirectory)/windows/chit.exe 112 | archiveType: 'zip' 113 | archiveFile: $(System.DefaultWorkingDirectory)/x86_64-pc-windows-msvc.zip 114 | - task: DownloadPipelineArtifact@0 115 | displayName: "Download release - MacOS" 116 | inputs: 117 | artifactName: dist_macos 118 | targetPath: $(System.DefaultWorkingDirectory)/macos 119 | - task: ArchiveFiles@2 120 | displayName: Gather assets MacOS 121 | inputs: 122 | rootFolderOrFile: $(System.DefaultWorkingDirectory)/macos/chit 123 | archiveType: 'zip' 124 | archiveFile: $(System.DefaultWorkingDirectory)/x86_64-apple-darwin.zip 125 | - script: dir 126 | workingDirectory: $(System.DefaultWorkingDirectory) 127 | displayName: List contents of a folder 128 | - script: | 129 | DATE="$(date +%Y-%m-%d)" 130 | echo "##vso[task.setvariable variable=build.date]$DATE" 131 | displayName: "Create date variable" 132 | - script: | 133 | MY_TAG="$(Build.SourceBranch)" 134 | MY_TAG=${MY_TAG#refs/tags/} 135 | echo $MY_TAG 136 | echo "##vso[task.setvariable variable=build.my_tag]$MY_TAG" 137 | displayName: "Create my tag variable" 138 | - task: GithubRelease@0 139 | condition: and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) 140 | inputs: 141 | gitHubConnection: 'peterheesterman' 142 | repositoryName: 'peterheesterman/chit' 143 | action: 'edit' 144 | target: '$(build.sourceVersion)' 145 | tagSource: 'manual' 146 | tag: '$(build.my_tag)' 147 | assets: '$(System.DefaultWorkingDirectory)/*.zip' 148 | title: '$(build.my_tag) - $(build.date)' 149 | assetUploadMode: 'replace' 150 | addChangeLog: false -------------------------------------------------------------------------------- /ci/azure-install-rust.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | rust_version: 'stable' 3 | 4 | steps: 5 | # Linux and macOS. 6 | - script: | 7 | set -e 8 | curl https://sh.rustup.rs -sSf | sh -s -- -y --profile minimal --default-toolchain $RUSTUP_TOOLCHAIN 9 | echo "##vso[task.setvariable variable=PATH;]$PATH:$HOME/.cargo/bin" 10 | env: 11 | RUSTUP_TOOLCHAIN: ${{parameters.rust_version}} 12 | displayName: "Install rust (Linux and macOS.)" 13 | condition: not(eq(variables['Agent.OS'], 'Windows_NT')) 14 | 15 | # Windows. 16 | - script: | 17 | curl -sSf -o rustup-init.exe https://win.rustup.rs 18 | rustup-init.exe -y --profile minimal --default-toolchain %RUSTUP_TOOLCHAIN% 19 | rustup target list 20 | set PATH=%PATH%;%USERPROFILE%\.cargo\bin 21 | echo "##vso[task.setvariable variable=PATH;]%PATH%;%USERPROFILE%\.cargo\bin" 22 | env: 23 | RUSTUP_TOOLCHAIN: ${{parameters.rust_version}} 24 | displayName: "Install rust (Windows)" 25 | condition: eq(variables['Agent.OS'], 'Windows_NT') 26 | 27 | # All platforms. 28 | - script: | 29 | rustc -Vv 30 | cargo -V 31 | displayName: Query rust and cargo versions -------------------------------------------------------------------------------- /ci/azure-publish-artifact.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | artifacts: 'target/release' 3 | name: '' 4 | 5 | steps: 6 | - bash: | 7 | set -ex 8 | dst=$BUILD_ARTIFACTSTAGINGDIRECTORY 9 | rm -f ${{ parameters.artifacts }}/chit*.d 10 | rm -f ${{ parameters.artifacts }}/chit*.pdb 11 | cp ${{ parameters.artifacts }}/chit* $dst/ 12 | displayName: Create artifacts 13 | - task: PublishPipelineArtifact@0 14 | inputs: 15 | artifactName: ${{ parameters.name }} 16 | targetPath: '$(Build.ArtifactStagingDirectory)' -------------------------------------------------------------------------------- /readme-images/chit-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peterheesterman/chit/ccdb44da44da72d9e5b5e31c9e3b7df5b8cf1b04/readme-images/chit-logo.png -------------------------------------------------------------------------------- /readme-images/chit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peterheesterman/chit/ccdb44da44da72d9e5b5e31c9e3b7df5b8cf1b04/readme-images/chit.png -------------------------------------------------------------------------------- /readme-images/owners.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peterheesterman/chit/ccdb44da44da72d9e5b5e31c9e3b7df5b8cf1b04/readme-images/owners.png -------------------------------------------------------------------------------- /readme-images/repo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peterheesterman/chit/ccdb44da44da72d9e5b5e31c9e3b7df5b8cf1b04/readme-images/repo.png -------------------------------------------------------------------------------- /readme-images/versions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peterheesterman/chit/ccdb44da44da72d9e5b5e31c9e3b7df5b8cf1b04/readme-images/versions.png -------------------------------------------------------------------------------- /research/crate.json: -------------------------------------------------------------------------------- 1 | { 2 | "crate": { 3 | "id": "steg", 4 | "name": "steg", 5 | "updated_at": "2018-11-01T05:34:49.325586+00:00", 6 | "versions": [115563, 114994, 114844, 114843, 114792, 114015], 7 | "keywords": ["reveal", "hide", "steganography", "steg"], 8 | "categories": ["command-line-utilities", "text-processing", "encoding", "multimedia::images"], 9 | "badges": [], 10 | "created_at": "2018-10-22T19:15:53.475385+00:00", 11 | "downloads": 300, 12 | "recent_downloads": 78, 13 | "max_version": "0.1.5", 14 | "description": "Command line steganography tool", 15 | "homepage": null, 16 | "documentation": null, 17 | "repository": "https://github.com/peterheesterman/lsb_png_steganography", 18 | "links": { 19 | "version_downloads": "/api/v1/crates/steg/downloads", 20 | "versions": null, 21 | "owners": "/api/v1/crates/steg/owners", 22 | "owner_team": "/api/v1/crates/steg/owner_team", 23 | "owner_user": "/api/v1/crates/steg/owner_user", 24 | "reverse_dependencies": "/api/v1/crates/steg/reverse_dependencies" 25 | }, 26 | "exact_match": false 27 | }, 28 | "versions": [{ 29 | "id": 115563, 30 | "crate": "steg", 31 | "num": "0.1.5", 32 | "dl_path": "/api/v1/crates/steg/0.1.5/download", 33 | "readme_path": "/api/v1/crates/steg/0.1.5/readme", 34 | "updated_at": "2018-11-01T05:34:49.325586+00:00", 35 | "created_at": "2018-11-01T05:34:49.325586+00:00", 36 | "downloads": 64, 37 | "features": {}, 38 | "yanked": false, 39 | "license": "MIT", 40 | "links": { 41 | "dependencies": "/api/v1/crates/steg/0.1.5/dependencies", 42 | "version_downloads": "/api/v1/crates/steg/0.1.5/downloads", 43 | "authors": "/api/v1/crates/steg/0.1.5/authors" 44 | }, 45 | "crate_size": 30087, 46 | "published_by": null 47 | }, { 48 | "id": 114994, 49 | "crate": "steg", 50 | "num": "0.1.4", 51 | "dl_path": "/api/v1/crates/steg/0.1.4/download", 52 | "readme_path": "/api/v1/crates/steg/0.1.4/readme", 53 | "updated_at": "2018-10-29T05:21:08.781552+00:00", 54 | "created_at": "2018-10-29T05:21:08.781552+00:00", 55 | "downloads": 49, 56 | "features": {}, 57 | "yanked": false, 58 | "license": "MIT", 59 | "links": { 60 | "dependencies": "/api/v1/crates/steg/0.1.4/dependencies", 61 | "version_downloads": "/api/v1/crates/steg/0.1.4/downloads", 62 | "authors": "/api/v1/crates/steg/0.1.4/authors" 63 | }, 64 | "crate_size": 20815, 65 | "published_by": null 66 | }, { 67 | "id": 114844, 68 | "crate": "steg", 69 | "num": "0.1.3", 70 | "dl_path": "/api/v1/crates/steg/0.1.3/download", 71 | "readme_path": "/api/v1/crates/steg/0.1.3/readme", 72 | "updated_at": "2018-10-28T08:14:10.434107+00:00", 73 | "created_at": "2018-10-28T08:14:10.434107+00:00", 74 | "downloads": 42, 75 | "features": {}, 76 | "yanked": false, 77 | "license": "MIT", 78 | "links": { 79 | "dependencies": "/api/v1/crates/steg/0.1.3/dependencies", 80 | "version_downloads": "/api/v1/crates/steg/0.1.3/downloads", 81 | "authors": "/api/v1/crates/steg/0.1.3/authors" 82 | }, 83 | "crate_size": 17457, 84 | "published_by": null 85 | }, { 86 | "id": 114843, 87 | "crate": "steg", 88 | "num": "0.1.2", 89 | "dl_path": "/api/v1/crates/steg/0.1.2/download", 90 | "readme_path": "/api/v1/crates/steg/0.1.2/readme", 91 | "updated_at": "2018-10-28T08:07:00.934295+00:00", 92 | "created_at": "2018-10-28T08:07:00.934295+00:00", 93 | "downloads": 48, 94 | "features": {}, 95 | "yanked": false, 96 | "license": "MIT", 97 | "links": { 98 | "dependencies": "/api/v1/crates/steg/0.1.2/dependencies", 99 | "version_downloads": "/api/v1/crates/steg/0.1.2/downloads", 100 | "authors": "/api/v1/crates/steg/0.1.2/authors" 101 | }, 102 | "crate_size": 17421, 103 | "published_by": null 104 | }, { 105 | "id": 114792, 106 | "crate": "steg", 107 | "num": "0.1.1", 108 | "dl_path": "/api/v1/crates/steg/0.1.1/download", 109 | "readme_path": "/api/v1/crates/steg/0.1.1/readme", 110 | "updated_at": "2018-10-27T20:50:25.425671+00:00", 111 | "created_at": "2018-10-27T20:50:25.425671+00:00", 112 | "downloads": 48, 113 | "features": {}, 114 | "yanked": false, 115 | "license": "MIT", 116 | "links": { 117 | "dependencies": "/api/v1/crates/steg/0.1.1/dependencies", 118 | "version_downloads": "/api/v1/crates/steg/0.1.1/downloads", 119 | "authors": "/api/v1/crates/steg/0.1.1/authors" 120 | }, 121 | "crate_size": 15590, 122 | "published_by": null 123 | }, { 124 | "id": 114015, 125 | "crate": "steg", 126 | "num": "0.1.0", 127 | "dl_path": "/api/v1/crates/steg/0.1.0/download", 128 | "readme_path": "/api/v1/crates/steg/0.1.0/readme", 129 | "updated_at": "2018-10-22T19:15:53.475385+00:00", 130 | "created_at": "2018-10-22T19:15:53.475385+00:00", 131 | "downloads": 49, 132 | "features": {}, 133 | "yanked": false, 134 | "license": "MIT", 135 | "links": { 136 | "dependencies": "/api/v1/crates/steg/0.1.0/dependencies", 137 | "version_downloads": "/api/v1/crates/steg/0.1.0/downloads", 138 | "authors": "/api/v1/crates/steg/0.1.0/authors" 139 | }, 140 | "crate_size": 15470, 141 | "published_by": null 142 | }], 143 | "keywords": [{ 144 | "id": "reveal", 145 | "keyword": "reveal", 146 | "created_at": "2018-10-22T19:15:53.475385+00:00", 147 | "crates_cnt": 2 148 | }, { 149 | "id": "hide", 150 | "keyword": "hide", 151 | "created_at": "2018-10-22T19:15:53.475385+00:00", 152 | "crates_cnt": 2 153 | }, { 154 | "id": "steganography", 155 | "keyword": "steganography", 156 | "created_at": "2017-04-18T04:18:50.699753+00:00", 157 | "crates_cnt": 8 158 | }, { 159 | "id": "steg", 160 | "keyword": "steg", 161 | "created_at": "2018-10-21T21:21:42.742758+00:00", 162 | "crates_cnt": 5 163 | }], 164 | "categories": [{ 165 | "id": "command-line-utilities", 166 | "category": "Command line utilities", 167 | "slug": "command-line-utilities", 168 | "description": "Applications to run at the command line.", 169 | "created_at": "2017-01-17T19:13:05.112025+00:00", 170 | "crates_cnt": 694 171 | }, { 172 | "id": "text-processing", 173 | "category": "Text processing", 174 | "slug": "text-processing", 175 | "description": "Crates to deal with the complexities of human language when expressed in textual form.", 176 | "created_at": "2017-01-17T19:13:05.112025+00:00", 177 | "crates_cnt": 216 178 | }, { 179 | "id": "encoding", 180 | "category": "Encoding", 181 | "slug": "encoding", 182 | "description": "Encoding and/or decoding data from one data format to another.", 183 | "created_at": "2017-01-17T19:13:05.112025+00:00", 184 | "crates_cnt": 338 185 | }, { 186 | "id": "multimedia::images", 187 | "category": "Images", 188 | "slug": "multimedia::images", 189 | "description": "Crates that process or build images.\n", 190 | "created_at": "2017-01-17T19:13:05.112025+00:00", 191 | "crates_cnt": 77 192 | }] 193 | } -------------------------------------------------------------------------------- /research/crates_of_user.json: -------------------------------------------------------------------------------- 1 | { 2 | "crates": [{ 3 | "id": "chit", 4 | "name": "chit", 5 | "updated_at": "2019-03-24T04:24:34.120232+00:00", 6 | "versions": null, 7 | "keywords": null, 8 | "categories": null, 9 | "badges": [], 10 | "created_at": "2019-03-21T05:09:55.767680+00:00", 11 | "downloads": 24, 12 | "recent_downloads": 24, 13 | "max_version": "0.0.2", 14 | "description": "A tool for looking up details about crates without going to crates.io", 15 | "homepage": null, 16 | "documentation": null, 17 | "repository": "https://github.com/peterheesterman/chit", 18 | "links": { 19 | "version_downloads": "/api/v1/crates/chit/downloads", 20 | "versions": "/api/v1/crates/chit/versions", 21 | "owners": "/api/v1/crates/chit/owners", 22 | "owner_team": "/api/v1/crates/chit/owner_team", 23 | "owner_user": "/api/v1/crates/chit/owner_user", 24 | "reverse_dependencies": "/api/v1/crates/chit/reverse_dependencies" 25 | }, 26 | "exact_match": false 27 | }, { 28 | "id": "lsb_png_steganography", 29 | "name": "lsb_png_steganography", 30 | "updated_at": "2018-10-21T21:21:42.742758+00:00", 31 | "versions": null, 32 | "keywords": null, 33 | "categories": null, 34 | "badges": [], 35 | "created_at": "2018-10-21T21:21:42.742758+00:00", 36 | "downloads": 78, 37 | "recent_downloads": 22, 38 | "max_version": "0.1.0", 39 | "description": "Least significant bit portable network graphic steganography", 40 | "homepage": null, 41 | "documentation": null, 42 | "repository": "https://github.com/peterheesterman/lsb_png_steganography", 43 | "links": { 44 | "version_downloads": "/api/v1/crates/lsb_png_steganography/downloads", 45 | "versions": "/api/v1/crates/lsb_png_steganography/versions", 46 | "owners": "/api/v1/crates/lsb_png_steganography/owners", 47 | "owner_team": "/api/v1/crates/lsb_png_steganography/owner_team", 48 | "owner_user": "/api/v1/crates/lsb_png_steganography/owner_user", 49 | "reverse_dependencies": "/api/v1/crates/lsb_png_steganography/reverse_dependencies" 50 | }, 51 | "exact_match": false 52 | }, { 53 | "id": "lsb_text_png_steganography", 54 | "name": "lsb_text_png_steganography", 55 | "updated_at": "2018-11-01T05:41:12.711151+00:00", 56 | "versions": null, 57 | "keywords": null, 58 | "categories": null, 59 | "badges": [], 60 | "created_at": "2018-10-27T20:40:53.411012+00:00", 61 | "downloads": 160, 62 | "recent_downloads": 35, 63 | "max_version": "0.1.2", 64 | "description": "A steganography strategy that uses the least significant bits of a png to hide text", 65 | "homepage": null, 66 | "documentation": null, 67 | "repository": "https://github.com/peterheesterman/lsb_text_png_steganography", 68 | "links": { 69 | "version_downloads": "/api/v1/crates/lsb_text_png_steganography/downloads", 70 | "versions": "/api/v1/crates/lsb_text_png_steganography/versions", 71 | "owners": "/api/v1/crates/lsb_text_png_steganography/owners", 72 | "owner_team": "/api/v1/crates/lsb_text_png_steganography/owner_team", 73 | "owner_user": "/api/v1/crates/lsb_text_png_steganography/owner_user", 74 | "reverse_dependencies": "/api/v1/crates/lsb_text_png_steganography/reverse_dependencies" 75 | }, 76 | "exact_match": false 77 | }, { 78 | "id": "ree", 79 | "name": "ree", 80 | "updated_at": "2019-03-16T17:31:59.567732+00:00", 81 | "versions": null, 82 | "keywords": null, 83 | "categories": null, 84 | "badges": [], 85 | "created_at": "2019-03-14T08:27:42.764994+00:00", 86 | "downloads": 32, 87 | "recent_downloads": 32, 88 | "max_version": "0.0.2", 89 | "description": "Prints out depth-indented listing of files in a folder", 90 | "homepage": null, 91 | "documentation": null, 92 | "repository": "https://github.com/peterheesterman/ree", 93 | "links": { 94 | "version_downloads": "/api/v1/crates/ree/downloads", 95 | "versions": "/api/v1/crates/ree/versions", 96 | "owners": "/api/v1/crates/ree/owners", 97 | "owner_team": "/api/v1/crates/ree/owner_team", 98 | "owner_user": "/api/v1/crates/ree/owner_user", 99 | "reverse_dependencies": "/api/v1/crates/ree/reverse_dependencies" 100 | }, 101 | "exact_match": false 102 | }, { 103 | "id": "steg", 104 | "name": "steg", 105 | "updated_at": "2018-11-01T05:34:49.325586+00:00", 106 | "versions": null, 107 | "keywords": null, 108 | "categories": null, 109 | "badges": [], 110 | "created_at": "2018-10-22T19:15:53.475385+00:00", 111 | "downloads": 302, 112 | "recent_downloads": 41, 113 | "max_version": "0.1.5", 114 | "description": "Command line steganography tool", 115 | "homepage": null, 116 | "documentation": null, 117 | "repository": "https://github.com/peterheesterman/lsb_png_steganography", 118 | "links": { 119 | "version_downloads": "/api/v1/crates/steg/downloads", 120 | "versions": "/api/v1/crates/steg/versions", 121 | "owners": "/api/v1/crates/steg/owners", 122 | "owner_team": "/api/v1/crates/steg/owner_team", 123 | "owner_user": "/api/v1/crates/steg/owner_user", 124 | "reverse_dependencies": "/api/v1/crates/steg/reverse_dependencies" 125 | }, 126 | "exact_match": false 127 | }, { 128 | "id": "stegray", 129 | "name": "stegray", 130 | "updated_at": "2018-11-03T06:13:11.825655+00:00", 131 | "versions": null, 132 | "keywords": null, 133 | "categories": null, 134 | "badges": [], 135 | "created_at": "2018-11-03T06:13:11.825655+00:00", 136 | "downloads": 51, 137 | "recent_downloads": 15, 138 | "max_version": "0.0.1", 139 | "description": "Data type for steg the command line steganography tool", 140 | "homepage": null, 141 | "documentation": null, 142 | "repository": "https://github.com/peterheesterman/stegray", 143 | "links": { 144 | "version_downloads": "/api/v1/crates/stegray/downloads", 145 | "versions": "/api/v1/crates/stegray/versions", 146 | "owners": "/api/v1/crates/stegray/owners", 147 | "owner_team": "/api/v1/crates/stegray/owner_team", 148 | "owner_user": "/api/v1/crates/stegray/owner_user", 149 | "reverse_dependencies": "/api/v1/crates/stegray/reverse_dependencies" 150 | }, 151 | "exact_match": false 152 | }, { 153 | "id": "whitespace_text_steganography", 154 | "name": "whitespace_text_steganography", 155 | "updated_at": "2018-10-29T05:17:50.707488+00:00", 156 | "versions": null, 157 | "keywords": null, 158 | "categories": null, 159 | "badges": [], 160 | "created_at": "2018-10-23T08:21:29.714214+00:00", 161 | "downloads": 330, 162 | "recent_downloads": 44, 163 | "max_version": "0.2.1", 164 | "description": "A steganography strategy that uses whitespace to hide text in other text", 165 | "homepage": null, 166 | "documentation": null, 167 | "repository": "https://github.com/peterheesterman/whitespace_text_steganography", 168 | "links": { 169 | "version_downloads": "/api/v1/crates/whitespace_text_steganography/downloads", 170 | "versions": "/api/v1/crates/whitespace_text_steganography/versions", 171 | "owners": "/api/v1/crates/whitespace_text_steganography/owners", 172 | "owner_team": "/api/v1/crates/whitespace_text_steganography/owner_team", 173 | "owner_user": "/api/v1/crates/whitespace_text_steganography/owner_user", 174 | "reverse_dependencies": "/api/v1/crates/whitespace_text_steganography/reverse_dependencies" 175 | }, 176 | "exact_match": false 177 | }], 178 | "meta": { 179 | "total": 7 180 | } 181 | } -------------------------------------------------------------------------------- /research/github.json: -------------------------------------------------------------------------------- 1 | { 2 | "archive_url": "https://api.github.com/repos/peterheesterman/chit/{archive_format}{/ref}", 3 | "archived": false, 4 | "assignees_url": "https://api.github.com/repos/peterheesterman/chit/assignees{/user}", 5 | "blobs_url": "https://api.github.com/repos/peterheesterman/chit/git/blobs{/sha}", 6 | "branches_url": "https://api.github.com/repos/peterheesterman/chit/branches{/branch}", 7 | "clone_url": "https://github.com/peterheesterman/chit.git", 8 | "collaborators_url": "https://api.github.com/repos/peterheesterman/chit/collaborators{/collaborator}", 9 | "comments_url": "https://api.github.com/repos/peterheesterman/chit/comments{/number}", 10 | "commits_url": "https://api.github.com/repos/peterheesterman/chit/commits{/sha}", 11 | "compare_url": "https://api.github.com/repos/peterheesterman/chit/compare/{base}...{head}", 12 | "contents_url": "https://api.github.com/repos/peterheesterman/chit/contents/{+path}", 13 | "contributors_url": "https://api.github.com/repos/peterheesterman/chit/contributors", 14 | "created_at": "2019-03-21T02:54:45Z", 15 | "default_branch": "master", 16 | "deployments_url": "https://api.github.com/repos/peterheesterman/chit/deployments", 17 | "description": "Crate help in terminal: A tool for looking up details about rust crates without going to crates.io", 18 | "disabled": false, 19 | "downloads_url": "https://api.github.com/repos/peterheesterman/chit/downloads", 20 | "events_url": "https://api.github.com/repos/peterheesterman/chit/events", 21 | "fork": false, 22 | "forks": 6, 23 | "forks_count": 6, 24 | "forks_url": "https://api.github.com/repos/peterheesterman/chit/forks", 25 | "full_name": "peterheesterman/chit", 26 | "git_commits_url": "https://api.github.com/repos/peterheesterman/chit/git/commits{/sha}", 27 | "git_refs_url": "https://api.github.com/repos/peterheesterman/chit/git/refs{/sha}", 28 | "git_tags_url": "https://api.github.com/repos/peterheesterman/chit/git/tags{/sha}", 29 | "git_url": "git://github.com/peterheesterman/chit.git", 30 | "has_downloads": true, 31 | "has_issues": true, 32 | "has_pages": false, 33 | "has_projects": false, 34 | "has_wiki": true, 35 | "homepage": "", 36 | "hooks_url": "https://api.github.com/repos/peterheesterman/chit/hooks", 37 | "html_url": "https://github.com/peterheesterman/chit", 38 | "id": 176858126, 39 | "issue_comment_url": "https://api.github.com/repos/peterheesterman/chit/issues/comments{/number}", 40 | "issue_events_url": "https://api.github.com/repos/peterheesterman/chit/issues/events{/number}", 41 | "issues_url": "https://api.github.com/repos/peterheesterman/chit/issues{/number}", 42 | "keys_url": "https://api.github.com/repos/peterheesterman/chit/keys{/key_id}", 43 | "labels_url": "https://api.github.com/repos/peterheesterman/chit/labels{/name}", 44 | "language": "Rust", 45 | "languages_url": "https://api.github.com/repos/peterheesterman/chit/languages", 46 | "license": { 47 | "key": "mit", 48 | "name": "MIT License", 49 | "node_id": "MDc6TGljZW5zZTEz", 50 | "spdx_id": "MIT", 51 | "url": "https://api.github.com/licenses/mit" 52 | }, 53 | "merges_url": "https://api.github.com/repos/peterheesterman/chit/merges", 54 | "milestones_url": "https://api.github.com/repos/peterheesterman/chit/milestones{/number}", 55 | "mirror_url": null, 56 | "name": "chit", 57 | "network_count": 6, 58 | "node_id": "MDEwOlJlcG9zaXRvcnkxNzY4NTgxMjY=", 59 | "notifications_url": "https://api.github.com/repos/peterheesterman/chit/notifications{?since,all,participating}", 60 | "open_issues": 2, 61 | "open_issues_count": 2, 62 | "owner": { 63 | "avatar_url": "https://avatars2.githubusercontent.com/u/16065728?v=4", 64 | "events_url": "https://api.github.com/users/peterheesterman/events{/privacy}", 65 | "followers_url": "https://api.github.com/users/peterheesterman/followers", 66 | "following_url": "https://api.github.com/users/peterheesterman/following{/other_user}", 67 | "gists_url": "https://api.github.com/users/peterheesterman/gists{/gist_id}", 68 | "gravatar_id": "", 69 | "html_url": "https://github.com/peterheesterman", 70 | "id": 16065728, 71 | "login": "peterheesterman", 72 | "node_id": "MDQ6VXNlcjE2MDY1NzI4", 73 | "organizations_url": "https://api.github.com/users/peterheesterman/orgs", 74 | "received_events_url": "https://api.github.com/users/peterheesterman/received_events", 75 | "repos_url": "https://api.github.com/users/peterheesterman/repos", 76 | "site_admin": false, 77 | "starred_url": "https://api.github.com/users/peterheesterman/starred{/owner}{/repo}", 78 | "subscriptions_url": "https://api.github.com/users/peterheesterman/subscriptions", 79 | "type": "User", 80 | "url": "https://api.github.com/users/peterheesterman" 81 | }, 82 | "private": false, 83 | "pulls_url": "https://api.github.com/repos/peterheesterman/chit/pulls{/number}", 84 | "pushed_at": "2019-05-11T19:28:52Z", 85 | "releases_url": "https://api.github.com/repos/peterheesterman/chit/releases{/id}", 86 | "size": 1734, 87 | "ssh_url": "git@github.com:peterheesterman/chit.git", 88 | "stargazers_count": 13, 89 | "stargazers_url": "https://api.github.com/repos/peterheesterman/chit/stargazers", 90 | "statuses_url": "https://api.github.com/repos/peterheesterman/chit/statuses/{sha}", 91 | "subscribers_count": 2, 92 | "subscribers_url": "https://api.github.com/repos/peterheesterman/chit/subscribers", 93 | "subscription_url": "https://api.github.com/repos/peterheesterman/chit/subscription", 94 | "svn_url": "https://github.com/peterheesterman/chit", 95 | "tags_url": "https://api.github.com/repos/peterheesterman/chit/tags", 96 | "teams_url": "https://api.github.com/repos/peterheesterman/chit/teams", 97 | "trees_url": "https://api.github.com/repos/peterheesterman/chit/git/trees{/sha}", 98 | "updated_at": "2019-05-07T10:20:06Z", 99 | "url": "https://api.github.com/repos/peterheesterman/chit", 100 | "watchers": 13, 101 | "watchers_count": 13 102 | } 103 | -------------------------------------------------------------------------------- /research/owners.json: -------------------------------------------------------------------------------- 1 | { 2 | "users": [{ 3 | "avatar": "https://avatars2.githubusercontent.com/u/16065728?v=4", 4 | "id": 28804, 5 | "kind": "user", 6 | "login": "peterheesterman", 7 | "name": "Peter Heesterman", 8 | "url": "https://github.com/peterheesterman" 9 | }] 10 | } 11 | -------------------------------------------------------------------------------- /research/research.md: -------------------------------------------------------------------------------- 1 | 2 | ## Endpoints 3 | 4 | - versions https://crates.io/api/v1/crates/[crate name] 5 | - owners https://crates.io/api/v1/crates/[crate name]/owners 6 | - crates_of_user https://crates.io/api/v1/crates?page=1&per_page=10&sort=alpha&user_id=28804 -------------------------------------------------------------------------------- /src/chit/details/alternatives/mod.rs: -------------------------------------------------------------------------------- 1 | use std::error::Error; 2 | use std::fmt; 3 | use std::io::Read; 4 | 5 | #[derive(Serialize, Deserialize)] 6 | pub struct AlternativesSet { 7 | pub name: String, 8 | pub alternatives: Vec, 9 | } 10 | 11 | #[derive(Serialize, Deserialize)] 12 | pub struct Alternatives { 13 | pub description: String, 14 | pub sets: Vec, 15 | } 16 | 17 | #[derive(Debug)] 18 | pub enum RetrieveAlternativesError { 19 | ParseError(serde_json::Error), 20 | ConnectionError(reqwest::Error), 21 | ReadError(std::io::Error), 22 | } 23 | 24 | impl fmt::Display for RetrieveAlternativesError { 25 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 26 | match self { 27 | RetrieveAlternativesError::ParseError(err) => write!(f, "Parse error: {}", err), 28 | RetrieveAlternativesError::ReadError(err) => write!(f, "Read error: {}", err), 29 | RetrieveAlternativesError::ConnectionError(err) => { 30 | write!(f, "Connection error: {}", err) 31 | } 32 | } 33 | } 34 | } 35 | 36 | // This is important for other errors to wrap this one. 37 | impl Error for RetrieveAlternativesError { 38 | fn description(&self) -> &str { 39 | match self { 40 | RetrieveAlternativesError::ParseError(err) => err.description(), 41 | RetrieveAlternativesError::ReadError(err) => err.description(), 42 | RetrieveAlternativesError::ConnectionError(err) => err.description(), 43 | } 44 | } 45 | 46 | fn cause(&self) -> Option<&dyn Error> { 47 | // Generic error, underlying cause isn't tracked. 48 | Some(match self { 49 | RetrieveAlternativesError::ParseError(err) => err, 50 | RetrieveAlternativesError::ReadError(err) => err, 51 | RetrieveAlternativesError::ConnectionError(err) => err, 52 | }) 53 | } 54 | } 55 | 56 | impl From for RetrieveAlternativesError { 57 | fn from(item: reqwest::Error) -> Self { 58 | RetrieveAlternativesError::ConnectionError(item) 59 | } 60 | } 61 | 62 | impl From for RetrieveAlternativesError { 63 | fn from(item: serde_json::Error) -> Self { 64 | RetrieveAlternativesError::ParseError(item) 65 | } 66 | } 67 | 68 | impl From for RetrieveAlternativesError { 69 | fn from(item: std::io::Error) -> Self { 70 | RetrieveAlternativesError::ReadError(item) 71 | } 72 | } 73 | 74 | const ALTERNATIVES_URL: &str = 75 | "https://raw.githubusercontent.com/peterheesterman/chit/master/alternatives.json"; 76 | 77 | pub fn get_alternatives() -> Result { 78 | let mut res = reqwest::get(ALTERNATIVES_URL)?; 79 | 80 | let mut res_body = String::new(); 81 | 82 | res.read_to_string(&mut res_body)?; 83 | 84 | let alternatives: Alternatives = serde_json::from_str(&res_body)?; 85 | 86 | Ok(alternatives) 87 | } 88 | 89 | #[cfg(test)] 90 | mod tests { 91 | use super::*; 92 | 93 | const ALTERNATIVES_JSON: &str = include_str!("../../../../alternatives.json"); 94 | /// Tests if the alternatives.json file in the root of this crate can be parsed. 95 | #[test] 96 | fn can_parse_alternatives() { 97 | let alternatives: Alternatives = 98 | serde_json::from_str(&ALTERNATIVES_JSON).expect("Alternative parsing failed"); 99 | assert_ne!(alternatives.sets.len(), 0) 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /src/chit/details/mod.rs: -------------------------------------------------------------------------------- 1 | use colored::*; 2 | 3 | use super::extract; 4 | use super::format; 5 | use super::sources::crates; 6 | use super::sources::get; 7 | 8 | mod alternatives; 9 | 10 | pub fn print_details(crate_name: String) { 11 | let mut width = format::get_width(); 12 | println!( 13 | "{} {}...", 14 | "Searching for".magenta(), 15 | &crate_name.bright_blue() 16 | ); 17 | 18 | match get(crates::url(&crate_name)) { 19 | Some(crate_json) => { 20 | if let Some(fields) = extract::package::fields(crate_json) { 21 | // Asume repository is the longest field 22 | let repository_details = format!("Repository: {}", &fields.repository); 23 | 24 | let keywords = format!("Keywords: {}", fields.keywords.join(", ")); 25 | let categories = format!("Categories: {}", fields.categories.join(", ")); 26 | 27 | let large_widths: Vec = vec![ 28 | width, 29 | repository_details.len(), 30 | keywords.len(), 31 | categories.len(), 32 | ]; 33 | 34 | width = *large_widths.iter().max().unwrap(); 35 | 36 | println!("{}", format::title_bar(width, &crate_name)); 37 | 38 | // Description 39 | format::bounded_print(width, &fields.description); 40 | 41 | println!(""); 42 | // Rating 43 | let rating = extract::package::calculate_rating(&fields); 44 | format::print_rating(rating); 45 | 46 | // Download count 47 | if let Some(download_count) = fields.downloads { 48 | format::print(format!("Total downloads: {}", download_count)); 49 | } 50 | 51 | if let Some(recent_downloads) = fields.recent_downloads { 52 | format::print(format!("Recent downloads: {}", recent_downloads)); 53 | } 54 | 55 | let recent_version = &fields.versions[0]; 56 | format::print(format!( 57 | "Latest version: {} ({})", 58 | recent_version.semver, recent_version.date 59 | )); 60 | 61 | format::print(format!("Docs: {}", fields.documentation)); 62 | 63 | format::print(repository_details); 64 | 65 | format::print(format!( 66 | "Crates.io: https://crates.io/crates/{}", 67 | &crate_name 68 | )); 69 | 70 | format::print(format!("License: {}", recent_version.license)); 71 | 72 | if let Some(size) = recent_version.size_in_bytes { 73 | format::print(format!( 74 | "Crate size: {} kB", 75 | (size as f64 / 1000_f64).round() 76 | )); 77 | } 78 | 79 | // IDEA: Clean this up by making it less imperative and into another file 80 | let mut found_alternative = false; 81 | let alternatives = alternatives::get_alternatives(); 82 | 83 | match alternatives { 84 | Ok(alternatives) => { 85 | for i in 0..alternatives.sets.len() { 86 | let set = &alternatives.sets[i]; 87 | 88 | if !set.alternatives.iter().any(|x| x == &crate_name) { 89 | continue; 90 | } 91 | 92 | let mut alternatives = set.alternatives.clone(); 93 | alternatives.retain(|x| *x != crate_name); 94 | let list_line = format!("Alternatives: {}", alternatives.join(", ")); 95 | format::bounded_print(width, &list_line); 96 | found_alternative = true; 97 | } 98 | 99 | if !found_alternative { 100 | format::print( 101 | "Alternatives: None listed - Know one? Make a PR!".to_string(), 102 | ); 103 | } 104 | } 105 | Err(err) => { 106 | format::print(format!("Error retrieving alternatives because: {}", err)); 107 | } 108 | } 109 | 110 | format::print(keywords); 111 | format::print(categories); 112 | } 113 | } 114 | None => { 115 | println!("{} {}", "Failed".red(), "to find that crate".magenta()); 116 | return; 117 | } 118 | } 119 | 120 | match get(crates::owners_url(&crate_name)) { 121 | Some(crate_owners_json) => { 122 | let owners_names: Vec = crate_owners_json["users"] 123 | .as_array() 124 | .unwrap() 125 | .iter() 126 | .filter(|json| json["kind"] == "user") 127 | .map(|json| format::remove_quotes(json["name"].to_string())) 128 | .collect(); 129 | let multiple = owners_names.len() > 1; 130 | 131 | let owners_names = owners_names.join(", "); 132 | 133 | // Owners 134 | format::bounded_print( 135 | width, 136 | &format!("Owner{}: {}", if multiple { "s" } else { "" }, owners_names), 137 | ); 138 | } 139 | None => println!("Failed to get crate owner details"), 140 | } 141 | 142 | println!("{}", format::end_bar(width)); 143 | } 144 | -------------------------------------------------------------------------------- /src/chit/extract/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod owners; 2 | pub mod package; 3 | pub mod repo; 4 | -------------------------------------------------------------------------------- /src/chit/extract/owners.rs: -------------------------------------------------------------------------------- 1 | use super::super::format; 2 | 3 | #[derive(Debug, Clone)] 4 | pub struct AuthoredCrates { 5 | pub authored_crates: Vec, 6 | } 7 | 8 | pub fn fields(json: serde_json::value::Value) -> Option { 9 | if let Some(crates) = json["crates"].as_array() { 10 | let authored_crates = crates 11 | .into_iter() 12 | .map(|package| return format::remove_quotes(package["id"].to_string())) 13 | .collect(); 14 | 15 | Some(AuthoredCrates { authored_crates }) 16 | } else { 17 | None 18 | } 19 | } 20 | 21 | #[cfg(test)] 22 | mod tests { 23 | use super::*; 24 | use serde_json::json; 25 | 26 | #[test] 27 | fn can_get_owners_fields() { 28 | let json = json!({ 29 | "crates": [{ 30 | "id": "chit", 31 | "name": "chit", 32 | "links": { 33 | "owner_user": "/api/v1/crates/chit/owner_user", 34 | "reverse_dependencies": "/api/v1/crates/chit/reverse_dependencies" 35 | } 36 | }, { 37 | "id": "lsb_png_steganography", 38 | "name": "lsb_png_steganography", 39 | "links": { 40 | "owner_user": "/api/v1/crates/lsb_png_steganography/owner_user", 41 | "reverse_dependencies": "/api/v1/crates/lsb_png_steganography/reverse_dependencies" 42 | } 43 | }] 44 | }); 45 | 46 | assert!(match fields(json) { 47 | Some(set) => { 48 | if set.authored_crates.len() == 2 { 49 | true 50 | } else { 51 | false 52 | } 53 | } 54 | None => false, 55 | }); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/chit/extract/package.rs: -------------------------------------------------------------------------------- 1 | use super::super::format; 2 | 3 | #[derive(Debug, Clone)] 4 | pub struct Version { 5 | pub semver: String, 6 | pub date: String, 7 | pub downloads: Option, 8 | pub size_in_bytes: Option, 9 | pub license: String, 10 | } 11 | 12 | #[derive(Debug, Clone)] 13 | pub struct Crate { 14 | pub name: String, 15 | pub description: String, 16 | pub downloads: Option, 17 | pub versions: Vec, 18 | pub recent_downloads: Option, 19 | pub repository: String, 20 | pub documentation: String, 21 | pub keywords: Vec, 22 | pub categories: Vec, 23 | } 24 | 25 | fn get_collect(key: &'static str, json: &serde_json::value::Value) -> Vec { 26 | json[key] 27 | .as_array() 28 | .unwrap() 29 | .iter() 30 | .map(|word| format::remove_quotes(word.to_string())) 31 | .collect() 32 | } 33 | 34 | pub fn fields(json: serde_json::value::Value) -> Option { 35 | let name = format::remove_quotes(json["crate"]["name"].to_string()); 36 | let description = format::remove_quotes(json["crate"]["description"].to_string()); 37 | let downloads = json["crate"]["downloads"].as_i64(); 38 | let recent_downloads = json["crate"]["recent_downloads"].as_i64(); 39 | let repository = format::remove_quotes(json["crate"]["repository"].to_string()); 40 | let documentation = json["crate"]["documentation"].to_string(); 41 | let keywords = get_collect("keywords", &json["crate"]); 42 | let categories = get_collect("categories", &json["crate"]); 43 | 44 | let documentation = if documentation == "null" { 45 | format!("None specified in Cargo.toml") 46 | } else { 47 | format::remove_quotes(documentation) 48 | }; 49 | 50 | if let Some(versions) = json["versions"].as_array() { 51 | let versions: Vec = versions 52 | .into_iter() 53 | .map(|version| { 54 | let mut date = format::remove_quotes(version["updated_at"].to_string()); 55 | date.truncate(10); 56 | return Version { 57 | date, 58 | semver: format::remove_quotes(version["num"].to_string()), 59 | downloads: version["downloads"].as_i64(), 60 | size_in_bytes: version["crate_size"].as_i64(), 61 | license: format::remove_quotes(version["license"].to_string()), 62 | }; 63 | }) 64 | .collect(); 65 | 66 | Some(Crate { 67 | name, 68 | description, 69 | downloads, 70 | versions, 71 | recent_downloads, 72 | repository, 73 | documentation, 74 | keywords, 75 | categories, 76 | }) 77 | } else { 78 | None 79 | } 80 | } 81 | 82 | pub fn calculate_rating(crate_info: &Crate) -> usize { 83 | if let Some(recent_downloads) = crate_info.recent_downloads { 84 | rate(recent_downloads) 85 | } else { 86 | 0 87 | } 88 | } 89 | 90 | fn rate(input: i64) -> usize { 91 | let five = 20000; 92 | let four = 5000; 93 | let three = 750; 94 | let two = 100; 95 | 96 | if input > five { 97 | 5 98 | } else if input > four { 99 | 4 100 | } else if input > three { 101 | 3 102 | } else if input > two { 103 | 2 104 | } else { 105 | 1 106 | } 107 | } 108 | 109 | #[cfg(test)] 110 | mod tests { 111 | use super::*; 112 | 113 | #[test] 114 | fn calculate_star_ratings_can_get_every_level_back() { 115 | assert_eq!(rate(32), 1); 116 | assert_eq!(rate(101), 2); 117 | assert_eq!(rate(1000), 3); 118 | assert_eq!(rate(5001), 4); 119 | assert_eq!(rate(1000000), 5); 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /src/chit/extract/repo.rs: -------------------------------------------------------------------------------- 1 | use super::super::format; 2 | 3 | #[derive(Debug, Clone)] 4 | pub struct RepositoryInfo { 5 | pub last_commit_date: String, 6 | pub stars: Option, 7 | pub issues: Option, 8 | } 9 | 10 | pub fn fields(json: serde_json::value::Value) -> RepositoryInfo { 11 | let mut last_commit_date = format::remove_quotes(json["updated_at"].to_string()); 12 | last_commit_date.truncate(10); 13 | let stars = json["stargazers_count"].as_i64(); 14 | let issues = json["open_issues_count"].as_i64(); 15 | 16 | RepositoryInfo { 17 | last_commit_date, 18 | stars, 19 | issues, 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/chit/format.rs: -------------------------------------------------------------------------------- 1 | use colored::*; 2 | use hyphenation::{Language, Load, Standard}; 3 | use textwrap::Wrapper; 4 | 5 | const HORIZONTAL: &str = "─"; 6 | 7 | pub fn get_width() -> usize { 8 | 45 9 | } 10 | 11 | pub fn print(message: String) { 12 | println!("{}", &message.to_string().bright_blue()); 13 | } 14 | 15 | pub fn title_bar(width: usize, title: &str) -> String { 16 | let fill = (width - title.len()) - 1; 17 | format!( 18 | "{}{}{}", 19 | HORIZONTAL.magenta(), 20 | title.bright_blue().bold(), 21 | n_character(fill, HORIZONTAL).magenta() 22 | ) 23 | } 24 | 25 | pub fn end_bar(width: usize) -> String { 26 | format!("{}", HORIZONTAL.repeat(width).magenta()) 27 | } 28 | 29 | pub fn remove_quotes(value: String) -> String { 30 | let mut string = value.clone(); 31 | string.remove(0); 32 | string.pop(); 33 | string 34 | } 35 | 36 | pub fn print_rating(rating: usize) { 37 | let star_rating = get_stars(rating); 38 | 39 | if rating > 0 && rating < 6 { 40 | println!("{}", &star_rating.to_string().bright_blue()); 41 | } 42 | } 43 | 44 | pub fn get_stars(rating: usize) -> String { 45 | let stars = n_character(rating, "🌟 "); 46 | format!("Rating: {}", stars) 47 | } 48 | 49 | pub fn bounded_print(width: usize, text: &str) { 50 | let hyphenator = Standard::from_embedded(Language::EnglishUS).unwrap(); 51 | let wrapper = Wrapper::with_splitter(width, hyphenator); 52 | print(wrapper.fill(text.replace("\\n", " ").trim_end())); 53 | } 54 | 55 | fn n_character(count: usize, string: &str) -> String { 56 | string.repeat(count) 57 | } 58 | 59 | pub fn get_crate_search_message(crate_name: &str) -> String { 60 | format!( 61 | " {} {}...", 62 | "Searching for".magenta(), 63 | &crate_name.bright_blue() 64 | ) 65 | } 66 | 67 | #[cfg(test)] 68 | mod tests { 69 | use super::*; 70 | 71 | #[test] 72 | fn get_width_should_return_45() { 73 | let width = get_width(); 74 | assert_eq!(width, 45); 75 | } 76 | 77 | #[test] 78 | fn title_bar_length_is_constant_for_input() { 79 | let title = title_bar(30, "tester").normal().to_string(); 80 | assert_eq!(title.len(), 107); 81 | } 82 | 83 | #[test] 84 | fn end_bar_length_is_constant_for_input() { 85 | let end = end_bar(50).normal().to_string(); 86 | assert_eq!(end.len(), 159); 87 | } 88 | 89 | #[test] 90 | fn remove_quotes_should_remove_a_single_set_of_quotes() { 91 | let quoted = String::from("\"Something\""); 92 | assert_eq!(remove_quotes(quoted), String::from("Something")); 93 | } 94 | 95 | #[test] 96 | fn get_stars_should_have_constant_length_for_n_stars() { 97 | let stars = get_stars(2); 98 | assert_eq!(stars.len(), 18); 99 | } 100 | 101 | #[test] 102 | fn crate_search_message_is_the_same_over_time() { 103 | let message = get_crate_search_message("test"); 104 | assert_eq!(message.len(), 40); 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /src/chit/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod details; 2 | pub mod owners; 3 | pub mod repo; 4 | pub mod versions; 5 | 6 | mod extract; 7 | mod format; 8 | mod sources; 9 | -------------------------------------------------------------------------------- /src/chit/owners.rs: -------------------------------------------------------------------------------- 1 | use colored::*; 2 | 3 | use super::extract; 4 | use super::format; 5 | use super::sources::crates; 6 | use super::sources::get; 7 | 8 | pub fn print_owners(crate_name: String) { 9 | let width = format::get_width(); 10 | println!( 11 | "{} {}...", 12 | "Searching for".magenta(), 13 | &crate_name.bright_blue() 14 | ); 15 | 16 | match get(crates::owners_url(&crate_name)) { 17 | Some(crate_owners_json) => { 18 | println!("{}", format::title_bar(width, &crate_name)); 19 | 20 | for user_json in crate_owners_json["users"] 21 | .as_array() 22 | .unwrap() 23 | .iter() 24 | .filter(|json| json["kind"] == "user") 25 | { 26 | let name = format::remove_quotes(user_json["name"].to_string()); 27 | 28 | if let Some(user_id) = user_json["id"].as_u64() { 29 | if let Some(user_json) = get(crates::user_url(user_id)) { 30 | if let Some(set) = extract::owners::fields(user_json) { 31 | let lines = format_owner_details(&name, set); 32 | for line in lines { 33 | println!("{}", line.bright_blue()); 34 | } 35 | } 36 | } 37 | } 38 | } 39 | println!("{}", format::end_bar(width)); 40 | } 41 | None => println!("Failed to get crate owner details"), 42 | } 43 | } 44 | 45 | fn format_owner_details(owner_name: &str, owner: extract::owners::AuthoredCrates) -> Vec { 46 | let mut lines = Vec::new(); 47 | 48 | lines.push(format!("Crates by {}:", owner_name)); 49 | 50 | for crate_name in owner.authored_crates { 51 | lines.push(format!(" {}", crate_name)); 52 | } 53 | 54 | lines 55 | } 56 | 57 | #[cfg(test)] 58 | mod tests { 59 | use super::*; 60 | 61 | #[test] 62 | fn describing_a_single_owner_achievements() { 63 | let owner = extract::owners::AuthoredCrates { 64 | authored_crates: vec![String::from("name"), String::from("other")], 65 | }; 66 | 67 | let lines = format_owner_details("ownerName1", owner); 68 | assert_eq!(lines[0].len(), 21); 69 | assert_eq!(lines[1].len(), 8); 70 | assert_eq!(lines[2].len(), 9); 71 | assert_eq!(lines.len(), 3); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/chit/repo.rs: -------------------------------------------------------------------------------- 1 | use colored::*; 2 | 3 | use super::extract; 4 | use super::format; 5 | use super::sources::crates; 6 | use super::sources::get; 7 | use super::sources::github; 8 | 9 | pub fn print_repo(crate_name: String) { 10 | println!("{}", format::get_crate_search_message(&crate_name)); 11 | match get(crates::url(&crate_name)) { 12 | Some(crate_json) => { 13 | if let Some(fields) = extract::package::fields(crate_json) { 14 | if github::check(fields.repository.as_str()) { 15 | let url = github::api_url(&fields.repository); 16 | match get(url) { 17 | Some(repository_json) => { 18 | let repo_fields = extract::repo::fields(repository_json); 19 | let lines = describe_repository( 20 | &crate_name, 21 | fields.repository.as_str(), 22 | repo_fields, 23 | ); 24 | for line in lines { 25 | println!("{}", line); 26 | } 27 | } 28 | None => { 29 | println!("Failed to get from repo"); 30 | } 31 | } 32 | } else { 33 | // We don't handle other providers yet 34 | println!("This repository is not on github, make a PR!"); 35 | } 36 | } 37 | } 38 | None => { 39 | println!("{} {}", "Failed".red(), "to find that crate".magenta()); 40 | return; 41 | } 42 | } 43 | } 44 | 45 | fn describe_repository( 46 | crate_name: &str, 47 | repository_url: &str, 48 | fields: extract::repo::RepositoryInfo, 49 | ) -> Vec { 50 | let mut lines = Vec::new(); 51 | 52 | let mut width = format::get_width(); 53 | let repo = format!("{} {}", "Repository: ", repository_url).bright_blue(); 54 | 55 | let large_widths: Vec = vec![width, repo.len()]; 56 | 57 | width = *large_widths.iter().max().unwrap(); 58 | 59 | lines.push(format!("{}", format::title_bar(width, &crate_name))); 60 | lines.push(format!("{}", repo)); 61 | lines.push(format!( 62 | "{}", 63 | format!("{} {}", "Last commit date:", fields.last_commit_date).bright_blue() 64 | )); 65 | 66 | if let Some(stars) = fields.stars { 67 | lines.push(format!( 68 | "{}", 69 | format!("{} {}", "Github Stars:", stars).bright_blue() 70 | )); 71 | } 72 | 73 | if let Some(issues) = fields.issues { 74 | lines.push(format!( 75 | "{}", 76 | format!("{} {}", "Github Issues:", issues).bright_blue() 77 | )); 78 | } 79 | 80 | lines.push(format!("{}", format::end_bar(width))); 81 | 82 | lines 83 | } 84 | 85 | #[cfg(test)] 86 | mod tests { 87 | use super::*; 88 | 89 | #[test] 90 | fn describe_versions_should_have_consistent_output() { 91 | let repository_details = extract::repo::RepositoryInfo { 92 | last_commit_date: String::from("fake date"), 93 | stars: Some(100), 94 | issues: Some(2), 95 | }; 96 | 97 | let lines = describe_repository("testBane", "urlfortest", repository_details); 98 | 99 | assert_eq!(lines[0].len(), 148); 100 | assert_eq!(lines[1].len(), 32); 101 | assert_eq!(lines[2].len(), 36); 102 | assert_eq!(lines[3].len(), 26); 103 | assert_eq!(lines[4].len(), 25); 104 | assert_eq!(lines[5].len(), 144); 105 | assert_eq!(lines.len(), 6); 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /src/chit/sources/crates.rs: -------------------------------------------------------------------------------- 1 | const ENDPOINT: &str = "https://crates.io/api/v1/crates"; 2 | 3 | pub fn url(crate_name: &str) -> String { 4 | format!("{}/{}", ENDPOINT, crate_name) 5 | } 6 | 7 | pub fn owners_url(crate_name: &str) -> String { 8 | format!("{}/{}/owners", ENDPOINT, crate_name) 9 | } 10 | 11 | pub fn user_url(user_id: u64) -> String { 12 | let per_page = 100; 13 | format!( 14 | "{}?page=1&per_page={}&sort=alpha&user_id={}", 15 | ENDPOINT, per_page, user_id 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /src/chit/sources/github.rs: -------------------------------------------------------------------------------- 1 | pub fn check(url: &str) -> bool { 2 | url.contains("github.com") 3 | } 4 | 5 | pub fn api_url(url: &str) -> String { 6 | format!( 7 | "{}{}", 8 | "https://api.github.com/repos/", 9 | crop_letters(url, 19) 10 | ) 11 | } 12 | // https://github.com/peterheesterman/chit 13 | // https://api.github.com/repos/peterheesterman/chit 14 | // IDEA: add the number of pull requests open on the repository as well. 15 | // /peterheesterman/chit/pulls?state=open 16 | fn crop_letters(s: &str, pos: usize) -> &str { 17 | match s.char_indices().skip(pos).next() { 18 | Some((pos, _)) => &s[pos..], 19 | None => "", 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/chit/sources/mod.rs: -------------------------------------------------------------------------------- 1 | extern crate reqwest; 2 | use std::io::Read; 3 | 4 | pub mod crates; 5 | pub mod github; 6 | 7 | pub fn get(url: String) -> Option { 8 | let req = reqwest::get(&url); 9 | 10 | match req { 11 | Ok(mut res) => { 12 | if res.status() == 200 { 13 | let mut res_body = String::new(); 14 | res.read_to_string(&mut res_body) 15 | .expect("fail to read crate res_body"); 16 | 17 | Some(serde_json::from_str(&res_body).expect("fail to serde parse res_body")) 18 | } else { 19 | None 20 | } 21 | } 22 | Err(e) => { 23 | panic!("Error: {:?}", e); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/chit/versions.rs: -------------------------------------------------------------------------------- 1 | use colored::*; 2 | 3 | use super::extract; 4 | use super::format; 5 | use super::sources::crates; 6 | use super::sources::get; 7 | 8 | pub fn print_versions(crate_name: String) { 9 | let width = format::get_width(); 10 | println!("{}", format::get_crate_search_message(&crate_name)); 11 | match get(crates::url(&crate_name)) { 12 | Some(crate_json) => { 13 | if let Some(fields) = extract::package::fields(crate_json) { 14 | let lines = describe_versions(width, fields); 15 | for line in lines { 16 | println!("{}", line); 17 | } 18 | } 19 | } 20 | None => { 21 | println!("{} {}", "Failed".red(), "to find that crate".magenta()); 22 | return; 23 | } 24 | } 25 | println!("{}", format::end_bar(width)); 26 | } 27 | 28 | fn describe_versions(width: usize, fields: extract::package::Crate) -> Vec { 29 | let mut lines = Vec::new(); 30 | 31 | lines.push(format!("{}", format::title_bar(width, &fields.name))); 32 | lines.push(format!("{}", "Versions:".bright_blue())); 33 | 34 | for version in fields.versions { 35 | if let Some(size) = version.size_in_bytes { 36 | lines.push(format!( 37 | " {} {} | {} | {}", 38 | version.semver.bright_blue(), 39 | format!("({})", version.license).bright_blue(), 40 | version.date.bright_blue(), 41 | format!("{} kB", (size as f64 / 1000_f64).round()).bright_blue(), 42 | )); 43 | } else { 44 | lines.push(format!( 45 | " {} | {}", 46 | version.semver.bright_blue(), 47 | version.date.bright_blue() 48 | )); 49 | } 50 | } 51 | 52 | lines 53 | } 54 | 55 | #[cfg(test)] 56 | mod tests { 57 | use super::*; 58 | 59 | #[test] 60 | fn describe_versions_should_have_consistent_output() { 61 | let versions: Vec = vec![ 62 | extract::package::Version { 63 | date: String::from("some date"), 64 | semver: String::from("0.1.3"), 65 | downloads: Some(220), 66 | size_in_bytes: Some(20), 67 | license: String::from("MIT"), 68 | }, 69 | extract::package::Version { 70 | date: String::from("some date"), 71 | semver: String::from("0.1.1"), 72 | downloads: Some(120), 73 | size_in_bytes: Some(10), 74 | license: String::from("MIT"), 75 | }, 76 | ]; 77 | 78 | let crate_details = extract::package::Crate { 79 | name: String::from("name"), 80 | description: String::from("name"), 81 | downloads: Some(100), 82 | versions, 83 | recent_downloads: Some(20), 84 | repository: String::from("name"), 85 | documentation: String::from("name"), 86 | keywords: vec![String::from("keyword")], 87 | categories: vec![String::from("keyword")], 88 | }; 89 | 90 | let lines = describe_versions(40, crate_details); 91 | assert_eq!(lines.len(), 4); 92 | assert_eq!(lines[0].len(), 141); 93 | assert_eq!(lines[1].len(), 18); 94 | assert_eq!(lines[2].len(), 71); 95 | assert_eq!(lines[3].len(), 71); 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | #[macro_use] 2 | extern crate serde_derive; 3 | 4 | use clap::{App, Arg, SubCommand}; 5 | use colored::*; 6 | use std::env; 7 | 8 | mod chit; 9 | mod meta; 10 | 11 | fn main() { 12 | // subcommands 13 | let help = "help"; // from clap 14 | let versions = "versions"; 15 | let owners = "owners"; 16 | let repo = "repo"; 17 | 18 | // Keep it simple 19 | let args: Vec = env::args().collect(); 20 | if args.len() == 2 { 21 | let crate_name = args[1].clone(); 22 | let reserved = vec![ 23 | help, 24 | versions, 25 | owners, 26 | repo, 27 | "-h", 28 | "--help", 29 | "-V", 30 | "--version", 31 | ]; 32 | if !reserved.contains(&&crate_name.as_str()) { 33 | chit::details::print_details(crate_name.to_string()); 34 | return; 35 | } 36 | } 37 | 38 | // Meta 39 | let semver = meta::get_version(); 40 | let author = meta::get_author(); 41 | 42 | // Args 43 | let crate_arg_name = "crate"; 44 | let crate_arg = Arg::with_name(&crate_arg_name) 45 | .short("c") 46 | .long("crate") 47 | .help("The name of the crate") 48 | .required(false) 49 | .takes_value(true); 50 | 51 | let matches = App::new("chit") 52 | .version(semver) 53 | .author(author) 54 | .about("Easily looking up details about rust crates") 55 | .arg(crate_arg.clone()) 56 | .subcommand( 57 | SubCommand::with_name(owners) 58 | .about("Find out details about crate owners") 59 | .version(semver) 60 | .author(author) 61 | .arg(crate_arg.clone()), 62 | ) 63 | .subcommand( 64 | SubCommand::with_name(versions) 65 | .about("Find out details about a crates versions") 66 | .version(semver) 67 | .author(author) 68 | .arg(crate_arg.clone()), 69 | ) 70 | .subcommand( 71 | SubCommand::with_name(repo) 72 | .about("Find out details about a crates repository") 73 | .version(semver) 74 | .author(author) 75 | .arg(crate_arg), 76 | ) 77 | .get_matches(); 78 | 79 | let no_crate_message = format!("{}", "No crate supplied".yellow()); 80 | 81 | // Actions 82 | if let Some(owners) = matches.subcommand_matches("owners") { 83 | if let Some(crate_name) = owners.value_of(crate_arg_name) { 84 | chit::owners::print_owners(crate_name.to_string()) 85 | } else { 86 | println!("{}", no_crate_message); 87 | }; 88 | } else if let Some(versions) = matches.subcommand_matches("versions") { 89 | if let Some(crate_name) = versions.value_of(crate_arg_name) { 90 | chit::versions::print_versions(crate_name.to_string()) 91 | } else { 92 | println!("{}", no_crate_message); 93 | }; 94 | } else if let Some(repo) = matches.subcommand_matches("repo") { 95 | if let Some(crate_name) = repo.value_of(crate_arg_name) { 96 | chit::repo::print_repo(crate_name.to_string()) 97 | } else { 98 | println!("{}", no_crate_message); 99 | }; 100 | } else if let Some(crate_name) = matches.value_of(crate_arg_name) { 101 | chit::details::print_details(crate_name.to_string()) 102 | } else { 103 | println!( 104 | "{} {}", 105 | "It looks like there was an issue, try: ".yellow(), 106 | "chit --help".blue() 107 | ); 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /src/meta.rs: -------------------------------------------------------------------------------- 1 | pub fn get_version() -> &'static str { 2 | "0.1.15" 3 | } 4 | 5 | pub fn get_author() -> &'static str { 6 | "Peter Heesterman " 7 | } 8 | --------------------------------------------------------------------------------