faster_path 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Cargo.toml +0 -1
- data/README.md +3 -0
- data/lib/faster_path/optional/monkeypatches.rb +2 -2
- data/lib/faster_path/optional/refinements.rb +2 -2
- data/lib/faster_path/version.rb +1 -1
- data/lib/faster_path.rb +2 -2
- data/src/basename.rs +85 -14
- data/src/lib.rs +1 -7
- metadata +1 -2
- data/src/tools/chomp_pathish_regex.rs +0 -38
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b2f9feadf34476752439130f2871285f20bd67d5
|
4
|
+
data.tar.gz: 184c00898cdca31bc822bf9c0023ca24f729c839
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 963c1a8874494f241daeb36c791c0136107be377df03739276b1e1c3b354a352616972c72ac137192cade9d8168ec5f863d1aaeb2c7974a949887f018652ce53
|
7
|
+
data.tar.gz: f66e104da591aa1b690eedbc5dca48eb636c0cdb27d5d150b3425d67e6e6c568932cf0474fd80915fae6d477715af85337d54a93065561db9fb03d404d0910ee
|
data/Cargo.toml
CHANGED
data/README.md
CHANGED
@@ -3,6 +3,8 @@
|
|
3
3
|
[![Build Status](https://travis-ci.org/danielpclark/faster_path.svg?branch=master)](https://travis-ci.org/danielpclark/faster_path)
|
4
4
|
[![Tweet This](https://raw.githubusercontent.com/danielpclark/faster_path/master/assets/tweet.png)](https://twitter.com/share?url=https%3A%2F%2Fgithub.com%2Fdanielpclark%2Ffaster_path&via=6ftdan&hashtags=Ruby&text=You%20could%20save%2015%25%20or%20more%20on%20website%20load%20time%20by%20switching%20to%20the%20FasterPath%20gem.)
|
5
5
|
|
6
|
+
_Build is currently failing is for the monkey-patch tests only._
|
7
|
+
|
6
8
|
#### As of gem version 0.0.9 this shaves off 66% of my Rails applications page load time.
|
7
9
|
|
8
10
|
The primary **GOAL** of this project is to improve performance in the most heavily used areas of Ruby as
|
@@ -85,6 +87,7 @@ Current methods implemented:
|
|
85
87
|
|FasterPath Rust Implementation|Ruby 2.3.1 Implementation|Performance Improvement|
|
86
88
|
|---|---|:---:|
|
87
89
|
| `FasterPath.absolute?` | `Pathname#absolute?` | 1234.6% |
|
90
|
+
| `FasterPath.basename` | `File.basename` | 31.3% |
|
88
91
|
| `FasterPath.chop_basename` | `Pathname#chop_basename` | 46.7% |
|
89
92
|
| `FasterPath.relative?` | `Pathname#relative?` | 1262.3% |
|
90
93
|
| `FasterPath.blank?` | | |
|
@@ -3,9 +3,9 @@ module FasterPath
|
|
3
3
|
refine File do
|
4
4
|
def basename(pth)
|
5
5
|
FasterPath.basename(pth)
|
6
|
-
end
|
6
|
+
end
|
7
7
|
end
|
8
|
-
end
|
8
|
+
end
|
9
9
|
|
10
10
|
module RefinePathname
|
11
11
|
refine Pathname do
|
data/lib/faster_path/version.rb
CHANGED
data/lib/faster_path.rb
CHANGED
@@ -28,7 +28,7 @@ module FasterPath
|
|
28
28
|
|
29
29
|
def self.basename(pth, ext="")
|
30
30
|
Rust.basename(pth, ext)
|
31
|
-
end
|
31
|
+
end
|
32
32
|
|
33
33
|
# EXAMPLE
|
34
34
|
#def self.one_and_two
|
@@ -56,7 +56,7 @@ module FasterPath
|
|
56
56
|
attach_function :is_relative, [ :string ], :bool
|
57
57
|
attach_function :is_blank, [ :string ], :bool
|
58
58
|
attach_function :both_are_blank, [ :string, :string ], :bool
|
59
|
-
|
59
|
+
attach_function :basename, [ :string, :string ], :string
|
60
60
|
attach_function :dirname, [ :string ], :string
|
61
61
|
attach_function :basename_for_chop, [ :string ], :string # decoupling behavior
|
62
62
|
attach_function :dirname_for_chop, [ :string ], :string # decoupling behavior
|
data/src/basename.rs
CHANGED
@@ -1,22 +1,93 @@
|
|
1
|
-
#[
|
2
|
-
|
1
|
+
#[allow(dead_code)]
|
2
|
+
fn rubyish_basename(string: &str, globish_string: &str) -> String {
|
3
|
+
let result = if globish_string.chars().next().unwrap_or("muffins".chars().next().unwrap()).eq(&".".chars().next().unwrap()) {
|
4
|
+
if globish_string == ".*" {
|
5
|
+
let base = string.rsplit_terminator(MAIN_SEPARATOR).nth(0).unwrap_or("");
|
6
|
+
let index = base.rfind(".");
|
7
|
+
let (first, _) = base.split_at(index.unwrap());
|
8
|
+
first
|
9
|
+
} else {
|
10
|
+
if &string[string.len()-globish_string.len()..] == globish_string {
|
11
|
+
&string[0..string.len()-globish_string.len()]
|
12
|
+
} else {
|
13
|
+
string
|
14
|
+
}.rsplit_terminator(MAIN_SEPARATOR).nth(0).unwrap_or("")
|
15
|
+
}
|
16
|
+
} else {
|
17
|
+
if &string[string.len()-globish_string.len()..] == globish_string {
|
18
|
+
&string[0..string.len()-globish_string.len()]
|
19
|
+
} else {
|
20
|
+
string
|
21
|
+
}.rsplit_terminator(MAIN_SEPARATOR).nth(0).unwrap_or("")
|
22
|
+
};
|
23
|
+
result.to_string()
|
24
|
+
}
|
25
|
+
|
26
|
+
#[test]
|
27
|
+
fn it_chomps_strings_correctly(){
|
28
|
+
assert_eq!(rubyish_basename("","") , "");
|
29
|
+
assert_eq!(rubyish_basename("ruby","") , "ruby");
|
30
|
+
assert_eq!(rubyish_basename("ruby.rb",".rb") , "ruby");
|
31
|
+
assert_eq!(rubyish_basename("ruby.rb",".*") , "ruby");
|
32
|
+
assert_eq!(rubyish_basename(".ruby/ruby.rb",".rb") , "ruby");
|
33
|
+
assert_eq!(rubyish_basename(".ruby/ruby.rb.swp",".rb") , "ruby.rb.swp");
|
34
|
+
assert_eq!(rubyish_basename(".ruby/ruby.rb.swp",".swp") , "ruby.rb");
|
35
|
+
assert_eq!(rubyish_basename(".ruby/ruby.rb.swp",".*") , "ruby.rb");
|
36
|
+
assert_eq!(rubyish_basename("asdf/asdf.rb.swp","") , "asdf.rb.swp");
|
37
|
+
assert_eq!(rubyish_basename("asdf/asdf.rb.swp", ".*") , "asdf.rb");
|
38
|
+
assert_eq!(rubyish_basename("asdf/asdf.rb.swp", "*") , "asdf.rb.swp");
|
39
|
+
assert_eq!(rubyish_basename("asdf/asdf.rb.swp", ".") , "asdf.rb.swp");
|
40
|
+
assert_eq!(rubyish_basename("asdf/asdf.rb.swp", ".*") , "asdf.rb");
|
41
|
+
assert_eq!(rubyish_basename("asdf/asdf.rb.swp", ".rb") , "asdf.rb.swp");
|
42
|
+
assert_eq!(rubyish_basename("asdf/asdf.rb.swp", ".swp") , "asdf.rb");
|
43
|
+
assert_eq!(rubyish_basename("asdf/asdf.rb.swp", ".sw") , "asdf.rb.swp");
|
44
|
+
assert_eq!(rubyish_basename("asdf/asdf.rb.swp", ".sw*") , "asdf.rb.swp");
|
45
|
+
assert_eq!(rubyish_basename("asdf/asdf.rb.swp", ".rb.s*") , "asdf.rb.swp");
|
46
|
+
assert_eq!(rubyish_basename("asdf/asdf.rb.swp", ".s*") , "asdf.rb.swp");
|
47
|
+
assert_eq!(rubyish_basename("asdf/asdf.rb.swp", ".s**") , "asdf.rb.swp");
|
48
|
+
assert_eq!(rubyish_basename("asdf/asdf.rb.swp", ".**") , "asdf.rb.swp");
|
49
|
+
assert_eq!(rubyish_basename("asdf/asdf.rb.swp", ".*") , "asdf.rb");
|
50
|
+
assert_eq!(rubyish_basename("asdf/asdf.rb.swp", ".*.*") , "asdf.rb.swp");
|
51
|
+
assert_eq!(rubyish_basename("asdf/asdf.rb.swp", ".rb.swp") , "asdf");
|
52
|
+
assert_eq!(rubyish_basename("asdf/asdf.rb.swp", ".rb.s*p") , "asdf.rb.swp");
|
53
|
+
assert_eq!(rubyish_basename("asdf/asdf.rb.swp", ".r*.s*p") , "asdf.rb.swp");
|
54
|
+
assert_eq!(rubyish_basename("asdf/asdf.rb.swp", ".r*.sw*p") , "asdf.rb.swp");
|
55
|
+
assert_eq!(rubyish_basename("asdf/asdf.rb.swp", ".r*b.sw*p") , "asdf.rb.swp");
|
56
|
+
assert_eq!(rubyish_basename("asdf/asdf.rb.swp", "rb.swp") , "asdf.");
|
57
|
+
}
|
58
|
+
|
59
|
+
//#[no_mangle]
|
60
|
+
pub extern fn basename(str_pth: *const c_char, comp_ext: *const c_char) -> *const c_char {
|
3
61
|
let c_str1 = unsafe {
|
4
|
-
assert!(!
|
5
|
-
CStr::from_ptr(
|
62
|
+
assert!(!str_pth.is_null());
|
63
|
+
CStr::from_ptr(str_pth)
|
6
64
|
};
|
7
65
|
let c_str2 = unsafe {
|
8
66
|
assert!(!comp_ext.is_null());
|
9
67
|
CStr::from_ptr(comp_ext)
|
10
68
|
};
|
11
|
-
let
|
12
|
-
let
|
13
|
-
|
14
|
-
let r_str = if !r_str_chomp.is_empty() {
|
15
|
-
chomp_pathish_regex(r_str, r_str_chomp)
|
16
|
-
} else { r_str.to_string() };
|
69
|
+
let string = str::from_utf8(c_str1.to_bytes()).unwrap();
|
70
|
+
let globish_string = str::from_utf8(c_str2.to_bytes()).unwrap();
|
17
71
|
|
18
|
-
let
|
19
|
-
|
20
|
-
|
21
|
-
|
72
|
+
let result = if globish_string.chars().next().unwrap_or("muffins".chars().next().unwrap()).eq(&".".chars().next().unwrap()) {
|
73
|
+
if globish_string == ".*" {
|
74
|
+
let base = string.rsplit_terminator(MAIN_SEPARATOR).nth(0).unwrap_or("");
|
75
|
+
let index = base.rfind(".");
|
76
|
+
let (first, _) = base.split_at(index.unwrap());
|
77
|
+
first
|
78
|
+
} else {
|
79
|
+
if &string[string.len()-globish_string.len()..] == globish_string {
|
80
|
+
&string[0..string.len()-globish_string.len()]
|
81
|
+
} else {
|
82
|
+
string
|
83
|
+
}.rsplit_terminator(MAIN_SEPARATOR).nth(0).unwrap_or("")
|
84
|
+
}
|
85
|
+
} else {
|
86
|
+
if &string[string.len()-globish_string.len()..] == globish_string {
|
87
|
+
&string[0..string.len()-globish_string.len()]
|
88
|
+
} else {
|
89
|
+
string
|
90
|
+
}.rsplit_terminator(MAIN_SEPARATOR).nth(0).unwrap_or("")
|
91
|
+
};
|
92
|
+
CString::new(result).unwrap().into_raw()
|
22
93
|
}
|
data/src/lib.rs
CHANGED
@@ -5,7 +5,6 @@
|
|
5
5
|
// http://opensource.org/licenses/MIT>, at your option. This file may not be
|
6
6
|
// copied, modified, or distributed except according to those terms.
|
7
7
|
extern crate libc;
|
8
|
-
//extern crate regex;
|
9
8
|
|
10
9
|
use std::path::{Path,MAIN_SEPARATOR};
|
11
10
|
use libc::c_char;
|
@@ -13,18 +12,13 @@ use std::ffi::{CStr,CString,OsStr};
|
|
13
12
|
use std::str;
|
14
13
|
use std::mem;
|
15
14
|
|
16
|
-
// Not including regex in current build so chomp_pathish_regex
|
17
|
-
// and basename will be excluded in build
|
18
|
-
//include!("tools/chomp_pathish_regex.rs");
|
19
|
-
//include!("basename.rs");
|
20
|
-
|
21
|
-
|
22
15
|
include!("ruby_string.rs");
|
23
16
|
include!("ruby_array.rs");
|
24
17
|
include!("is_absolute.rs");
|
25
18
|
include!("is_relative.rs");
|
26
19
|
include!("is_blank.rs");
|
27
20
|
include!("both_are_blank.rs");
|
21
|
+
include!("basename.rs");
|
28
22
|
include!("dirname.rs");
|
29
23
|
include!("basename_for_chop.rs");
|
30
24
|
include!("dirname_for_chop.rs");
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: faster_path
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel P. Clark
|
@@ -143,7 +143,6 @@ files:
|
|
143
143
|
- src/lib.rs
|
144
144
|
- src/ruby_array.rs
|
145
145
|
- src/ruby_string.rs
|
146
|
-
- src/tools/chomp_pathish_regex.rs
|
147
146
|
homepage: https://github.com/danielpclark/faster_path
|
148
147
|
licenses:
|
149
148
|
- MIT OR Apache-2.0
|
@@ -1,38 +0,0 @@
|
|
1
|
-
fn chomp_pathish_regex(string: &str, globish_string: &str) -> String {
|
2
|
-
use regex::Regex;
|
3
|
-
// Keep first match of Regex pattern
|
4
|
-
// \A(?:(.*)(?:\.{1}\w+)|(.*))\z
|
5
|
-
let mut reg_builder: String = String::with_capacity(globish_string.len()+30); // need 29 chars + gs
|
6
|
-
reg_builder.push_str(r"\A(?:(.*)");
|
7
|
-
if globish_string.len() != 0 {
|
8
|
-
let mut gs = globish_string.chars();
|
9
|
-
loop {
|
10
|
-
match gs.next() {
|
11
|
-
Some('.') => { reg_builder.push_str(r"(?:\.{1}") },
|
12
|
-
Some('*') => { reg_builder.push_str(r"\w+") },
|
13
|
-
Some(x) => { reg_builder.push(x) },
|
14
|
-
None => {
|
15
|
-
reg_builder.push_str(r")|(.*)");
|
16
|
-
break
|
17
|
-
},
|
18
|
-
}
|
19
|
-
}
|
20
|
-
}
|
21
|
-
reg_builder.push_str(r")\z");
|
22
|
-
|
23
|
-
let re = Regex::new(®_builder[..]).unwrap();
|
24
|
-
let caps = re.captures(string).unwrap();
|
25
|
-
caps.at(1).unwrap_or(caps.at(0).unwrap_or("")).to_string()
|
26
|
-
}
|
27
|
-
|
28
|
-
#[test]
|
29
|
-
fn it_chomps_strings_correctly(){
|
30
|
-
assert_eq!(chomp_pathish_regex("",""), "");
|
31
|
-
assert_eq!(chomp_pathish_regex("ruby",""), "ruby");
|
32
|
-
assert_eq!(chomp_pathish_regex("ruby.rb",".rb"), "ruby");
|
33
|
-
assert_eq!(chomp_pathish_regex("ruby.rb",".*"), "ruby");
|
34
|
-
assert_eq!(chomp_pathish_regex(".ruby/ruby.rb",".rb"), ".ruby/ruby");
|
35
|
-
assert_eq!(chomp_pathish_regex(".ruby/ruby.rb.swp",".rb"), ".ruby/ruby.rb.swp");
|
36
|
-
assert_eq!(chomp_pathish_regex(".ruby/ruby.rb.swp",".swp"), ".ruby/ruby.rb");
|
37
|
-
assert_eq!(chomp_pathish_regex(".ruby/ruby.rb.swp",".*"), ".ruby/ruby.rb");
|
38
|
-
}
|