From ea3afabf8053fa3a2a02ccc6f958b7acf964f1ae Mon Sep 17 00:00:00 2001 From: "Daniel P. Clark" <6ftdan@gmail.com> Date: Sat, 29 Dec 2018 13:22:04 -0500 Subject: [PATCH 1/3] init encoding --- Cargo.lock | 23 +++++++--- Cargo.toml | 4 +- src/basename.rs | 83 +++++++++++++++++------------------ src/cleanpath_aggressive.rs | 2 +- src/cleanpath_conservative.rs | 4 +- src/helpers.rs | 9 +++- src/pathname.rs | 5 ++- 7 files changed, 73 insertions(+), 57 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0f6b778..199414c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,15 +2,18 @@ name = "faster_path" version = "0.0.1" dependencies = [ - "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rutie 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rutie 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "lazy_static" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "version_check 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "libc" @@ -32,17 +35,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "rutie" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "version_check" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + [metadata] -"checksum lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fb497c35d362b6a331cfd94956a07fc2c78a4604cdbee844a81170386b996dd3" +"checksum lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca488b89a5657b0a2ecd45b95609b3e848cf1755da332a0da46e2b2b1cb371a7" "checksum libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "b685088df2b950fccadf07a7187c8ef846a959c142338a48f9dc0b94517eb5f1" "checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d" "checksum pkg-config 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)" = "6a52e4dbc8354505ee07e484ab07127e06d87ca6fa7f0a516a2b294e5ad5ad16" -"checksum rutie 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "73e4e90a68faf49665a1318f6f1700eb724ac5eb930824d8b88533a52a0778b8" +"checksum rutie 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "28cc2e57a7055fce181a18738d23a8e940d9379d79043999c5a45a5f7662292c" +"checksum version_check 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7716c242968ee87e5542f8021178248f267f295a5c4803beae8b8b7fd9bc6051" diff --git a/Cargo.toml b/Cargo.toml index 0d1ef51..a2afc7b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,6 @@ name = "faster_path" crate-type = ["dylib"] [dependencies] -rutie = "0.3.2" -lazy_static = "1.0" +rutie = "0.3.3" +lazy_static = "1.1" memchr = "2.0.1" diff --git a/src/basename.rs b/src/basename.rs index a663e52..6c03b0e 100644 --- a/src/basename.rs +++ b/src/basename.rs @@ -4,25 +4,24 @@ use self::memchr::memrchr; use path_parsing::{find_last_sep_pos, find_last_non_sep_pos}; -pub fn basename<'a>(path: &'a str, ext: &str) -> &'a str { - let bytes: &[u8] = path.as_bytes(); +pub fn basename<'a>(path: &'a [u8], ext: &str) -> &'a [u8] { let mut left: usize = 0; - let mut right: usize = bytes.len(); - if let Some(last_slash_pos) = find_last_sep_pos(bytes) { + let mut right: usize = path.len(); + if let Some(last_slash_pos) = find_last_sep_pos(path) { if last_slash_pos == right - 1 { - if let Some(pos) = find_last_non_sep_pos(&bytes[..last_slash_pos]) { + if let Some(pos) = find_last_non_sep_pos(&path[..last_slash_pos]) { right = pos + 1; } else { - return "/"; + return "/".as_bytes(); } - if let Some(pos) = find_last_sep_pos(&bytes[..right]) { + if let Some(pos) = find_last_sep_pos(&path[..right]) { left = pos + 1; } } else { left = last_slash_pos + 1; } } - &path[left..left + ext_end(&bytes[left..right], ext)] + &path[left..left + ext_end(&path[left..right], ext)] } fn ext_end(slice: &[u8], ext: &str) -> usize { @@ -44,103 +43,103 @@ fn ext_end(slice: &[u8], ext: &str) -> usize { #[test] fn non_dot_asterisk_ext() { // This is undocumented Ruby functionality. We match it in case some code out there relies on it. - assert_eq!(basename("abc", "b*"), "a"); - assert_eq!(basename("abc", "abc"), "abc"); - assert_eq!(basename("abc", "a*"), "abc"); - assert_eq!(basename("playlist", "l*"), "play"); + assert_eq!(basename("abc".as_bytes(), "b*"), b"a"); + assert_eq!(basename("abc".as_bytes(), "abc"), b"abc"); + assert_eq!(basename("abc".as_bytes(), "a*"), b"abc"); + assert_eq!(basename("playlist".as_bytes(), "l*"), b"play"); // Treated as literal "*": - assert_eq!(basename("playlist", "yl*"), "playlist"); - assert_eq!(basename("playl*", "yl*"), "pla"); + assert_eq!(basename("playlist".as_bytes(), "yl*"), b"playlist"); + assert_eq!(basename("playl*".as_bytes(), "yl*"), b"pla"); } #[test] fn empty() { - assert_eq!(basename("", ""), ""); - assert_eq!(basename("", ".*"), ""); - assert_eq!(basename("", ".a"), ""); + assert_eq!(basename("".as_bytes(), ""), b""); + assert_eq!(basename("".as_bytes(), ".*"), b""); + assert_eq!(basename("".as_bytes(), ".a"), b""); } #[test] fn sep() { - assert_eq!(basename("/", ""), "/"); - assert_eq!(basename("//", ""), "/"); + assert_eq!(basename("/".as_bytes(), ""), b"/"); + assert_eq!(basename("//".as_bytes(), ""), b"/"); } #[test] fn trailing_dot() { - assert_eq!(basename("file.test.", ""), "file.test."); - assert_eq!(basename("file.test.", "."), "file.test"); - assert_eq!(basename("file.test.", ".*"), "file.test"); + assert_eq!(basename("file.test.".as_bytes(), ""), b"file.test."); + assert_eq!(basename("file.test.".as_bytes(), "."), b"file.test"); + assert_eq!(basename("file.test.".as_bytes(), ".*"), b"file.test"); } #[test] fn trailing_dot_dot() { - assert_eq!(basename("a..", ".."), "a"); - assert_eq!(basename("a..", ".*"), "a."); + assert_eq!(basename("a..".as_bytes(), ".."), b"a"); + assert_eq!(basename("a..".as_bytes(), ".*"), b"a."); } #[test] fn dot() { - assert_eq!(basename(".", ""), "."); - assert_eq!(basename(".", "."), "."); - assert_eq!(basename(".", ".*"), "."); + assert_eq!(basename(".".as_bytes(), ""), b"."); + assert_eq!(basename(".".as_bytes(), "."), b"."); + assert_eq!(basename(".".as_bytes(), ".*"), b"."); } #[test] fn dot_dot() { - assert_eq!(basename("..", ""), ".."); - assert_eq!(basename("..", ".*"), ".."); - assert_eq!(basename("..", ".."), ".."); - assert_eq!(basename("..", "..."), ".."); + assert_eq!(basename("..".as_bytes(), ""), b".."); + assert_eq!(basename("..".as_bytes(), ".*"), b".."); + assert_eq!(basename("..".as_bytes(), ".."), b".."); + assert_eq!(basename("..".as_bytes(), "..."), b".."); } #[test] fn non_dot_ext() { - assert_eq!(basename("abc", "bc"), "a"); + assert_eq!(basename("abc".as_bytes(), "bc"), b"a"); } #[test] fn basename_eq_ext() { - assert_eq!(basename(".x", ".x"), ".x"); - assert_eq!(basename(".x", ".*"), ".x"); + assert_eq!(basename(".x".as_bytes(), ".x"), b".x"); + assert_eq!(basename(".x".as_bytes(), ".*"), b".x"); } #[test] fn absolute() { - assert_eq!(basename("/a/b///c", ""), "c"); + assert_eq!(basename("/a/b///c".as_bytes(), ""), b"c"); } #[test] fn trailing_slashes_absolute() { - assert_eq!(basename("/a/b///c//////", ""), "c"); + assert_eq!(basename("/a/b///c//////".as_bytes(), ""), b"c"); } #[test] fn relative() { - assert_eq!(basename("b///c", ""), "c"); + assert_eq!(basename("b///c".as_bytes(), ""), b"c"); } #[test] fn trailing_slashes_relative() { - assert_eq!(basename("b/c//", ""), "c"); + assert_eq!(basename("b/c//".as_bytes(), ""), b"c"); } #[test] fn root() { - assert_eq!(basename("//c", ""), "c"); + assert_eq!(basename("//c".as_bytes(), ""), b"c"); } #[test] fn trailing_slashes_root() { - assert_eq!(basename("//c//", ""), "c"); + assert_eq!(basename("//c//".as_bytes(), ""), b"c"); } #[test] fn trailing_slashes_relative_root() { - assert_eq!(basename("c//", ""), "c"); + assert_eq!(basename("c//".as_bytes(), ""), b"c"); } #[test] fn edge_case_all_seps() { - assert_eq!("/", basename("///", ".*")); + assert_eq!(b"/", basename("///".as_bytes(), ".*")); } diff --git a/src/cleanpath_aggressive.rs b/src/cleanpath_aggressive.rs index d976301..7628883 100644 --- a/src/cleanpath_aggressive.rs +++ b/src/cleanpath_aggressive.rs @@ -27,7 +27,7 @@ pub fn cleanpath_aggressive(path: &str) -> Cow { // pre.tr!(File::ALT_SEPARATOR, File::SEPARATOR) if File::ALT_SEPARATOR // ``` // - if contains_sep(basename(&prefix, "").as_bytes()) { + if contains_sep(basename(&prefix.as_bytes(), "")) { let len = names.iter().rposition(|&c| c != "..").map_or(0, |pos| pos + 1); names.truncate(len); } diff --git a/src/cleanpath_conservative.rs b/src/cleanpath_conservative.rs index f4c7b87..9e48e6c 100644 --- a/src/cleanpath_conservative.rs +++ b/src/cleanpath_conservative.rs @@ -21,7 +21,7 @@ pub fn cleanpath_conservative(path: &str) -> Cow { // pre.tr!(File::ALT_SEPARATOR, File::SEPARATOR) if File::ALT_SEPARATOR // ``` // - if contains_sep(basename(&prefix, "").as_bytes()) { + if contains_sep(basename(&prefix.as_bytes(), "")) { let len = names.iter().rposition(|&c| c != "..").map_or(0, |pos| pos + 1); names.truncate(len); } @@ -31,7 +31,7 @@ pub fn cleanpath_conservative(path: &str) -> Cow { None => return dirname(&prefix).into(), }; - if last_name != ".." && basename(&path, "") == "." { + if last_name != ".." && basename(&path.as_bytes(), "") == ".".as_bytes() { names.reverse(); names.push("."); } else if last_name != "." && last_name != ".." && diff --git a/src/helpers.rs b/src/helpers.rs index 9f8be24..dd73ce2 100644 --- a/src/helpers.rs +++ b/src/helpers.rs @@ -44,7 +44,14 @@ pub fn anyobject_to_string(item: AnyObject) -> Result { pub fn to_str(maybe_string: &MaybeString) -> &str { match maybe_string { - &Ok(ref rutie_string) => rutie_string.to_str(), + &Ok(ref rutie_string) => rutie_string.to_str_unchecked(), &Err(_) => "", } } + +pub fn to_bytes(maybe_string: &MaybeString) -> &[u8] { + match maybe_string { + &Ok(ref rutie_string) => rutie_string.to_bytes_unchecked(), + &Err(_) => &[], + } +} diff --git a/src/pathname.rs b/src/pathname.rs index 535faaf..b5bf4fd 100644 --- a/src/pathname.rs +++ b/src/pathname.rs @@ -8,7 +8,7 @@ use extname; use plus; use relative_path_from; use debug; -use helpers::{TryFrom, to_str}; +use helpers::{TryFrom, to_str, to_bytes}; use path_parsing::{SEP, find_last_non_sep_pos}; use rutie; @@ -23,6 +23,7 @@ use rutie::{ VerifiedObject, Exception as Exc, AnyException as Exception, + Encoding, }; use rutie::types::{Value, ValueType}; use std::borrow::Cow; @@ -105,7 +106,7 @@ pub fn pn_is_absolute(pth: MaybeString) -> Boolean { // pub fn pn_ascend(){} pub fn pn_basename(pth: MaybeString, ext: MaybeString) -> RString { - RString::new_utf8(basename::basename(to_str(&pth), to_str(&ext))) + RString::from_bytes(basename::basename(to_bytes(&pth), to_str(&ext)), &Encoding::utf8()) } pub fn pn_children(pth: MaybeString, with_dir: MaybeBoolean) -> Result { From c4e9cf33757bbe7e45b6bf2a6cce4277f36d4344 Mon Sep 17 00:00:00 2001 From: "Daniel P. Clark" <6ftdan@gmail.com> Date: Sat, 29 Dec 2018 13:52:38 -0500 Subject: [PATCH 2/3] bundle exec on mspec --- Rakefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Rakefile b/Rakefile index bda11b8..6b6d3f1 100644 --- a/Rakefile +++ b/Rakefile @@ -62,17 +62,17 @@ task :init_mspec do |_t| end task test: [:cargo, :minitest, :lint, :pbench, :init_mspec] do |_t| - exec 'spec/mspec/bin/mspec --format spec core/file/basename core/file/extname core/file/dirname library/pathname' + exec 'bundle exec spec/mspec/bin/mspec --format spec core/file/basename core/file/extname core/file/dirname library/pathname' end desc "Full mspec results w/o encoding" task mspec_full: :init_mspec do - exec %(bash -c "TEST_MONKEYPATCHES=true WITH_REGRESSION=true spec/mspec/bin/mspec --format spec core/file/basename core/file/extname core/file/dirname library/pathname") + exec %(bash -c "TEST_MONKEYPATCHES=true WITH_REGRESSION=true bundle exec spec/mspec/bin/mspec --format spec core/file/basename core/file/extname core/file/dirname library/pathname") end desc "Full mspec results w/ encoding" task mspec_encoding_full: :init_mspec do - exec %(bash -c "ENCODING=1 TEST_MONKEYPATCHES=true WITH_REGRESSION=true mspec --format spec core/file/basename core/file/extname core/file/dirname library/pathname") + exec %(bash -c "ENCODING=1 TEST_MONKEYPATCHES=true WITH_REGRESSION=true bundle exec spec/mspec/bin/mspec --format spec core/file/basename core/file/extname core/file/dirname library/pathname") end Rake::TestTask.new(bench: :build_lib) do |t| From 65029e45947e253cb741537dd23d257d9f39ad1b Mon Sep 17 00:00:00 2001 From: "Daniel P. Clark" <6ftdan@gmail.com> Date: Sat, 29 Dec 2018 13:53:04 -0500 Subject: [PATCH 3/3] bump dependencies --- Cargo.lock | 31 ++++++++++++++++++------------- Cargo.toml | 6 +++--- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 199414c..d8cbbdc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,19 +1,21 @@ +[[package]] +name = "cfg-if" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "faster_path" version = "0.0.1" dependencies = [ - "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rutie 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rutie 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "lazy_static" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "version_check 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "libc" @@ -22,10 +24,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "memchr" -version = "2.0.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -35,10 +39,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "rutie" -version = "0.3.3" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -49,9 +53,10 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] -"checksum lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca488b89a5657b0a2ecd45b95609b3e848cf1755da332a0da46e2b2b1cb371a7" +"checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4" +"checksum lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a374c89b9db55895453a74c1e38861d9deec0b01b405a82516e9d5de4820dea1" "checksum libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "b685088df2b950fccadf07a7187c8ef846a959c142338a48f9dc0b94517eb5f1" -"checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d" +"checksum memchr 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "db4c41318937f6e76648f42826b1d9ade5c09cafb5aef7e351240a70f39206e9" "checksum pkg-config 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)" = "6a52e4dbc8354505ee07e484ab07127e06d87ca6fa7f0a516a2b294e5ad5ad16" -"checksum rutie 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "28cc2e57a7055fce181a18738d23a8e940d9379d79043999c5a45a5f7662292c" +"checksum rutie 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2f54c48ad7edd45ec5abacc506f7a2488d4700cd0aa32c98fe6fe096f1f8f72f" "checksum version_check 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7716c242968ee87e5542f8021178248f267f295a5c4803beae8b8b7fd9bc6051" diff --git a/Cargo.toml b/Cargo.toml index a2afc7b..41309a6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,6 @@ name = "faster_path" crate-type = ["dylib"] [dependencies] -rutie = "0.3.3" -lazy_static = "1.1" -memchr = "2.0.1" +rutie = "0.5.2" +lazy_static = "1.2" +memchr = "2.1.2"