faster_path 0.1.12 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c5bfc3ff4266b588930207d414eeb0eb1ae7b8d7
4
- data.tar.gz: 58191c69400ca14fdbdd0ce4d5c8ed7666e9674e
3
+ metadata.gz: 8f1b4b37c294db2912d786c35de76f60cba0b6a9
4
+ data.tar.gz: 46af8f1bb6c06baed02866d6f9777bb9dfb6f1ff
5
5
  SHA512:
6
- metadata.gz: af28e5efb74251311e18af3991b99d08550f40961116738641f39b1c883d4ac0248547563210cd32c67ff87705da21ef7de7a7fbf02783c66625867bec79b0d3
7
- data.tar.gz: 763bc9c1199eec48b708f00e5f68d4dba2e110c17d587b627a6148cfd06f2a134ea1e9a5a3f7d2db8574cce5ee3de1438527496d5f0b72bd30a3c02fe0272d83
6
+ metadata.gz: c6d51a6c3a7796aa41063ee31a3c0f05c88df32350f5fbc2f0913553c9fdaf6ab5600475594d3e9dc3706df49785f5bfc0e0ed0de4b29d169e166abd1acf4f45
7
+ data.tar.gz: 96b16a98d9e807e33669956d6adb879f57d5e976def60c2d11502b9107a601bf793cfe75148f56e2e6c99b3b3af7745434e5c166d40c1b902b911efd797a0b65
data/Cargo.lock CHANGED
@@ -2,20 +2,20 @@
2
2
  name = "faster_path"
3
3
  version = "0.0.1"
4
4
  dependencies = [
5
- "array_tool 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
6
- "libc 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
5
+ "array_tool 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
6
+ "libc 0.2.30 (registry+https://github.com/rust-lang/crates.io-index)",
7
7
  ]
8
8
 
9
9
  [[package]]
10
10
  name = "array_tool"
11
- version = "0.3.8"
11
+ version = "0.4.1"
12
12
  source = "registry+https://github.com/rust-lang/crates.io-index"
13
13
 
14
14
  [[package]]
15
15
  name = "libc"
16
- version = "0.2.11"
16
+ version = "0.2.30"
17
17
  source = "registry+https://github.com/rust-lang/crates.io-index"
18
18
 
19
19
  [metadata]
20
- "checksum array_tool 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "10ef6b307cf6a0a6c1a7e3dbb4e9315cc79d2e2d27c2d9674413738686b63e62"
21
- "checksum libc 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "c96061f0c8a2dc27482e394d82e23073569de41d73cd736672ccd3e5c7471bfd"
20
+ "checksum array_tool 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1a07ccb27c611e5cda99e498e99ba71b3ecdb7db5df02096cef42a3df5b84542"
21
+ "checksum libc 0.2.30 (registry+https://github.com/rust-lang/crates.io-index)" = "2370ca07ec338939e356443dac2296f581453c35fe1e3a3ed06023c49435f915"
data/Cargo.toml CHANGED
@@ -13,5 +13,5 @@ name = "faster_path"
13
13
  crate-type = ["dylib"]
14
14
 
15
15
  [dependencies]
16
- libc = "0.2.11"
17
- array_tool = "0.3.8"
16
+ libc = "0.2.30"
17
+ array_tool = "0.4.1"
data/Gemfile CHANGED
@@ -5,11 +5,3 @@ source 'https://rubygems.org' do
5
5
  gem 'coveralls', require: false
6
6
  end
7
7
  end
8
-
9
- begin
10
- # https://github.com/ruby/spec dependencies
11
- eval_gemfile File.expand_path('spec/ruby_spec/Gemfile', File.dirname(__FILE__))
12
- rescue
13
- `git submodule update --init`
14
- eval_gemfile File.expand_path('spec/ruby_spec/Gemfile', File.dirname(__FILE__))
15
- end
data/README.md CHANGED
@@ -113,7 +113,7 @@ curl -sSf https://static.rust-lang.org/rustup.sh | sh
113
113
  Add this line to your application's Gemfile:
114
114
 
115
115
  ```ruby
116
- gem 'faster_path', '~> 0.1.0'
116
+ gem 'faster_path', '~> 0.1.13'
117
117
  ```
118
118
 
119
119
  And then execute:
@@ -143,7 +143,6 @@ Current methods implemented:
143
143
  | `FasterPath.absolute?` | `Pathname#absolute?` | 93.9% |
144
144
  | `FasterPath.chop_basename` | `Pathname#chop_basename` | 50.6% |
145
145
  | `FasterPath.relative?` | `Pathname#relative?` | 93.2% |
146
- | `FasterPath.blank?` | | |
147
146
  | `FasterPath.directory?` | `Pathname#directory?` | 25.5% |
148
147
  | `FasterPath.add_trailing_separator` | `Pathname#add_trailing_separator` | 46.8% |
149
148
  | `FasterPath.has_trailing_separator?` | `Pathname#has_trailing_separator` | 61.2% |
@@ -169,9 +168,11 @@ require "faster_path/optional/monkeypatches"
169
168
  FasterPath.sledgehammer_everything!
170
169
  ```
171
170
 
172
- ## Unstable optional bits
171
+ ## Optional Rust implementations
173
172
 
174
- **Optional methods which ~~have regressions.~~ are unstable.** These will **not** be included by default in monkey-patches. Be cautious when using the `FasterPath::RefineFile` refinement. To try them anyways use the environment flag of `WITH_REGRESSION`. These methods are here to be improved upon.
173
+ **These are stable, not performant, and not included in `File` by default.**
174
+
175
+ These will **not** be included by default in monkey-patches. Be cautious when using the `FasterPath::RefineFile` refinement. To try them with monkeypatching use the environment flag of `WITH_REGRESSION`. These methods are here to be improved upon.
175
176
 
176
177
  |FasterPath Implementation|Ruby Implementation|
177
178
  |---|---|
@@ -180,9 +181,7 @@ FasterPath.sledgehammer_everything!
180
181
  | `FasterPath.extname` | `File.extname` |
181
182
 
182
183
  It's been my observation (and some others) that the Rust implementation of the C code for `File` has similar results but
183
- performance seems to vary based on CPU cache on possibly 64bit/32bit system environmnets.
184
-
185
- **Developers for FasterPath:** Most of these need to be rewritten, please use `WITH_REGRESSION=true TEST_MONKEYPATCHES=true` in your testing. You can see the resulting failures currently on TravisCI under "Allow Failures".
184
+ performance seems to vary based on CPU cache on possibly 64bit/32bit system environmnets. When these methods were initially written, and somewhat simplistic, they were faster than the C implementations on `File`. After the implementations have been perfected to match the behavior in Ruby they don't perform as well and are therefore not included by default when the monkey patch method `FasterPath.sledgehammer_everything!` is executed. If you don't want to pass the `WITH_REGRESSION` environment variable you can put any turthy parameter on the monkey patch method to include it.
186
185
 
187
186
  ## Getting Started with Development
188
187
 
data/Rakefile CHANGED
@@ -57,19 +57,24 @@ task :lint do
57
57
  puts
58
58
  end
59
59
 
60
+ desc "Run Rust Tests"
61
+ task :cargo do
62
+ sh "cargo test -- --nocapture"
63
+ end
64
+
60
65
  Rake::TestTask.new(minitest: :build_lib) do |t|
61
66
  t.libs << "test"
62
67
  t.libs << "lib"
63
68
  t.test_files = FileList['test/**/*_test.rb']
64
69
  end
65
70
 
66
- task test: [:minitest, :lint] do |_t|
67
- exec 'mspec --format spec core/file/basename core/file/extname core/file/dirname library/pathname'
71
+ task test: [:cargo, :minitest, :lint] do |_t|
72
+ exec 'spec/mspec/bin/mspec --format spec core/file/basename core/file/extname core/file/dirname library/pathname'
68
73
  end
69
74
 
70
75
  desc "Full mspec results w/o encoding"
71
76
  task :mspec_full do
72
- exec %(bash -c "TEST_MONKEYPATCHES=true WITH_REGRESSION=true mspec --format spec core/file/basename core/file/extname core/file/dirname library/pathname")
77
+ 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")
73
78
  end
74
79
 
75
80
  desc "Full mspec results w/ encoding"
data/faster_path.gemspec CHANGED
@@ -33,7 +33,7 @@ Gem::Specification.new do |spec|
33
33
  spec.add_development_dependency "color_pound_spec_reporter", "~> 0.0.9"
34
34
  spec.add_development_dependency "rubocop", "~> 0.47"
35
35
  unless ENV['CI']
36
- spec.add_development_dependency "stop_watch", "~> 0.1.0"
36
+ spec.add_development_dependency "stop_watch", "~> 1.0.0"
37
37
  spec.add_development_dependency "gruff", "~> 0.7.0"
38
38
  end
39
39
  end
@@ -57,6 +57,11 @@ module FasterPath
57
57
  def entries
58
58
  FasterPath.entries(@path)
59
59
  end
60
+
61
+ def plus(pth, pth2)
62
+ FasterPath.plus(pth, pth2)
63
+ end
64
+ private :plus
60
65
  end
61
66
  end
62
67
  end
@@ -54,6 +54,11 @@ module FasterPath
54
54
  def entries
55
55
  FasterPath.entries(@path)
56
56
  end
57
+
58
+ def plus(pth, pth2)
59
+ FasterPath.plus(pth, pth2)
60
+ end
61
+ private :plus
57
62
  end
58
63
  end
59
64
  end
@@ -1,3 +1,3 @@
1
1
  module FasterPath
2
- VERSION = "0.1.12"
2
+ VERSION = "0.1.13"
3
3
  end
data/lib/faster_path.rb CHANGED
@@ -49,6 +49,10 @@ module FasterPath
49
49
  Rust.basename(pth, ext)
50
50
  end
51
51
 
52
+ def self.plus(pth, pth2)
53
+ Rust.plus(pth, pth2)
54
+ end
55
+
52
56
  def self.add_trailing_separator(pth)
53
57
  Rust.add_trailing_separator(pth)
54
58
  end
@@ -93,6 +97,7 @@ module FasterPath
93
97
  attach_function :is_blank, [ :string ], :bool
94
98
  attach_function :both_are_blank, [ :string, :string ], :bool
95
99
  attach_function :basename, [ :string, :string ], :string
100
+ attach_function :plus, [ :string, :string ], :string
96
101
  attach_function :dirname, [ :string ], :string
97
102
  attach_function :basename_for_chop, [ :string ], :string # decoupling behavior
98
103
  attach_function :dirname_for_chop, [ :string ], :string # decoupling behavior
data/src/basename.rs CHANGED
@@ -1,8 +1,5 @@
1
- extern crate array_tool;
2
1
  use libc::c_char;
3
2
  use std::ffi::{CStr, CString};
4
- use path_parsing::extract_last_path_segment;
5
- use self::array_tool::string::Squeeze;
6
3
 
7
4
  #[no_mangle]
8
5
  pub extern "C" fn basename(c_pth: *const c_char, c_ext: *const c_char) -> *const c_char {
@@ -12,21 +9,33 @@ pub extern "C" fn basename(c_pth: *const c_char, c_ext: *const c_char) -> *const
12
9
  let pth = unsafe { CStr::from_ptr(c_pth) }.to_str().unwrap();
13
10
  let ext = unsafe { CStr::from_ptr(c_ext) }.to_str().unwrap();
14
11
 
15
- // Known edge case
16
- match &pth.squeeze("/")[..] {
17
- "/" => { return CString::new("/").unwrap().into_raw() }
18
- _ => {}
19
- }
12
+ let name = rust::basename(pth, ext);
13
+
14
+ CString::new(name).unwrap().into_raw()
15
+ }
20
16
 
21
- let mut name = extract_last_path_segment(pth);
17
+ pub mod rust {
18
+ extern crate array_tool;
19
+ use path_parsing::extract_last_path_segment;
20
+ use self::array_tool::string::Squeeze;
22
21
 
23
- if ext == ".*" {
24
- if let Some(dot_i) = name.rfind('.') {
25
- name = &name[0..dot_i];
22
+ pub fn basename(pth: &str, ext: &str) -> String {
23
+ // Known edge case
24
+ match &pth.squeeze("/")[..] {
25
+ "/" => { return "/".to_string() }
26
+ _ => {}
26
27
  }
27
- } else if name.ends_with(ext) {
28
- name = &name[..name.len() - ext.len()];
29
- };
30
28
 
31
- CString::new(name).unwrap().into_raw()
29
+ let mut name = extract_last_path_segment(pth);
30
+
31
+ if ext == ".*" {
32
+ if let Some(dot_i) = name.rfind('.') {
33
+ name = &name[0..dot_i];
34
+ }
35
+ } else if name.ends_with(ext) {
36
+ name = &name[..name.len() - ext.len()];
37
+ };
38
+ name.to_string()
39
+ }
32
40
  }
41
+
@@ -0,0 +1,56 @@
1
+ pub mod rust {
2
+ use std::path::MAIN_SEPARATOR;
3
+ use std::str;
4
+
5
+ pub fn chop_basename(input: &str) -> Option<(String,String)> {
6
+ if input.is_empty() {
7
+ return None;
8
+ }
9
+
10
+ let mut offset = 0;
11
+ let mut trailing_slashes = input.chars().rev();
12
+ loop {
13
+ match trailing_slashes.next() {
14
+ Some(MAIN_SEPARATOR) => { offset = offset + 1 },
15
+ _ => { break },
16
+ }
17
+ }
18
+
19
+ let input = &input[0..input.len()-offset];
20
+ let base = input.rsplit_terminator(MAIN_SEPARATOR).nth(0).unwrap_or("");
21
+ let directory = &input[0..input.len()-base.len()];
22
+
23
+ if directory.is_empty() && (base.is_empty() || base == "/") {
24
+ return None
25
+ };
26
+
27
+ Some((directory.to_string(), base.to_string()))
28
+ }
29
+
30
+ #[test]
31
+ fn it_chops_the_basename_and_dirname() {
32
+ assert_eq!(chop_basename(&""[..]), None);
33
+ assert_eq!(chop_basename(&"/"[..]), None);
34
+ assert_eq!(
35
+ chop_basename(&"."[..]),
36
+ Some(("".to_string(), ".".to_string()))
37
+ );
38
+ assert_eq!(
39
+ chop_basename(&"asdf/asdf"[..]),
40
+ Some(("asdf/".to_string(), "asdf".to_string()))
41
+ );
42
+ assert_eq!(
43
+ chop_basename(&"asdf.txt"[..]),
44
+ Some(("".to_string(), "asdf.txt".to_string()))
45
+ );
46
+ assert_eq!(
47
+ chop_basename(&"asdf/"[..]),
48
+ Some(("".to_string(), "asdf".to_string()))
49
+ );
50
+ assert_eq!(
51
+ chop_basename(&"/asdf/"[..]),
52
+ Some(("/".to_string(), "asdf".to_string()))
53
+ );
54
+ }
55
+
56
+ }
data/src/dirname.rs CHANGED
@@ -1,7 +1,5 @@
1
- use std::path::MAIN_SEPARATOR;
2
1
  use libc::c_char;
3
2
  use std::ffi::{CStr, CString};
4
- use path_parsing::{last_sep_i, last_non_sep_i, last_non_sep_i_before};
5
3
 
6
4
  #[no_mangle]
7
5
  pub extern "C" fn dirname(path: *const c_char) -> *const c_char {
@@ -9,24 +7,40 @@ pub extern "C" fn dirname(path: *const c_char) -> *const c_char {
9
7
  return path
10
8
  }
11
9
  let r_str = unsafe { CStr::from_ptr(path) }.to_str().unwrap();
12
- if r_str.is_empty() {
13
- return CString::new(".").unwrap().into_raw();
14
- }
15
- let non_sep_i = last_non_sep_i(r_str);
16
- if non_sep_i == -1 {
17
- return CString::new(MAIN_SEPARATOR.to_string()).unwrap().into_raw();
18
- }
19
- let sep_i = last_sep_i(r_str, non_sep_i);
20
- if sep_i == -1 {
21
- return CString::new(".").unwrap().into_raw();
22
- }
23
- if sep_i == 0 {
24
- return CString::new(MAIN_SEPARATOR.to_string()).unwrap().into_raw();
25
- }
26
- let non_sep_i2 = last_non_sep_i_before(r_str, sep_i);
27
- if non_sep_i2 != -1 {
28
- return CString::new(&r_str[..(non_sep_i2 + 1) as usize]).unwrap().into_raw();
29
- } else {
30
- return CString::new(MAIN_SEPARATOR.to_string()).unwrap().into_raw();
10
+
11
+ CString::new(rust::dirname(r_str)).unwrap().into_raw()
12
+ }
13
+
14
+ pub mod rust {
15
+ use std::path::MAIN_SEPARATOR;
16
+ use path_parsing::{last_sep_i, last_non_sep_i, last_non_sep_i_before};
17
+
18
+ pub fn dirname(path: &str) -> String {
19
+ let r_str = path;
20
+ if r_str.is_empty() {
21
+ return ".".to_string();
22
+ }
23
+ let non_sep_i = last_non_sep_i(r_str);
24
+ if non_sep_i == -1 {
25
+ return MAIN_SEPARATOR.to_string();
26
+ }
27
+ let sep_i = last_sep_i(r_str, non_sep_i);
28
+ if sep_i == -1 {
29
+ return ".".to_string();
30
+ }
31
+ if sep_i == 0 {
32
+ return MAIN_SEPARATOR.to_string();
33
+ }
34
+ let non_sep_i2 = last_non_sep_i_before(r_str, sep_i);
35
+ if non_sep_i2 != -1 {
36
+ return r_str[..(non_sep_i2 + 1) as usize].to_string();
37
+ } else {
38
+ return MAIN_SEPARATOR.to_string();
39
+ }
31
40
  }
32
41
  }
42
+
43
+ #[test]
44
+ fn returns_dot_for_empty_string(){
45
+ assert_eq!(rust::dirname(""), ".".to_string());
46
+ }
data/src/lib.rs CHANGED
@@ -14,7 +14,9 @@ pub mod is_relative;
14
14
  pub mod is_blank;
15
15
  pub mod both_are_blank;
16
16
  pub mod basename;
17
+ pub mod plus;
17
18
  pub mod dirname;
19
+ pub mod chop_basename;
18
20
  pub mod basename_for_chop;
19
21
  pub mod dirname_for_chop;
20
22
  pub mod add_trailing_separator;
data/src/plus.rs ADDED
@@ -0,0 +1,131 @@
1
+ extern crate array_tool;
2
+ use std::path::Path;
3
+ use libc::c_char;
4
+ use std::ffi::{CStr,CString};
5
+ use std::str;
6
+ use chop_basename::rust::chop_basename;
7
+ use basename::rust::basename;
8
+ use dirname::rust::dirname;
9
+ use self::array_tool::vec::Shift;
10
+ use std::ops::Index;
11
+
12
+ #[no_mangle]
13
+ pub extern fn plus(string: *const c_char, string2: *const c_char) -> *const c_char {
14
+ let c_str = unsafe {
15
+ if string.is_null() {
16
+ return string;
17
+ }
18
+ CStr::from_ptr(string)
19
+ };
20
+
21
+ let c_str2 = unsafe {
22
+ if string2.is_null() {
23
+ return string2;
24
+ }
25
+ CStr::from_ptr(string2)
26
+ };
27
+
28
+ let r_str = str::from_utf8(c_str.to_bytes()).unwrap();
29
+ let r_str2 = str::from_utf8(c_str2.to_bytes()).unwrap();
30
+
31
+ let result = plus_paths(r_str, r_str2);
32
+
33
+ let output = CString::new(result).unwrap();
34
+ output.into_raw()
35
+ }
36
+
37
+ fn plus_paths(path1: &str, path2: &str) -> String {
38
+ let mut prefix2 = path2.to_string();
39
+ let mut index_list2: Vec<usize> = vec![];
40
+ let mut basename_list2: Vec<String> = vec![];
41
+
42
+ loop {
43
+ match chop_basename(&prefix2[..]) {
44
+ None => { break },
45
+ Some((pfx2, basename2)) => {
46
+ prefix2 = pfx2.clone();
47
+ index_list2.unshift(pfx2.len());
48
+ basename_list2.unshift(basename2.to_owned());
49
+ },
50
+ }
51
+ }
52
+ if !prefix2.is_empty() {
53
+ return path2.to_string()
54
+ };
55
+
56
+ let mut prefix1 = path1.to_string();
57
+
58
+ loop {
59
+ while !basename_list2.is_empty() && basename_list2.first().unwrap() == "." {
60
+ index_list2.shift();
61
+ basename_list2.shift();
62
+ }
63
+ match chop_basename(&prefix1[..]) {
64
+ None => { break },
65
+ Some((pfx1, basename1)) => {
66
+ prefix1 = pfx1.clone();
67
+ if basename1 == "." { continue };
68
+ if basename1 == ".." || basename_list2.is_empty() || basename_list2.first().unwrap() != ".." {
69
+ prefix1.push_str(&basename1);
70
+ break
71
+ }
72
+ }
73
+ }
74
+ index_list2.shift();
75
+ basename_list2.shift();
76
+ }
77
+
78
+ let result: String;
79
+
80
+ let mut r1 = if let Some((_,_)) = chop_basename(&prefix1[..]) {true} else {false};
81
+
82
+ if !r1 {
83
+ r1 = basename(&prefix1[..], "").contains("/");
84
+ if r1 {
85
+ while !basename_list2.is_empty() && basename_list2.first().unwrap() == ".." {
86
+ index_list2.shift();
87
+ basename_list2.shift();
88
+ }
89
+ }
90
+ }
91
+ if !basename_list2.is_empty() {
92
+ let suffix2 = path2.index(index_list2.first().unwrap().to_owned()..);
93
+ if r1 {
94
+ result = Path::new(&prefix1).join(Path::new(&suffix2)).to_str().unwrap().to_string();
95
+ } else {
96
+ prefix1.push_str(&suffix2);
97
+ result = prefix1.to_string();
98
+ }
99
+ } else {
100
+ if r1 {
101
+ result = prefix1.to_string();
102
+ } else {
103
+ result = dirname(&prefix1[..]);
104
+ }
105
+ }
106
+
107
+ String::from(result)
108
+ }
109
+
110
+ #[test]
111
+ fn it_will_plus_same_as_ruby() {
112
+ assert_eq!("/" , plus_paths("/" , "/"));
113
+ assert_eq!("a/b" , plus_paths("a" , "b"));
114
+ assert_eq!("a" , plus_paths("a" , "."));
115
+ assert_eq!("b" , plus_paths("." , "b"));
116
+ assert_eq!("." , plus_paths("." , "."));
117
+ assert_eq!("/b" , plus_paths("a" , "/b"));
118
+
119
+ assert_eq!("/" , plus_paths("/" , ".."));
120
+ assert_eq!("." , plus_paths("a" , ".."));
121
+ assert_eq!("a" , plus_paths("a/b", ".."));
122
+ assert_eq!("../.." , plus_paths(".." , ".."));
123
+ assert_eq!("/c" , plus_paths("/" , "../c"));
124
+ assert_eq!("c" , plus_paths("a" , "../c"));
125
+ assert_eq!("a/c" , plus_paths("a/b", "../c"));
126
+ assert_eq!("../../c", plus_paths(".." , "../c"));
127
+
128
+ assert_eq!("a//b/d//e", plus_paths("a//b/c", "../d//e"));
129
+
130
+ assert_eq!("//foo/var/bar", plus_paths("//foo/var", "bar"));
131
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: faster_path
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.12
4
+ version: 0.1.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel P. Clark
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-30 00:00:00.000000000 Z
11
+ date: 2017-09-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -128,14 +128,14 @@ dependencies:
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: 0.1.0
131
+ version: 1.0.0
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: 0.1.0
138
+ version: 1.0.0
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: gruff
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -177,6 +177,7 @@ files:
177
177
  - src/basename.rs
178
178
  - src/basename_for_chop.rs
179
179
  - src/both_are_blank.rs
180
+ - src/chop_basename.rs
180
181
  - src/dirname.rs
181
182
  - src/dirname_for_chop.rs
182
183
  - src/entries.rs
@@ -188,6 +189,7 @@ files:
188
189
  - src/is_relative.rs
189
190
  - src/lib.rs
190
191
  - src/path_parsing.rs
192
+ - src/plus.rs
191
193
  - src/ruby_array.rs
192
194
  - src/ruby_string.rs
193
195
  - src/rust_arch_bits.rs
@@ -211,7 +213,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
211
213
  version: '0'
212
214
  requirements: []
213
215
  rubyforge_project:
214
- rubygems_version: 2.6.11
216
+ rubygems_version: 2.6.13
215
217
  signing_key:
216
218
  specification_version: 4
217
219
  summary: Reimplementation of Pathname for better performance