Compare commits
12 Commits
3442351223
...
7545039bec
Author | SHA1 | Date |
---|---|---|
Bauke | 7545039bec | |
Bauke | 49969b307a | |
Bauke | 8b450cc724 | |
Bauke | 2ebc218149 | |
Bauke | 521a9bbd1a | |
Bauke | 3a001d1326 | |
Bauke | fc2503e752 | |
Bauke | 243750ff5f | |
Bauke | 9db7f4f1b2 | |
Bauke | 3a466adedc | |
Bauke | b32e45d058 | |
Bauke | dda3e2debc |
|
@ -1,8 +1,6 @@
|
|||
# Compiled files and executables.
|
||||
# Generated by Cargo
|
||||
debug/
|
||||
target/
|
||||
|
||||
# Backup files generated by rustfmt.
|
||||
**/*.rs.bk
|
||||
|
||||
# Code coverage reports
|
||||
.coverage/
|
||||
# Code coverage results
|
||||
coverage/
|
||||
|
|
|
@ -2,20 +2,11 @@
|
|||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "ansi_term"
|
||||
version = "0.11.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
|
||||
dependencies = [
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "assert_cmd"
|
||||
version = "2.0.1"
|
||||
version = "2.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b800c4403e8105d959595e1f88119e78bc12bc874c4336973658b648a746ba93"
|
||||
checksum = "93ae1ddd39efd67689deb1979d80bad3bf7f2b09c6e6117c8d1f2443b5e2f83e"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"doc-comment",
|
||||
|
@ -38,9 +29,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "1.2.1"
|
||||
version = "1.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
|
||||
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
||||
|
||||
[[package]]
|
||||
name = "bstr"
|
||||
|
@ -54,18 +45,59 @@ dependencies = [
|
|||
]
|
||||
|
||||
[[package]]
|
||||
name = "clap"
|
||||
version = "2.33.3"
|
||||
name = "cfg-if"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002"
|
||||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||
|
||||
[[package]]
|
||||
name = "clap"
|
||||
version = "4.0.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0a1af219c3e254a8b4649d6ddaef886b2015089f35f2ac5e1db31410c0566ab8"
|
||||
dependencies = [
|
||||
"ansi_term",
|
||||
"atty",
|
||||
"bitflags",
|
||||
"clap_derive",
|
||||
"clap_lex",
|
||||
"once_cell",
|
||||
"strsim",
|
||||
"textwrap",
|
||||
"unicode-width",
|
||||
"vec_map",
|
||||
"termcolor",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "clap_derive"
|
||||
version = "4.0.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cd114ae53ce5a0670f43d2f169c1cd26c69b4896b0c121900cf1e4d06d67316c"
|
||||
dependencies = [
|
||||
"heck",
|
||||
"proc-macro-error",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "clap_lex"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0d4198f73e42b4936b35b5bb248d81d2b595ecb170da0bac7655c54eedfa8da8"
|
||||
dependencies = [
|
||||
"os_str_bytes",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "console"
|
||||
version = "0.15.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c050367d967ced717c04b65d8c619d863ef9292ce0c5760028655a2fb298718c"
|
||||
dependencies = [
|
||||
"encode_unicode",
|
||||
"lazy_static",
|
||||
"libc",
|
||||
"terminal_size",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -82,15 +114,21 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
|
|||
|
||||
[[package]]
|
||||
name = "either"
|
||||
version = "1.6.1"
|
||||
version = "1.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
|
||||
checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797"
|
||||
|
||||
[[package]]
|
||||
name = "encode_unicode"
|
||||
version = "0.3.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
|
||||
|
||||
[[package]]
|
||||
name = "hard-xml"
|
||||
version = "1.10.0"
|
||||
version = "1.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8c049a5d5186e83c3cf139192e81ab9d06c6b20d18c8aa06b38f3f6a5ece8703"
|
||||
checksum = "3477ce594ff6d821c38fc3f8d28744b9bac0340c94b152ebb0f8a1fd5b740f54"
|
||||
dependencies = [
|
||||
"hard-xml-derive",
|
||||
"jetscii",
|
||||
|
@ -101,9 +139,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "hard-xml-derive"
|
||||
version = "1.10.0"
|
||||
version = "1.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d24cec6f13bd2423158425bdb5f5ba0f2ddf7d7c2a825c0fdbf20c513df49725"
|
||||
checksum = "3aa4585e2b133d2479ff3f03febd76972234cc04b40cdb374fab11a7f7b797ca"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
@ -111,34 +149,53 @@ dependencies = [
|
|||
]
|
||||
|
||||
[[package]]
|
||||
name = "hermit-abi"
|
||||
version = "0.1.15"
|
||||
name = "heck"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3deed196b6e7f9e44a2ae8d94225d80302d81208b1bb673fd21fe634645c85a9"
|
||||
checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9"
|
||||
|
||||
[[package]]
|
||||
name = "hermit-abi"
|
||||
version = "0.1.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "itertools"
|
||||
version = "0.10.1"
|
||||
name = "insta"
|
||||
version = "1.21.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "69ddb889f9d0d08a67338271fa9b62996bc788c7796a5c18cf057420aaed5eaf"
|
||||
checksum = "581d4e3314cae4536e5d22ffd23189d4a374696c5ef733eadafae0ed273fd303"
|
||||
dependencies = [
|
||||
"console",
|
||||
"lazy_static",
|
||||
"linked-hash-map",
|
||||
"similar",
|
||||
"yaml-rust",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "itertools"
|
||||
version = "0.10.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
|
||||
dependencies = [
|
||||
"either",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "itoa"
|
||||
version = "0.4.6"
|
||||
version = "1.0.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6"
|
||||
checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754"
|
||||
|
||||
[[package]]
|
||||
name = "jetscii"
|
||||
version = "0.5.1"
|
||||
version = "0.5.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c9447923c57a8a2d5c1b0875cdf96a6324275df728b498f2ede0e5cbde088a15"
|
||||
checksum = "47f142fe24a9c9944451e8349de0a56af5f3e7226dc46f3ed4d4ecc0b85af75e"
|
||||
|
||||
[[package]]
|
||||
name = "lazy_static"
|
||||
|
@ -148,19 +205,31 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
|||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.76"
|
||||
version = "0.2.134"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "755456fae044e6fa1ebbbd1b3e902ae19e73097ed4ed87bb79934a867c007bc3"
|
||||
checksum = "329c933548736bc49fd575ee68c89e8be4d260064184389a5b77517cddd99ffb"
|
||||
|
||||
[[package]]
|
||||
name = "linked-hash-map"
|
||||
version = "0.5.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
version = "2.4.1"
|
||||
version = "2.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a"
|
||||
checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
|
||||
|
||||
[[package]]
|
||||
name = "once_cell"
|
||||
version = "1.15.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1"
|
||||
|
||||
[[package]]
|
||||
name = "opml"
|
||||
version = "1.1.4"
|
||||
version = "1.1.5"
|
||||
dependencies = [
|
||||
"hard-xml",
|
||||
"serde",
|
||||
|
@ -169,20 +238,28 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "opml_cli"
|
||||
version = "1.1.4"
|
||||
version = "1.1.5"
|
||||
dependencies = [
|
||||
"assert_cmd",
|
||||
"clap",
|
||||
"insta",
|
||||
"opml",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"test-case",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "predicates"
|
||||
version = "2.0.2"
|
||||
name = "os_str_bytes"
|
||||
version = "6.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c143348f141cc87aab5b950021bac6145d0e5ae754b0591de23244cee42c9308"
|
||||
checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff"
|
||||
|
||||
[[package]]
|
||||
name = "predicates"
|
||||
version = "2.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a5aab5be6e4732b473071984b3164dbbfb7a3674d30ea5ff44410b6bcd960c3c"
|
||||
dependencies = [
|
||||
"difflib",
|
||||
"itertools",
|
||||
|
@ -191,34 +268,58 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "predicates-core"
|
||||
version = "1.0.0"
|
||||
version = "1.0.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "06075c3a3e92559ff8929e7a280684489ea27fe44805174c3ebd9328dcb37178"
|
||||
checksum = "da1c2388b1513e1b605fcec39a95e0a9e8ef088f71443ef37099fa9ae6673fcb"
|
||||
|
||||
[[package]]
|
||||
name = "predicates-tree"
|
||||
version = "1.0.0"
|
||||
version = "1.0.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8e63c4859013b38a76eca2414c64911fba30def9e3202ac461a2d22831220124"
|
||||
checksum = "4d86de6de25020a36c6d3643a86d9a6a9f552107c0559c60ea03551b5e16c032"
|
||||
dependencies = [
|
||||
"predicates-core",
|
||||
"treeline",
|
||||
"termtree",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro-error"
|
||||
version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
|
||||
dependencies = [
|
||||
"proc-macro-error-attr",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"version_check",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro-error-attr"
|
||||
version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"version_check",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.24"
|
||||
version = "1.0.46"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
|
||||
checksum = "94e2ef8dbfc347b10c094890f778ee2e36ca9bb4262e86dc99cd217e35f3470b"
|
||||
dependencies = [
|
||||
"unicode-xid",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.7"
|
||||
version = "1.0.21"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37"
|
||||
checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
@ -231,24 +332,24 @@ checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
|
|||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
version = "1.0.5"
|
||||
version = "1.0.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
|
||||
checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09"
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.130"
|
||||
version = "1.0.145"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913"
|
||||
checksum = "728eb6351430bccb993660dfffc5a72f91ccc1295abaa8ce19b27ebe4f75568b"
|
||||
dependencies = [
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.130"
|
||||
version = "1.0.145"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b"
|
||||
checksum = "81fa1584d3d1bcacd84c277a0dfe21f5b0f6accf4a23d04d4c6d61f1af522b4c"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
@ -257,9 +358,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "serde_json"
|
||||
version = "1.0.68"
|
||||
version = "1.0.85"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0f690853975602e1bfe1ccbf50504d67174e3bcf340f23b5ea9992e0587a52d8"
|
||||
checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44"
|
||||
dependencies = [
|
||||
"itoa",
|
||||
"ryu",
|
||||
|
@ -267,45 +368,89 @@ dependencies = [
|
|||
]
|
||||
|
||||
[[package]]
|
||||
name = "strsim"
|
||||
version = "0.8.0"
|
||||
name = "similar"
|
||||
version = "2.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
|
||||
checksum = "62ac7f900db32bf3fd12e0117dd3dc4da74bc52ebaac97f39668446d89694803"
|
||||
|
||||
[[package]]
|
||||
name = "strsim"
|
||||
version = "0.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "1.0.64"
|
||||
version = "1.0.101"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3fd9d1e9976102a03c542daa2eff1b43f9d72306342f3f8b3ed5fb8908195d6f"
|
||||
checksum = "e90cde112c4b9690b8cbe810cba9ddd8bc1d7472e2cae317b69e9438c1cba7d2"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-xid",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "textwrap"
|
||||
version = "0.11.0"
|
||||
name = "termcolor"
|
||||
version = "1.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
|
||||
checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755"
|
||||
dependencies = [
|
||||
"unicode-width",
|
||||
"winapi-util",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "terminal_size"
|
||||
version = "0.1.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "termtree"
|
||||
version = "0.2.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "507e9898683b6c43a9aa55b64259b721b52ba226e0f3779137e50ad114a4c90b"
|
||||
|
||||
[[package]]
|
||||
name = "test-case"
|
||||
version = "2.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "07aea929e9488998b64adc414c29fe5620398f01c2e3f58164122b17e567a6d5"
|
||||
dependencies = [
|
||||
"test-case-macros",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "test-case-macros"
|
||||
version = "2.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c95968eedc6fc4f5c21920e0f4264f78ec5e4c56bb394f319becc1a5830b3e54"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"proc-macro-error",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror"
|
||||
version = "1.0.29"
|
||||
version = "1.0.37"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "602eca064b2d83369e2b2f34b09c70b605402801927c65c11071ac911d299b88"
|
||||
checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e"
|
||||
dependencies = [
|
||||
"thiserror-impl",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror-impl"
|
||||
version = "1.0.29"
|
||||
version = "1.0.37"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bad553cc2c78e8de258400763a647e80e6d1b31ee237275d756f6836d204494c"
|
||||
checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
@ -313,28 +458,16 @@ dependencies = [
|
|||
]
|
||||
|
||||
[[package]]
|
||||
name = "treeline"
|
||||
version = "0.1.0"
|
||||
name = "unicode-ident"
|
||||
version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a7f741b240f1a48843f9b8e0444fb55fb2a4ff67293b50a9179dfd5ea67f8d41"
|
||||
checksum = "dcc811dc4066ac62f84f11307873c4850cb653bfa9b1719cee2bd2204a4bc5dd"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-width"
|
||||
version = "0.1.8"
|
||||
name = "version_check"
|
||||
version = "0.9.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
|
||||
|
||||
[[package]]
|
||||
name = "vec_map"
|
||||
version = "0.8.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
|
||||
checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
|
||||
|
||||
[[package]]
|
||||
name = "wait-timeout"
|
||||
|
@ -361,6 +494,15 @@ version = "0.4.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
||||
|
||||
[[package]]
|
||||
name = "winapi-util"
|
||||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
|
||||
dependencies = [
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winapi-x86_64-pc-windows-gnu"
|
||||
version = "0.4.0"
|
||||
|
@ -369,6 +511,15 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
|||
|
||||
[[package]]
|
||||
name = "xmlparser"
|
||||
version = "0.13.2"
|
||||
version = "0.13.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "52613e655f6f11f63c0fe7d1c3b5ef69e44d96df9b65dab296b441ed0e1125f5"
|
||||
checksum = "114ba2b24d2167ef6d67d7d04c8cc86522b87f490025f39f0303b7db5bf5e3d8"
|
||||
|
||||
[[package]]
|
||||
name = "yaml-rust"
|
||||
version = "0.4.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85"
|
||||
dependencies = [
|
||||
"linked-hash-map",
|
||||
]
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
The MIT License
|
||||
|
||||
Copyright (c) 2020-2021 Holllo <helllo@holllo.cc>
|
||||
Copyright (c) 2020-2022 Holllo <helllo@holllo.org>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
|
|
@ -36,7 +36,7 @@ args = [
|
|||
"tarpaulin",
|
||||
"--exclude-files=target/*",
|
||||
"--out=html",
|
||||
"--output-dir=.coverage",
|
||||
"--output-dir=coverage",
|
||||
"--skip-clean",
|
||||
"--target-dir=target/tarpaulin",
|
||||
"--workspace"
|
||||
|
|
24
README.md
24
README.md
|
@ -1,21 +1,27 @@
|
|||
# OPML
|
||||
# OPML 📄
|
||||
|
||||
> An OPML parser for Rust and the command-line.
|
||||
> **OPML library for Rust & standalone CLI.**
|
||||
|
||||
## API
|
||||
|
||||
For the API documentation, see [docs.rs](https://docs.rs/opml).
|
||||
For API documentation and examples see [docs.rs](https://docs.rs/opml).
|
||||
|
||||
## CLI
|
||||
|
||||
To install the OPML command-line parser, run `cargo install opml_cli` or download a precompiled executable directly from [the Releases page](https://github.com/Holllo/opml/releases/latest).
|
||||
### Cargo
|
||||
|
||||
Then run `opml --help` to see all the available options.
|
||||
With a working [Rust and Cargo](https://www.rust-lang.org/learn/get-started) installation, you can install the OPML CLI from [Crates.io](https://crates.io/crates/opml_cli).
|
||||
|
||||
```
|
||||
cargo install opml_cli
|
||||
```
|
||||
|
||||
### Binaries
|
||||
|
||||
Precompiled `x86_64-unknown-linux-gnu` binaries are available on the [Releases page](https://git.bauke.xyz/Holllo/opml/releases).
|
||||
|
||||
## License
|
||||
|
||||
Both the API and command-line parser are licensed under either of [Apache License, Version 2.0](https://github.com/Holllo/opml/blob/main/LICENSE-Apache) or [MIT license](https://github.com/Holllo/opml/blob/main/LICENSE-MIT) at your option.
|
||||
Distributed under the [Apache License 2.0](https://spdx.org/licenses/Apache-2.0.html) and [MIT](https://spdx.org/licenses/MIT.html) licenses, see [LICENSE-Apache](https://git.bauke.xyz/Holllo/opml/src/branch/main/LICENSE-Apache) and [LICENSE-MIT](https://git.bauke.xyz/Holllo/opml/src/branch/main/LICENSE-MIT) for more information.
|
||||
|
||||
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in either crate by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
|
||||
|
||||
The samples [located in `opml_api/tests/spec_samples`](https://github.com/Holllo/opml/tree/main/opml_api/tests/spec_samples) were [taken from the OPML 2.0 spec](http://dev.opml.org/spec2.html#examples) and are subject to [their own license](https://github.com/Holllo/opml/blob/main/opml_api/tests/spec_samples/LICENSE).
|
||||
The samples located in `opml_api/tests/spec_samples`) were [taken from the OPML 2.0 spec](http://dev.opml.org/spec2.html#examples) and are subject to [their own license](https://git.bauke.xyz/Holllo/opml/src/branch/main/opml_api/tests/spec_samples/LICENSE).
|
||||
|
|
|
@ -2,22 +2,22 @@
|
|||
|
||||
[package]
|
||||
name = "opml"
|
||||
description = "An OPML parser for Rust."
|
||||
authors = ["Holllo <helllo@holllo.cc>"]
|
||||
version = "1.1.4"
|
||||
description = "OPML library for Rust."
|
||||
repository = "https://git.bauke.xyz/Holllo/opml"
|
||||
license = "MIT OR Apache-2.0"
|
||||
repository = "https://github.com/Holllo/opml"
|
||||
version = "1.1.5"
|
||||
authors = ["Holllo <helllo@holllo.org>"]
|
||||
edition = "2021"
|
||||
readme = "../README.md"
|
||||
edition = "2018"
|
||||
keywords = ["xml", "opml"]
|
||||
|
||||
[lib]
|
||||
path = "source/lib.rs"
|
||||
|
||||
[dependencies]
|
||||
hard-xml = "1.10.0"
|
||||
thiserror = "1.0.29"
|
||||
hard-xml = "1.13.0"
|
||||
thiserror = "1.0.37"
|
||||
|
||||
[dependencies.serde]
|
||||
version = "1.0.130"
|
||||
version = "1.0.145"
|
||||
features = ["derive"]
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
The MIT License
|
||||
|
||||
Copyright (c) 2020-2021 Holllo <helllo@holllo.cc>
|
||||
Copyright (c) 2020-2022 Holllo <helllo@holllo.org>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
|
|
@ -1,26 +1,31 @@
|
|||
use std::{error::Error, fs};
|
||||
|
||||
use opml::OPML;
|
||||
|
||||
fn main() -> Result<(), Box<dyn Error>> {
|
||||
let xml = fs::read_to_string("examples/opml_samples/rust_feeds.opml")?;
|
||||
const SAMPLE: &str = r#"<opml version="2.0">
|
||||
<head>
|
||||
<title>Rust Feeds</title>
|
||||
</head>
|
||||
<body>
|
||||
<outline text="Rust Blog" xmlUrl="https://blog.rust-lang.org/feed.xml" />
|
||||
<outline text="Inside Rust" xmlUrl="https://blog.rust-lang.org/inside-rust/feed.xml" />
|
||||
</body>
|
||||
</opml>"#;
|
||||
|
||||
let subscriptions = OPML::from_str(&xml)?;
|
||||
let head = subscriptions.head.unwrap();
|
||||
let title = head.title.unwrap();
|
||||
/// Run this example using `cargo run --example rss`.
|
||||
///
|
||||
/// Output:
|
||||
/// Rust Feeds
|
||||
/// ──────────
|
||||
/// Rust Blog https://blog.rust-lang.org/feed.xml
|
||||
/// Inside Rust https://blog.rust-lang.org/inside-rust/feed.xml
|
||||
fn main() {
|
||||
let subscriptions = OPML::from_str(SAMPLE).unwrap();
|
||||
|
||||
println!(" {}", title);
|
||||
println!(" {}", "─".repeat(title.len()));
|
||||
|
||||
for outline in subscriptions.body.outlines {
|
||||
println!(" {}\t{}", outline.text, outline.xml_url.unwrap());
|
||||
if let Some(title) = subscriptions.head.and_then(|head| head.title) {
|
||||
println!("{}", title);
|
||||
println!("{}", "-".repeat(title.len()));
|
||||
}
|
||||
|
||||
Ok(())
|
||||
for outline in subscriptions.body.outlines {
|
||||
println!("{}\t{}", outline.text, outline.xml_url.unwrap());
|
||||
}
|
||||
}
|
||||
|
||||
// Output:
|
||||
// Rust Feeds
|
||||
// ──────────
|
||||
// Rust Blog https://blog.rust-lang.org/feed.xml
|
||||
// Inside Rust https://blog.rust-lang.org/inside-rust/feed.xml
|
||||
|
|
|
@ -29,6 +29,9 @@
|
|||
//! To create an OPML document from scratch, use [`OPML::default()`] or the good
|
||||
//! old `OPML { /* ... */ }` syntax.
|
||||
|
||||
#![forbid(unsafe_code)]
|
||||
#![warn(missing_docs, clippy::missing_docs_in_private_items)]
|
||||
|
||||
use hard_xml::{XmlRead, XmlWrite};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use thiserror::Error;
|
||||
|
@ -57,7 +60,7 @@ pub enum Error {
|
|||
|
||||
/// The top-level [`OPML`] element.
|
||||
#[derive(
|
||||
XmlWrite, XmlRead, PartialEq, Debug, Clone, Serialize, Deserialize,
|
||||
XmlWrite, XmlRead, PartialEq, Eq, Debug, Clone, Serialize, Deserialize,
|
||||
)]
|
||||
#[xml(tag = "opml")]
|
||||
pub struct OPML {
|
||||
|
@ -126,9 +129,8 @@ impl OPML {
|
|||
///
|
||||
/// ```rust,no_run
|
||||
/// use opml::OPML;
|
||||
/// use std::fs::File;
|
||||
///
|
||||
/// let mut file = File::open("file.opml").unwrap();
|
||||
/// let mut file = std::fs::File::open("file.opml").unwrap();
|
||||
/// let document = OPML::from_reader(&mut file).unwrap();
|
||||
/// ```
|
||||
pub fn from_reader<R>(reader: &mut R) -> Result<Self, Error>
|
||||
|
@ -200,10 +202,9 @@ impl OPML {
|
|||
///
|
||||
/// ```rust,no_run
|
||||
/// use opml::OPML;
|
||||
/// use std::fs::File;
|
||||
///
|
||||
/// let opml = OPML::default();
|
||||
/// let mut file = File::create("file.opml").unwrap();
|
||||
/// let mut file = std::fs::File::create("file.opml").unwrap();
|
||||
/// let xml = opml.to_writer(&mut file).unwrap();
|
||||
/// ```
|
||||
pub fn to_writer<W>(&self, writer: &mut W) -> Result<(), Error>
|
||||
|
@ -229,7 +230,15 @@ impl Default for OPML {
|
|||
/// The [`Head`] child element of [`OPML`]. Contains the metadata of the OPML
|
||||
/// document.
|
||||
#[derive(
|
||||
XmlWrite, XmlRead, PartialEq, Debug, Clone, Default, Serialize, Deserialize,
|
||||
XmlWrite,
|
||||
XmlRead,
|
||||
PartialEq,
|
||||
Eq,
|
||||
Debug,
|
||||
Clone,
|
||||
Default,
|
||||
Serialize,
|
||||
Deserialize,
|
||||
)]
|
||||
#[xml(tag = "head")]
|
||||
pub struct Head {
|
||||
|
@ -294,7 +303,15 @@ pub struct Head {
|
|||
/// The [`Body`] child element of [`OPML`]. Contains all the [`Outline`]
|
||||
/// elements.
|
||||
#[derive(
|
||||
XmlWrite, XmlRead, PartialEq, Debug, Clone, Default, Serialize, Deserialize,
|
||||
XmlWrite,
|
||||
XmlRead,
|
||||
PartialEq,
|
||||
Eq,
|
||||
Debug,
|
||||
Clone,
|
||||
Default,
|
||||
Serialize,
|
||||
Deserialize,
|
||||
)]
|
||||
#[xml(tag = "body")]
|
||||
pub struct Body {
|
||||
|
@ -305,7 +322,15 @@ pub struct Body {
|
|||
|
||||
/// The [`Outline`] element.
|
||||
#[derive(
|
||||
XmlWrite, XmlRead, PartialEq, Debug, Clone, Default, Serialize, Deserialize,
|
||||
XmlWrite,
|
||||
XmlRead,
|
||||
PartialEq,
|
||||
Eq,
|
||||
Debug,
|
||||
Clone,
|
||||
Default,
|
||||
Serialize,
|
||||
Deserialize,
|
||||
)]
|
||||
#[xml(tag = "outline")]
|
||||
pub struct Outline {
|
||||
|
@ -390,7 +415,7 @@ impl Outline {
|
|||
/// # Example
|
||||
///
|
||||
/// ```rust
|
||||
/// use opml::{Outline};
|
||||
/// use opml::Outline;
|
||||
///
|
||||
/// let mut group = Outline::default();
|
||||
/// group.add_feed("Feed Name", "https://example.com/");
|
||||
|
|
|
@ -2,13 +2,13 @@
|
|||
|
||||
[package]
|
||||
name = "opml_cli"
|
||||
description = "An OPML parser for the command-line."
|
||||
version = "1.1.4"
|
||||
authors = ["Holllo <helllo@holllo.cc>"]
|
||||
description = "OPML for the command-line."
|
||||
repository = "https://git.bauke.xyz/Holllo/opml"
|
||||
license = "MIT OR Apache-2.0"
|
||||
repository = "https://github.com/Holllo/opml"
|
||||
version = "1.1.5"
|
||||
authors = ["Holllo <helllo@holllo.org>"]
|
||||
edition = "2021"
|
||||
readme = "../README.md"
|
||||
edition = "2018"
|
||||
keywords = ["xml", "opml"]
|
||||
|
||||
[[bin]]
|
||||
|
@ -16,16 +16,21 @@ name = "opml"
|
|||
path = "source/main.rs"
|
||||
|
||||
[dependencies]
|
||||
clap = "2.33.3"
|
||||
serde_json = "1.0.68"
|
||||
serde_json = "1.0.85"
|
||||
|
||||
[dependencies.clap]
|
||||
version = "4.0.7"
|
||||
features = ["derive"]
|
||||
|
||||
[dependencies.opml]
|
||||
path = "../opml_api"
|
||||
version = "1.1.4"
|
||||
version = "1.1.5"
|
||||
|
||||
[dependencies.serde]
|
||||
version = "1.0.130"
|
||||
version = "1.0.145"
|
||||
features = ["derive"]
|
||||
|
||||
[dev-dependencies]
|
||||
assert_cmd = "2.0.1"
|
||||
assert_cmd = "2.0.4"
|
||||
insta = "1.21.0"
|
||||
test-case = "2.2.1"
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
The MIT License
|
||||
|
||||
Copyright (c) 2020-2021 Holllo <helllo@holllo.cc>
|
||||
Copyright (c) 2020-2022 Holllo <helllo@holllo.org>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
|
|
@ -1,70 +1,43 @@
|
|||
use std::fs::read_to_string;
|
||||
use std::{fs::read_to_string, path::PathBuf};
|
||||
|
||||
use clap::{
|
||||
crate_authors, crate_description, crate_version, App, Arg, ArgGroup,
|
||||
};
|
||||
use clap::Parser;
|
||||
use opml::{Outline, OPML};
|
||||
|
||||
#[derive(Debug, Parser)]
|
||||
#[clap(about, author, version)]
|
||||
struct Args {
|
||||
/// The OPML file to parse.
|
||||
#[clap(short, long)]
|
||||
file: PathBuf,
|
||||
|
||||
/// Output the OPML as JSON.
|
||||
#[clap(long, group = "format", required = true)]
|
||||
json: bool,
|
||||
|
||||
/// Output the OPML as pretty-printed JSON.
|
||||
#[clap(long, group = "format", required = true)]
|
||||
json_pretty: bool,
|
||||
|
||||
/// Only output the outline text and xmlUrl attributes when both are present
|
||||
/// in the outline element.
|
||||
#[clap(long, group = "format", required = true)]
|
||||
rss: bool,
|
||||
|
||||
/// Print extra information while running.
|
||||
#[clap(long)]
|
||||
verbose: bool,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let cli = App::new("OPML CLI")
|
||||
.about(crate_description!())
|
||||
.author(crate_authors!())
|
||||
.version(crate_version!())
|
||||
.args(&[
|
||||
// Format flags.
|
||||
Arg::with_name("json")
|
||||
.long("json")
|
||||
.long_help("Output the OPML as JSON.")
|
||||
.takes_value(false),
|
||||
Arg::with_name("json pretty")
|
||||
.long("json-pretty")
|
||||
.long_help("Output the OPML as pretty-printed JSON.")
|
||||
.takes_value(false),
|
||||
Arg::with_name("rss")
|
||||
.long("rss")
|
||||
.long_help(
|
||||
"Only output the outline text and xmlUrl attributes \
|
||||
when both are present in the outline element.",
|
||||
)
|
||||
.takes_value(false),
|
||||
// Boolean flags.
|
||||
Arg::with_name("verbose")
|
||||
.long("verbose")
|
||||
.long_help("Print extra information while running.")
|
||||
.takes_value(false),
|
||||
// Options that are only allowed once.
|
||||
Arg::with_name("file")
|
||||
.long("file")
|
||||
.long_help("The OPML file to parse.")
|
||||
.required(true)
|
||||
.short("f")
|
||||
.takes_value(true),
|
||||
])
|
||||
.group(
|
||||
ArgGroup::with_name("format")
|
||||
.args(&["json", "json pretty", "rss"])
|
||||
.required(true),
|
||||
)
|
||||
.get_matches();
|
||||
|
||||
// Extract format flags.
|
||||
let json = cli.is_present("json");
|
||||
let json_pretty = cli.is_present("json pretty");
|
||||
let rss = cli.is_present("rss");
|
||||
|
||||
// Extract boolean flags.
|
||||
let verbose = cli.is_present("verbose");
|
||||
|
||||
// Extract the various options.
|
||||
let file = cli.value_of("file").unwrap();
|
||||
let args = Args::parse();
|
||||
|
||||
// Read the file to string.
|
||||
let xml = read_to_string(file).expect("Failed to read OPML file");
|
||||
let xml = read_to_string(args.file).expect("Failed to read OPML file");
|
||||
|
||||
// Parse the OPML from the read file.
|
||||
let opml = OPML::from_str(&xml).expect("Failed to parse OPML file");
|
||||
|
||||
if rss {
|
||||
if args.rss {
|
||||
// Get all the outlines from the OPML document.
|
||||
let outlines = extract_all_outlines(&opml.body.outlines);
|
||||
|
||||
|
@ -73,19 +46,19 @@ fn main() {
|
|||
if let Some(xml_url) = outline.xml_url {
|
||||
println!("{}", outline.text);
|
||||
println!("{}", xml_url);
|
||||
} else if verbose {
|
||||
} else if args.verbose {
|
||||
println!(
|
||||
"Skipping \"{}\" because it did not have an xmlUrl attribute.",
|
||||
outline.text
|
||||
);
|
||||
}
|
||||
}
|
||||
} else if json {
|
||||
} else if args.json {
|
||||
println!(
|
||||
"{}",
|
||||
serde_json::to_string(&opml).expect("Failed to convert OPML to JSON")
|
||||
);
|
||||
} else if json_pretty {
|
||||
} else if args.json_pretty {
|
||||
println!(
|
||||
"{}",
|
||||
serde_json::to_string_pretty(&opml)
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
use {
|
||||
assert_cmd::Command, insta::assert_display_snapshot, test_case::test_case,
|
||||
};
|
||||
|
||||
const SAMPLE: &str = "tests/sample.opml";
|
||||
|
||||
#[test_case(&["--file", SAMPLE, "--json"], "json" ; "json")]
|
||||
#[test_case(&["--file", SAMPLE, "--json-pretty"], "json_pretty" ; "json_pretty")]
|
||||
#[test_case(&["--file", SAMPLE, "--rss"], "rss" ; "rss")]
|
||||
fn test_valid(args: &[&str], name: &str) {
|
||||
let mut cmd = Command::cargo_bin("opml").unwrap();
|
||||
let assert = cmd.args(args).assert().success().code(0);
|
||||
let output = String::from_utf8(assert.get_output().stdout.clone()).unwrap();
|
||||
assert_display_snapshot!(name, output);
|
||||
}
|
||||
|
||||
#[test_case(&["--rss"], "missing_file" ; "missing_file")]
|
||||
#[test_case(&["--file", SAMPLE], "missing_format" ; "missing_format")]
|
||||
#[test_case(&["--rss", "--json"], "multiple_formats" ; "multiple_formats")]
|
||||
fn test_invalid(args: &[&'static str], name: &str) {
|
||||
let mut cmd = Command::cargo_bin("opml").unwrap();
|
||||
let assert = cmd.args(args).assert().failure().code(2);
|
||||
let output = String::from_utf8(assert.get_output().stderr.clone()).unwrap();
|
||||
assert_display_snapshot!(name, output);
|
||||
}
|
|
@ -1,27 +0,0 @@
|
|||
use std::fs::read_to_string;
|
||||
|
||||
use assert_cmd::Command;
|
||||
|
||||
const SAMPLE: &str = "tests/samples/youtube.opml";
|
||||
|
||||
#[test]
|
||||
fn test_missing_file() {
|
||||
let mut cmd = Command::cargo_bin("opml").unwrap();
|
||||
let assert = cmd.args(&["--rss"]).assert();
|
||||
|
||||
assert
|
||||
.failure()
|
||||
.code(1)
|
||||
.stderr(read_to_string("tests/snapshots/missing-file.txt").unwrap());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_missing_format() {
|
||||
let mut cmd = Command::cargo_bin("opml").unwrap();
|
||||
let assert = cmd.args(&["--file", SAMPLE]).assert();
|
||||
|
||||
assert
|
||||
.failure()
|
||||
.code(1)
|
||||
.stderr(read_to_string("tests/snapshots/missing-format.txt").unwrap());
|
||||
}
|
|
@ -1,15 +0,0 @@
|
|||
<opml version="1.1">
|
||||
<body>
|
||||
<outline text="YouTube Subscriptions"
|
||||
title="YouTube Subscriptions">
|
||||
<outline text="A YouTube Channel"
|
||||
title="A YouTube Channel"
|
||||
type="rss"
|
||||
xmlUrl="https://www.youtube.com/feeds/videos.xml?channel_id=abcdefghijklmnopqrstuvwxyz1" />
|
||||
<outline text="Another YouTube Channel"
|
||||
title="Another YouTube Channel"
|
||||
type="rss"
|
||||
xmlUrl="https://www.youtube.com/feeds/videos.xml?channel_id=abcdefghijklmnopqrstuvwxyz2" />
|
||||
</outline>
|
||||
</body>
|
||||
</opml>
|
|
@ -0,0 +1,6 @@
|
|||
---
|
||||
source: opml_cli/tests/cli.rs
|
||||
expression: output
|
||||
---
|
||||
{"version":"2.0","head":{"title":"Rust Feeds","date_created":null,"date_modified":null,"owner_name":null,"owner_email":null,"owner_id":null,"docs":null,"expansion_state":null,"vert_scroll_state":null,"window_top":null,"window_left":null,"window_bottom":null,"window_right":null},"body":{"outlines":[{"text":"Rust Blog","type":null,"is_comment":null,"is_breakpoint":null,"created":null,"category":null,"outlines":[],"xml_url":"https://blog.rust-lang.org/feed.xml","description":null,"html_url":null,"language":null,"title":null,"version":null,"url":null},{"text":"Inside Rust","type":null,"is_comment":null,"is_breakpoint":null,"created":null,"category":null,"outlines":[],"xml_url":"https://blog.rust-lang.org/inside-rust/feed.xml","description":null,"html_url":null,"language":null,"title":null,"version":null,"url":null}]}}
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
---
|
||||
source: opml_cli/tests/cli.rs
|
||||
expression: output
|
||||
---
|
||||
{
|
||||
"version": "2.0",
|
||||
"head": {
|
||||
"title": "Rust Feeds",
|
||||
"date_created": null,
|
||||
"date_modified": null,
|
||||
"owner_name": null,
|
||||
"owner_email": null,
|
||||
"owner_id": null,
|
||||
"docs": null,
|
||||
"expansion_state": null,
|
||||
"vert_scroll_state": null,
|
||||
"window_top": null,
|
||||
"window_left": null,
|
||||
"window_bottom": null,
|
||||
"window_right": null
|
||||
},
|
||||
"body": {
|
||||
"outlines": [
|
||||
{
|
||||
"text": "Rust Blog",
|
||||
"type": null,
|
||||
"is_comment": null,
|
||||
"is_breakpoint": null,
|
||||
"created": null,
|
||||
"category": null,
|
||||
"outlines": [],
|
||||
"xml_url": "https://blog.rust-lang.org/feed.xml",
|
||||
"description": null,
|
||||
"html_url": null,
|
||||
"language": null,
|
||||
"title": null,
|
||||
"version": null,
|
||||
"url": null
|
||||
},
|
||||
{
|
||||
"text": "Inside Rust",
|
||||
"type": null,
|
||||
"is_comment": null,
|
||||
"is_breakpoint": null,
|
||||
"created": null,
|
||||
"category": null,
|
||||
"outlines": [],
|
||||
"xml_url": "https://blog.rust-lang.org/inside-rust/feed.xml",
|
||||
"description": null,
|
||||
"html_url": null,
|
||||
"language": null,
|
||||
"title": null,
|
||||
"version": null,
|
||||
"url": null
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
---
|
||||
source: opml_cli/tests/cli.rs
|
||||
expression: output
|
||||
---
|
||||
error: The following required arguments were not provided:
|
||||
--file <FILE>
|
||||
--json
|
||||
--json-pretty
|
||||
|
||||
Usage: opml --file <FILE> --json --json-pretty --rss
|
||||
|
||||
For more information try '--help'
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
---
|
||||
source: opml_cli/tests/cli.rs
|
||||
expression: output
|
||||
---
|
||||
error: The following required arguments were not provided:
|
||||
--json
|
||||
--json-pretty
|
||||
--rss
|
||||
|
||||
Usage: opml --file <FILE> --json --json-pretty --rss
|
||||
|
||||
For more information try '--help'
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
---
|
||||
source: opml_cli/tests/cli.rs
|
||||
expression: output
|
||||
---
|
||||
error: The argument '--rss' cannot be used with '--json'
|
||||
|
||||
Usage: opml --file <FILE> --json --json-pretty --rss
|
||||
|
||||
For more information try '--help'
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
---
|
||||
source: opml_cli/tests/cli.rs
|
||||
expression: output
|
||||
---
|
||||
Rust Blog
|
||||
https://blog.rust-lang.org/feed.xml
|
||||
Inside Rust
|
||||
https://blog.rust-lang.org/inside-rust/feed.xml
|
||||
|
|
@ -1,57 +0,0 @@
|
|||
{
|
||||
"version": "1.1",
|
||||
"head": null,
|
||||
"body": {
|
||||
"outlines": [
|
||||
{
|
||||
"text": "YouTube Subscriptions",
|
||||
"type": null,
|
||||
"is_comment": null,
|
||||
"is_breakpoint": null,
|
||||
"created": null,
|
||||
"category": null,
|
||||
"outlines": [
|
||||
{
|
||||
"text": "A YouTube Channel",
|
||||
"type": "rss",
|
||||
"is_comment": null,
|
||||
"is_breakpoint": null,
|
||||
"created": null,
|
||||
"category": null,
|
||||
"outlines": [],
|
||||
"xml_url": "https://www.youtube.com/feeds/videos.xml?channel_id=abcdefghijklmnopqrstuvwxyz1",
|
||||
"description": null,
|
||||
"html_url": null,
|
||||
"language": null,
|
||||
"title": "A YouTube Channel",
|
||||
"version": null,
|
||||
"url": null
|
||||
},
|
||||
{
|
||||
"text": "Another YouTube Channel",
|
||||
"type": "rss",
|
||||
"is_comment": null,
|
||||
"is_breakpoint": null,
|
||||
"created": null,
|
||||
"category": null,
|
||||
"outlines": [],
|
||||
"xml_url": "https://www.youtube.com/feeds/videos.xml?channel_id=abcdefghijklmnopqrstuvwxyz2",
|
||||
"description": null,
|
||||
"html_url": null,
|
||||
"language": null,
|
||||
"title": "Another YouTube Channel",
|
||||
"version": null,
|
||||
"url": null
|
||||
}
|
||||
],
|
||||
"xml_url": null,
|
||||
"description": null,
|
||||
"html_url": null,
|
||||
"language": null,
|
||||
"title": "YouTube Subscriptions",
|
||||
"version": null,
|
||||
"url": null
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
|
@ -1 +0,0 @@
|
|||
{"version":"1.1","head":null,"body":{"outlines":[{"text":"YouTube Subscriptions","type":null,"is_comment":null,"is_breakpoint":null,"created":null,"category":null,"outlines":[{"text":"A YouTube Channel","type":"rss","is_comment":null,"is_breakpoint":null,"created":null,"category":null,"outlines":[],"xml_url":"https://www.youtube.com/feeds/videos.xml?channel_id=abcdefghijklmnopqrstuvwxyz1","description":null,"html_url":null,"language":null,"title":"A YouTube Channel","version":null,"url":null},{"text":"Another YouTube Channel","type":"rss","is_comment":null,"is_breakpoint":null,"created":null,"category":null,"outlines":[],"xml_url":"https://www.youtube.com/feeds/videos.xml?channel_id=abcdefghijklmnopqrstuvwxyz2","description":null,"html_url":null,"language":null,"title":"Another YouTube Channel","version":null,"url":null}],"xml_url":null,"description":null,"html_url":null,"language":null,"title":"YouTube Subscriptions","version":null,"url":null}]}}
|
|
@ -1,7 +0,0 @@
|
|||
error: The following required arguments were not provided:
|
||||
--file <file>
|
||||
|
||||
USAGE:
|
||||
opml --file <file> <--json|--json-pretty|--rss>
|
||||
|
||||
For more information try --help
|
|
@ -1,7 +0,0 @@
|
|||
error: The following required arguments were not provided:
|
||||
<--json|--json-pretty|--rss>
|
||||
|
||||
USAGE:
|
||||
opml [FLAGS] --file <file> <--json|--json-pretty|--rss>
|
||||
|
||||
For more information try --help
|
|
@ -1,4 +0,0 @@
|
|||
A YouTube Channel
|
||||
https://www.youtube.com/feeds/videos.xml?channel_id=abcdefghijklmnopqrstuvwxyz1
|
||||
Another YouTube Channel
|
||||
https://www.youtube.com/feeds/videos.xml?channel_id=abcdefghijklmnopqrstuvwxyz2
|
|
@ -1,38 +0,0 @@
|
|||
use std::fs::read_to_string;
|
||||
|
||||
use assert_cmd::Command;
|
||||
|
||||
const SAMPLE: &str = "tests/samples/youtube.opml";
|
||||
|
||||
#[test]
|
||||
fn test_valid_rss() {
|
||||
let mut cmd = Command::cargo_bin("opml").unwrap();
|
||||
let assert = cmd.args(&["--file", SAMPLE, "--rss"]).assert();
|
||||
|
||||
assert
|
||||
.success()
|
||||
.code(0)
|
||||
.stdout(read_to_string("tests/snapshots/rss.txt").unwrap());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_valid_json() {
|
||||
let mut cmd = Command::cargo_bin("opml").unwrap();
|
||||
let assert = cmd.args(&["--file", SAMPLE, "--json"]).assert();
|
||||
|
||||
assert
|
||||
.success()
|
||||
.code(0)
|
||||
.stdout(read_to_string("tests/snapshots/json.json").unwrap());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_valid_json_pretty() {
|
||||
let mut cmd = Command::cargo_bin("opml").unwrap();
|
||||
let assert = cmd.args(&["--file", SAMPLE, "--json-pretty"]).assert();
|
||||
|
||||
assert
|
||||
.success()
|
||||
.code(0)
|
||||
.stdout(read_to_string("tests/snapshots/json-pretty.json").unwrap());
|
||||
}
|
Loading…
Reference in New Issue