faster_path 0.2.3 → 0.2.4

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
- SHA1:
3
- metadata.gz: 8487e703f71a357f9d42a04c8f4ba2b98291bad4
4
- data.tar.gz: 4c2c24ac1f470bfddbae8ccbfec0447961476e07
2
+ SHA256:
3
+ metadata.gz: 95885428dc6e619ea1069fd3473cd68ffd762eca29d09f1185ebfafc7cbcbebf
4
+ data.tar.gz: 4ad3a157841d4003e7314295fb955a01565c903c05942b112527a95818664f7c
5
5
  SHA512:
6
- metadata.gz: 57e7745e69f3f30b32981731c250ffa001e4f4f58b5a4b44a0b6558ea786a0a741dc0ce225c959998055ed99c8070dcc78f995ec3c3bb538258cee9429bb71bc
7
- data.tar.gz: b30307165e8fbdee36a2dd62bf92618af2f062d8bd93d94c4324c650d6c282fc45778508930d77e2f991a6a998ba6281dad53a742dca4c45751d346e42b3714f
6
+ metadata.gz: 881379d959fcadeaf9e23236327b9b2da8315a3e95307718cc4ff763002eb1ea11134b7607518f98a6b20a9d5b9db3b38d31174d85b8c5bbc3fdca6a3f8c8aac
7
+ data.tar.gz: 961dd0da7cff5e3ac96aa3745dfe803464d748784fabe51a49988afb254e6995d168e640abc25b7cae64379b1c1b53b6faa5f299ee74adcc2d01ad11cf05153a
data/Cargo.lock CHANGED
@@ -10,7 +10,7 @@ dependencies = [
10
10
  "array_tool 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
11
11
  "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
12
12
  "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
13
- "ruru 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)",
13
+ "ruru 0.9.3 (git+https://github.com/danielpclark/ruru?branch=playground)",
14
14
  ]
15
15
 
16
16
  [[package]]
@@ -38,8 +38,8 @@ dependencies = [
38
38
 
39
39
  [[package]]
40
40
  name = "ruby-sys"
41
- version = "0.2.20"
42
- source = "registry+https://github.com/rust-lang/crates.io-index"
41
+ version = "0.3.0"
42
+ source = "git+https://github.com/danielpclark/ruby-sys?branch=playground#08c96179e46ce8a5fec25e1b4aeb5d9c63a2245e"
43
43
  dependencies = [
44
44
  "libc 0.2.30 (registry+https://github.com/rust-lang/crates.io-index)",
45
45
  ]
@@ -47,10 +47,10 @@ dependencies = [
47
47
  [[package]]
48
48
  name = "ruru"
49
49
  version = "0.9.3"
50
- source = "registry+https://github.com/rust-lang/crates.io-index"
50
+ source = "git+https://github.com/danielpclark/ruru?branch=playground#aa4a08c48374bb13983cf6de5df7125a18ea1169"
51
51
  dependencies = [
52
52
  "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
53
- "ruby-sys 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)",
53
+ "ruby-sys 0.3.0 (git+https://github.com/danielpclark/ruby-sys?branch=playground)",
54
54
  ]
55
55
 
56
56
  [metadata]
@@ -59,5 +59,5 @@ dependencies = [
59
59
  "checksum lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c8f31047daa365f19be14b47c29df4f7c3b581832407daabe6ae77397619237d"
60
60
  "checksum libc 0.2.30 (registry+https://github.com/rust-lang/crates.io-index)" = "2370ca07ec338939e356443dac2296f581453c35fe1e3a3ed06023c49435f915"
61
61
  "checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d"
62
- "checksum ruby-sys 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)" = "e71509f17ce93733dc196258e168b58050490a156b04563816a8120a74ba04c7"
63
- "checksum ruru 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6486d6c50b7a08246a492a61893635c1977d41c138041d443eb603f6298e0273"
62
+ "checksum ruby-sys 0.3.0 (git+https://github.com/danielpclark/ruby-sys?branch=playground)" = "<none>"
63
+ "checksum ruru 0.9.3 (git+https://github.com/danielpclark/ruru?branch=playground)" = "<none>"
data/Cargo.toml CHANGED
@@ -13,7 +13,7 @@ name = "faster_path"
13
13
  crate-type = ["dylib"]
14
14
 
15
15
  [dependencies]
16
- ruru = "0.9.3"
16
+ ruru = { git = "https://github.com/danielpclark/ruru", branch = "playground" }
17
17
  array_tool = "0.4.1"
18
18
  lazy_static = "1.0"
19
19
  memchr = "2.0.1"
@@ -26,13 +26,12 @@ Gem::Specification.new do |spec|
26
26
 
27
27
  spec.add_dependency "bundler", "~> 1.12"
28
28
  spec.add_dependency "rake", "~> 12.0"
29
- spec.add_dependency "ffi", "~> 1.9"
30
29
  spec.add_development_dependency "read_source", "~> 0.2.6"
31
30
  spec.add_development_dependency "minitest", "~> 5.10"
32
31
  spec.add_development_dependency "minitest-reporters", "~> 1.1"
33
32
  spec.add_development_dependency "color_pound_spec_reporter", "~> 0.0.9"
34
33
  spec.add_development_dependency "rubocop", "~> 0.51"
35
- spec.add_development_dependency "stop_watch", "~> 1.0.0"
34
+ spec.add_development_dependency "stop_watch", "~> 1.0"
36
35
  if !ENV['CI'] && ENV['GRAPH']
37
36
  spec.add_development_dependency "gruff", "~> 0.7.0"
38
37
  end
@@ -1,55 +1,24 @@
1
1
  require "faster_path/version"
2
2
  require 'pathname'
3
- require "ffi"
3
+ require 'faster_path/platform'
4
4
  require 'faster_path/asset_resolution'
5
+ require 'fiddle'
6
+ require 'fiddle/import'
5
7
 
6
8
  module FasterPath
7
- FFI_LIBRARY = begin
8
- prefix = Gem.win_platform? ? "" : "lib"
9
- "#{File.expand_path("../target/release/", __dir__)}/#{prefix}faster_path.#{FFI::Platform::LIBSUFFIX}"
10
- end
11
- require 'fiddle'
12
- library = Fiddle.dlopen(FFI_LIBRARY)
9
+ FFI_LIBRARY = FasterPath::Platform.ffi_library()
10
+
13
11
  Fiddle::Function.
14
- new(library['Init_faster_pathname'], [], Fiddle::TYPE_VOIDP).
12
+ new(Fiddle.dlopen(FFI_LIBRARY)['Init_faster_pathname'], [], Fiddle::TYPE_VOIDP).
15
13
  call
16
14
 
17
- FasterPathname::Public.class_eval do
18
- private_class_method :absolute?
19
- private_class_method :add_trailing_separator
15
+ Public.class_eval do
20
16
  private_class_method :basename
21
- private_class_method :children # String results
22
- private_class_method :children_compat # wrap Pathname on each
17
+ private_class_method :children
18
+ private_class_method :children_compat
23
19
  private_class_method :chop_basename
24
- private_class_method :cleanpath_aggressive
25
- private_class_method :directory?
26
- private_class_method :dirname
27
- private_class_method :entries # String results
28
- private_class_method :entries_compat # wrap Pathname on each
29
- private_class_method :extname
30
- private_class_method :has_trailing_separator?
31
- private_class_method :plus
32
- private_class_method :relative?
33
- end
34
-
35
- FasterPathname.class_eval do
36
- def initialize(arg)
37
- unless arg.is_a? String
38
- arg = arg.to_s
39
- end
40
- raise(ArgumentError, "null byte found") if arg.include?("\0")
41
- @path = arg
42
- end
43
-
44
- # BAD; exposes private methods
45
- # Need to reprivatize specific methods
46
- def method_missing(method_name, *a, &b)
47
- Public.send(method_name, @path, *a, &b)
48
- end
49
-
50
- def respond_to?(method_name, include_private = false)
51
- Public.send(:respond_to?, method_name) || super
52
- end
20
+ private_class_method :entries
21
+ private_class_method :entries_compat
53
22
  end
54
23
 
55
24
  def self.rust_arch_bits
@@ -60,68 +29,47 @@ module FasterPath
60
29
  1.size * 8
61
30
  end
62
31
 
63
- def self.absolute?(pth)
64
- FasterPathname::Public.send(:absolute?, pth)
65
- end
66
-
67
- def self.add_trailing_separator(pth)
68
- FasterPathname::Public.send(:add_trailing_separator, pth)
69
- end
70
-
71
32
  def self.blank?(str)
72
33
  "#{str}".strip.empty?
73
34
  end
74
35
 
75
36
  def self.basename(pth, ext="")
76
- FasterPathname::Public.send(:basename, pth, ext)
37
+ Public.send(:basename, pth, ext)
77
38
  end
78
39
 
79
40
  def self.children(pth, with_directory=true)
80
- FasterPathname::Public.send(:children, pth, with_directory)
41
+ result = Public.send(:children, pth, with_directory)
42
+ return result if result
43
+ raise Errno::NOENT, "No such file or directory @ dir_initialize - #{pth}"
81
44
  end
82
45
 
83
- def self.chop_basename(pth)
84
- result = FasterPathname::Public.send(:chop_basename, pth)
85
- result unless result.empty?
46
+ def self.children_compat(pth, with_directory=true)
47
+ result = Public.send(:children_compat, pth, with_directory)
48
+ return result if result
49
+ raise Errno::NOENT, "No such file or directory @ dir_initialize - #{pth}"
86
50
  end
87
51
 
88
- def self.cleanpath_aggressive(pth)
89
- FasterPathname::Public.send(:cleanpath_aggressive, pth)
90
- end
91
-
92
- def self.directory?(pth)
93
- FasterPathname::Public.send(:directory?, pth)
94
- end
95
-
96
- def self.dirname(pth)
97
- FasterPathname::Public.send(:dirname, pth)
52
+ def self.chop_basename(pth)
53
+ result = Public.send(:chop_basename, pth)
54
+ result unless result.empty?
98
55
  end
99
56
 
100
57
  def self.entries(pth)
101
- FasterPathname::Public.send(:entries, pth)
102
- end
103
-
104
- def self.extname(pth)
105
- FasterPathname::Public.send(:extname, pth)
106
- end
107
-
108
- def self.has_trailing_separator?(pth)
109
- FasterPathname::Public.send(:has_trailing_separator?, pth)
58
+ result = Public.send(:entries, pth)
59
+ return result if result
60
+ raise Errno::NOENT, "No such file or directory @ dir_initialize - #{pth}"
110
61
  end
111
62
 
112
- def self.plus(pth, pth2)
113
- FasterPathname::Public.send(:plus, pth, pth2)
114
- end
115
-
116
- def self.relative?(pth)
117
- FasterPathname::Public.send(:relative?, pth)
63
+ def self.entries_compat(pth)
64
+ result = Public.send(:entries_compat, pth)
65
+ return result if result
66
+ raise Errno::NOENT, "No such file or directory @ dir_initialize - #{pth}"
118
67
  end
119
68
 
120
69
  module Rust
121
- extend FFI::Library
122
- ffi_lib ::FasterPath::FFI_LIBRARY
123
-
124
- attach_function :rust_arch_bits, [], :int32
70
+ extend Fiddle::Importer
71
+ dlload FFI_LIBRARY
72
+ extern 'int rust_arch_bits()'
125
73
  end
126
74
  private_constant :Rust
127
75
  end
@@ -2,6 +2,8 @@
2
2
  # If the asset is not available and we can't compile it from this code then FAIL
3
3
  # on require of 'faster_path' with a very clear message as to why."
4
4
 
5
+ require_relative './platform'
6
+
5
7
  module FasterPath
6
8
  module AssetResolution # BREAK IN CASE OF EMERGENCY ;-)
7
9
  class << self
@@ -50,8 +52,7 @@ module FasterPath
50
52
  end
51
53
 
52
54
  def lib_file
53
- prefix = Gem.win_platform? ? "" : "lib"
54
- "#{lib_dir}/#{prefix}faster_path.#{FFI::Platform::LIBSUFFIX}"
55
+ Platform.ffi_library()
55
56
  end
56
57
  end
57
58
  end
@@ -38,10 +38,9 @@ module FasterPath
38
38
  end
39
39
  private :add_trailing_separator
40
40
 
41
- # Do NOT remove; waiting for fix in ruru
42
- # def children(with_dir=true)
43
- # FasterPathname::Public.allocate.send(:children_compat, @path, with_dir)
44
- # end if !!ENV['WITH_REGRESSION']
41
+ def children(with_dir=true)
42
+ FasterPath.children_compat(@path, with_dir)
43
+ end if !!ENV['WITH_REGRESSION']
45
44
 
46
45
  def chop_basename(pth)
47
46
  FasterPath.chop_basename(pth)
@@ -57,10 +56,9 @@ module FasterPath
57
56
  FasterPath.directory?(@path)
58
57
  end
59
58
 
60
- # Do NOT remove; waiting for fix in ruru
61
- # def entries
62
- # FasterPathname::Public.allocate.send(:entries_compat, @path)
63
- # end if !!ENV['WITH_REGRESSION']
59
+ def entries
60
+ FasterPath.entries_compat(@path)
61
+ end if !!ENV['WITH_REGRESSION']
64
62
 
65
63
  def has_trailing_separator?(pth)
66
64
  FasterPath.has_trailing_separator?(pth)
@@ -34,10 +34,9 @@ module FasterPath
34
34
  end
35
35
  private :add_trailing_separator
36
36
 
37
- # Do NOT remove; waiting for fix in ruru
38
- # def children(with_dir=true)
39
- # FasterPathname::Public.allocate.send(:children_compat, @path, with_dir)
40
- # end if !!ENV['WITH_REGRESSION']
37
+ def children(with_dir=true)
38
+ FasterPath.children_compat(@path, with_dir)
39
+ end if !!ENV['WITH_REGRESSION']
41
40
 
42
41
  def chop_basename(pth)
43
42
  FasterPath.chop_basename(pth)
@@ -53,10 +52,9 @@ module FasterPath
53
52
  FasterPath.directory?(@path)
54
53
  end
55
54
 
56
- # Do NOT remove; waiting for fix in ruru
57
- # def entries
58
- # FasterPathname::Public.allocate.send(:entries_compat, @path)
59
- # end if !!ENV['WITH_REGRESSION']
55
+ def entries
56
+ FasterPath.entries_compat(@path)
57
+ end if !!ENV['WITH_REGRESSION']
60
58
 
61
59
  def has_trailing_separator?(pth)
62
60
  FasterPath.has_trailing_separator?(pth)
@@ -0,0 +1,60 @@
1
+ module FasterPath
2
+ module Platform
3
+ class << self
4
+ def ffi_library
5
+ file = [
6
+ lib_prefix,
7
+ "faster_path.",
8
+ lib_suffix
9
+ ]
10
+
11
+ File.join(rust_release, file.join())
12
+ end
13
+
14
+ def operating_system
15
+ case host_os()
16
+ when /linux|bsd|solaris/
17
+ "linux"
18
+ when /darwin/
19
+ "darwin"
20
+ when /mingw|mswin/
21
+ "windows"
22
+ else
23
+ host_os()
24
+ end
25
+ end
26
+
27
+ def lib_prefix
28
+ case operating_system()
29
+ when /windows/
30
+ ''
31
+ when /cygwin/
32
+ 'cyg'
33
+ else
34
+ 'lib'
35
+ end
36
+ end
37
+
38
+ def lib_suffix
39
+ case operating_system()
40
+ when /darwin/
41
+ 'dylib'
42
+ when /linux/
43
+ 'so'
44
+ when /windows|cygwin/
45
+ 'dll'
46
+ else
47
+ 'so'
48
+ end
49
+ end
50
+
51
+ def rust_release
52
+ File.expand_path("../../target/release/", __dir__)
53
+ end
54
+
55
+ def host_os
56
+ RbConfig::CONFIG['host_os'].downcase
57
+ end
58
+ end
59
+ end
60
+ end
@@ -1,3 +1,3 @@
1
1
  module FasterPath
2
- VERSION = "0.2.3"
2
+ VERSION = "0.2.4"
3
3
  end
@@ -1,9 +1,13 @@
1
- use ruru::{AnyObject, Class, Object, RString};
1
+ use ruru::{RString, Object, Class};
2
2
 
3
- pub fn str_to_any_obj(str_var: &str) -> AnyObject {
4
- RString::new(str_var).to_any_object()
5
- }
3
+ pub fn new_pathname_instance(path: &str) -> Class {
4
+ let mut path_instance = Class::from(
5
+ Class::from_existing("Pathname").send("allocate", None).value()
6
+ );
7
+ path_instance.instance_variable_set(
8
+ "@path",
9
+ RString::new(path).to_any_object()
10
+ );
6
11
 
7
- pub fn class_new(klass: &str, params: Vec<AnyObject>) -> AnyObject {
8
- Class::from_existing(klass).new_instance(params)
12
+ path_instance
9
13
  }
data/src/lib.rs CHANGED
@@ -10,7 +10,7 @@ extern crate ruru;
10
10
  #[macro_use]
11
11
  extern crate lazy_static;
12
12
 
13
- class!(FasterPathname);
13
+ module!(FasterPath);
14
14
 
15
15
  mod helpers;
16
16
  mod pathname;
@@ -24,12 +24,12 @@ mod prepend_prefix;
24
24
  pub mod rust_arch_bits;
25
25
  mod path_parsing;
26
26
 
27
- use ruru::{Class, Object, RString, Boolean, Array};
27
+ use ruru::{Module, Object, RString, Boolean, Array, AnyObject};
28
28
 
29
29
  // r_ methods are on the core class and may evaluate instance variables or self
30
30
  // pub_ methods must take all values as parameters
31
31
  methods!(
32
- FasterPathname,
32
+ FasterPath,
33
33
  _itself,
34
34
 
35
35
  fn pub_add_trailing_separator(pth: RString) -> RString {
@@ -46,11 +46,11 @@ methods!(
46
46
  pathname::pn_basename(pth, ext)
47
47
  }
48
48
 
49
- fn pub_children(pth: RString, with_dir: Boolean) -> Array {
49
+ fn pub_children(pth: RString, with_dir: Boolean) -> AnyObject {
50
50
  pathname::pn_children(pth, with_dir)
51
51
  }
52
52
 
53
- fn pub_children_compat(pth: RString, with_dir: Boolean) -> Array {
53
+ fn pub_children_compat(pth: RString, with_dir: Boolean) -> AnyObject {
54
54
  pathname::pn_children_compat(pth, with_dir)
55
55
  }
56
56
 
@@ -87,12 +87,12 @@ methods!(
87
87
  // }
88
88
 
89
89
  // pub_entries returns an array of String objects
90
- fn pub_entries(pth: RString) -> Array {
90
+ fn pub_entries(pth: RString) -> AnyObject {
91
91
  pathname::pn_entries(pth)
92
92
  }
93
93
 
94
94
  // pub_entries_compat returns an array of Pathname objects
95
- fn pub_entries_compat(pth: RString) -> Array {
95
+ fn pub_entries_compat(pth: RString) -> AnyObject {
96
96
  pathname::pn_entries_compat(pth)
97
97
  }
98
98
 
@@ -146,28 +146,26 @@ methods!(
146
146
  #[allow(non_snake_case)]
147
147
  #[no_mangle]
148
148
  pub extern "C" fn Init_faster_pathname(){
149
- Class::new("FasterPathname", None).define(|itself| {
150
- itself.define_nested_class("Public", None);
151
- });
152
-
153
- // Public methods
154
- // * methods for refinements, monkeypatching
155
- // * methods that need all values as parameters
156
- Class::from_existing("FasterPathname").get_nested_class("Public").define(|itself| {
149
+ Module::from_existing("FasterPath").define(|itself| {
157
150
  itself.def_self("absolute?", pub_is_absolute);
158
151
  itself.def_self("add_trailing_separator", pub_add_trailing_separator);
159
- itself.def_self("basename", pub_basename);
160
- itself.def_self("children", pub_children);
161
- itself.def_self("children_compat", pub_children_compat);
162
- itself.def_self("chop_basename", pub_chop_basename);
163
152
  itself.def_self("cleanpath_aggressive", pub_cleanpath_aggressive);
164
153
  itself.def_self("directory?", pub_is_directory);
165
154
  itself.def_self("dirname", pub_dirname);
166
- itself.def_self("entries", pub_entries);
167
- itself.def_self("entries_compat", pub_entries_compat);
168
155
  itself.def_self("extname", pub_extname);
169
156
  itself.def_self("has_trailing_separator?", pub_has_trailing_separator);
170
157
  itself.def_self("plus", pub_plus);
171
158
  itself.def_self("relative?", pub_is_relative);
159
+ itself.define_nested_class("Public", None);
160
+ });
161
+
162
+ // For methods requiring addition Ruby-side behavior
163
+ Module::from_existing("FasterPath").get_nested_class("Public").define(|itself| {
164
+ itself.def_self("basename", pub_basename);
165
+ itself.def_self("children", pub_children);
166
+ itself.def_self("children_compat", pub_children_compat);
167
+ itself.def_self("chop_basename", pub_chop_basename);
168
+ itself.def_self("entries", pub_entries);
169
+ itself.def_self("entries_compat", pub_entries_compat);
172
170
  });
173
171
  }
@@ -1,4 +1,4 @@
1
- use helpers::*;
1
+ use helpers::new_pathname_instance;
2
2
  use basename;
3
3
  use chop_basename;
4
4
  use cleanpath_aggressive;
@@ -7,7 +7,7 @@ use extname;
7
7
  use plus;
8
8
 
9
9
  use ruru;
10
- use ruru::{RString, Boolean, Array};
10
+ use ruru::{RString, Boolean, Array, AnyObject, NilClass, Object};
11
11
  use std::path::{MAIN_SEPARATOR,Path};
12
12
  use std::fs;
13
13
 
@@ -41,16 +41,17 @@ pub fn pn_basename(pth: MaybeString, ext: MaybeString) -> RString {
41
41
  )
42
42
  }
43
43
 
44
- pub fn pn_children(pth: MaybeString, with_dir: MaybeBoolean) -> Array {
45
- let rstring = pth.ok().unwrap_or(RString::new("."));
46
- let val = rstring.to_str();
47
- let mut with_directory = with_dir.ok().unwrap_or(Boolean::new(true)).to_bool();
48
- if val == "." {
49
- with_directory = false;
50
- }
44
+ pub fn pn_children(pth: MaybeString, with_dir: MaybeBoolean) -> AnyObject {
51
45
  let mut arr = Array::new();
46
+ let val = pth.ok().unwrap_or(RString::new("."));
47
+ let val = val.to_str();
52
48
 
53
49
  if let Ok(entries) = fs::read_dir(val) {
50
+ let mut with_directory = with_dir.ok().unwrap_or(Boolean::new(true)).to_bool();
51
+ if val == "." {
52
+ with_directory = false;
53
+ }
54
+
54
55
  for entry in entries {
55
56
  if with_directory {
56
57
  match entry {
@@ -64,41 +65,44 @@ pub fn pn_children(pth: MaybeString, with_dir: MaybeBoolean) -> Array {
64
65
  };
65
66
  }
66
67
  }
68
+
69
+ arr.to_any_object()
70
+ } else {
71
+ // TODO: When ruru exceptions are available switch the exception logic
72
+ // from the Ruby side to the Rust side
73
+ NilClass::new().to_any_object()
67
74
  }
68
- arr
69
75
  }
70
76
 
71
- pub fn pn_children_compat(pth: MaybeString, with_dir: MaybeBoolean) -> Array {
72
- let rstring = pth.ok().unwrap_or(RString::new("."));
73
- let val = rstring.to_str();
74
- let mut with_directory = with_dir.ok().unwrap_or(Boolean::new(true)).to_bool();
75
- if val == "." {
76
- with_directory = false;
77
- }
77
+ pub fn pn_children_compat(pth: MaybeString, with_dir: MaybeBoolean) -> AnyObject {
78
78
  let mut arr = Array::new();
79
+ let val = pth.ok().unwrap_or(RString::new("."));
80
+ let val = val.to_str();
79
81
 
80
82
  if let Ok(entries) = fs::read_dir(val) {
83
+ let mut with_directory = with_dir.ok().unwrap_or(Boolean::new(true)).to_bool();
84
+ if val == "." {
85
+ with_directory = false;
86
+ }
87
+
81
88
  for entry in entries {
82
89
  if with_directory {
83
- match entry {
84
- Ok(v) => { arr.push(
85
- class_new("Pathname", vec![str_to_any_obj(v.path().to_str().unwrap())])
86
- );
87
- },
88
- _ => {}
90
+ if let Ok(v) = entry {
91
+ arr.push(new_pathname_instance(v.path().to_str().unwrap()));
89
92
  };
90
93
  } else {
91
- match entry {
92
- Ok(v) => { arr.push(
93
- class_new("Pathname", vec![str_to_any_obj(v.file_name().to_str().unwrap())])
94
- );
95
- },
96
- _ => {}
94
+ if let Ok(v) = entry {
95
+ arr.push(new_pathname_instance(v.file_name().to_str().unwrap()));
97
96
  };
98
97
  }
99
98
  }
99
+
100
+ arr.to_any_object()
101
+ } else {
102
+ // TODO: When ruru exceptions are available switch the exception logic
103
+ // from the Ruby side to the Rust side
104
+ NilClass::new().to_any_object()
100
105
  }
101
- arr
102
106
  }
103
107
 
104
108
  pub fn pn_chop_basename(pth: MaybeString) -> Array {
@@ -152,34 +156,44 @@ pub fn pn_dirname(pth: MaybeString) -> RString {
152
156
  // NilClass::new()
153
157
  // }
154
158
 
155
- pub fn pn_entries(pth: MaybeString) -> Array {
156
- let files = fs::read_dir(pth.ok().unwrap_or(RString::new("")).to_str()).unwrap();
159
+ pub fn pn_entries(pth: MaybeString) -> AnyObject {
157
160
  let mut arr = Array::new();
158
161
 
159
- arr.push(RString::new("."));
160
- arr.push(RString::new(".."));
162
+ if let Ok(files) = fs::read_dir(pth.ok().unwrap_or(RString::new("")).to_str()) {
163
+ arr.push(RString::new("."));
164
+ arr.push(RString::new(".."));
161
165
 
162
- for file in files {
163
- let file_name_str = file.unwrap().file_name().into_string().unwrap();
164
- arr.push(RString::new(&file_name_str[..]));
165
- }
166
+ for file in files {
167
+ let file_name_str = file.unwrap().file_name().into_string().unwrap();
168
+ arr.push(RString::new(&file_name_str[..]));
169
+ }
166
170
 
167
- arr
171
+ arr.to_any_object()
172
+ } else {
173
+ // TODO: When ruru exceptions are available switch the exception logic
174
+ // from the Ruby side to the Rust side
175
+ NilClass::new().to_any_object()
176
+ }
168
177
  }
169
178
 
170
- pub fn pn_entries_compat(pth: MaybeString) -> Array {
171
- let files = fs::read_dir(pth.ok().unwrap_or(RString::new("")).to_str()).unwrap();
179
+ pub fn pn_entries_compat(pth: MaybeString) -> AnyObject {
172
180
  let mut arr = Array::new();
173
181
 
174
- arr.push(class_new("Pathname", vec![str_to_any_obj(&"."[..])]));
175
- arr.push(class_new("Pathname", vec![str_to_any_obj(&".."[..])]));
182
+ if let Ok(files) = fs::read_dir(pth.ok().unwrap_or(RString::new("")).to_str()) {
183
+ arr.push(new_pathname_instance("."));
184
+ arr.push(new_pathname_instance(".."));
176
185
 
177
- for file in files {
178
- let file_name_str = file.unwrap().file_name().into_string().unwrap();
179
- arr.push(class_new("Pathname", vec![str_to_any_obj(&file_name_str[..])]));
180
- }
186
+ for file in files {
187
+ let file_name_str = file.unwrap().file_name().into_string().unwrap();
188
+ arr.push(new_pathname_instance(&file_name_str));
189
+ }
181
190
 
182
- arr
191
+ arr.to_any_object()
192
+ } else {
193
+ // TODO: When ruru exceptions are available switch the exception logic
194
+ // from the Ruby side to the Rust side
195
+ NilClass::new().to_any_object()
196
+ }
183
197
  }
184
198
 
185
199
  pub fn pn_extname(pth: MaybeString) -> RString {
@@ -212,7 +226,12 @@ pub fn pn_has_trailing_separator(pth: MaybeString) -> Boolean {
212
226
 
213
227
  // also need impl +
214
228
  pub fn pn_plus(pth1: MaybeString, pth2: MaybeString) -> RString {
215
- RString::new(&plus::plus_paths(pth1.ok().unwrap().to_str(), pth2.ok().unwrap().to_str())[..])
229
+ RString::new(
230
+ &plus::plus_paths(
231
+ pth1.ok().unwrap_or(RString::new("")).to_str(),
232
+ pth2.ok().unwrap_or(RString::new("")).to_str()
233
+ )[..]
234
+ )
216
235
  }
217
236
 
218
237
  // pub fn pn_prepend_prefix(prefix: MaybeString, relpath: MaybeString){}
@@ -235,3 +254,4 @@ pub fn pn_is_relative(pth: MaybeString) -> Boolean {
235
254
  // pub fn pn_rmtree(pth: MaybeString) -> NilClass {
236
255
  // NilClass::new()
237
256
  // }
257
+ //
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.2.3
4
+ version: 0.2.4
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: 2018-02-05 00:00:00.000000000 Z
11
+ date: 2018-02-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,20 +38,6 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '12.0'
41
- - !ruby/object:Gem::Dependency
42
- name: ffi
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '1.9'
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '1.9'
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: read_source
57
43
  requirement: !ruby/object:Gem::Requirement
@@ -128,14 +114,14 @@ dependencies:
128
114
  requirements:
129
115
  - - "~>"
130
116
  - !ruby/object:Gem::Version
131
- version: 1.0.0
117
+ version: '1.0'
132
118
  type: :development
133
119
  prerelease: false
134
120
  version_requirements: !ruby/object:Gem::Requirement
135
121
  requirements:
136
122
  - - "~>"
137
123
  - !ruby/object:Gem::Version
138
- version: 1.0.0
124
+ version: '1.0'
139
125
  description: FasterPath is a reimplementation of Pathname for better performance.
140
126
  email:
141
127
  - 6ftdan@gmail.com
@@ -158,6 +144,7 @@ files:
158
144
  - lib/faster_path/asset_resolution.rb
159
145
  - lib/faster_path/optional/monkeypatches.rb
160
146
  - lib/faster_path/optional/refinements.rb
147
+ - lib/faster_path/platform.rb
161
148
  - lib/faster_path/version.rb
162
149
  - src/basename.rs
163
150
  - src/chop_basename.rs
@@ -191,7 +178,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
191
178
  version: '0'
192
179
  requirements: []
193
180
  rubyforge_project:
194
- rubygems_version: 2.6.13
181
+ rubygems_version: 2.7.6
195
182
  signing_key:
196
183
  specification_version: 4
197
184
  summary: Reimplementation of Pathname for better performance