net-ftp-list 3.2.0 → 3.2.1
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.
- data/VERSION.yml +1 -1
- data/lib/net/ftp/list/entry.rb +30 -0
- data/lib/net/ftp/list/unix.rb +12 -2
- data/net-ftp-list.gemspec +2 -2
- data/test/test_net_ftp_list_entry.rb +48 -0
- data/test/test_net_ftp_list_unix.rb +52 -31
- metadata +3 -3
data/VERSION.yml
CHANGED
data/lib/net/ftp/list/entry.rb
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# Represents an entry of the FTP list. Gets returned when you parse a list.
|
|
2
2
|
class Net::FTP::List::Entry
|
|
3
|
+
include Comparable
|
|
3
4
|
|
|
4
5
|
ALLOWED_ATTRIBUTES = [:raw, :basename, :dir, :file, :symlink, :mtime, :filesize, :device, :server_type] #:nodoc:
|
|
5
6
|
|
|
@@ -14,6 +15,35 @@ class Net::FTP::List::Entry
|
|
|
14
15
|
end
|
|
15
16
|
end
|
|
16
17
|
|
|
18
|
+
# Tests for objects equality (value and type).
|
|
19
|
+
#
|
|
20
|
+
# @param entry [Net::FTP::List::Entry] an entry of the FTP list.
|
|
21
|
+
#
|
|
22
|
+
# @return [true, false] true if the objects are equal and have the same type; false otherwise.
|
|
23
|
+
#
|
|
24
|
+
def eql?(other)
|
|
25
|
+
return false if !other.instance_of? self.class
|
|
26
|
+
return true if self.object_id == other.object_id
|
|
27
|
+
|
|
28
|
+
self.raw == other.raw # if it's exactly the same line then the objects are the same
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
# Compares the receiver against another object.
|
|
33
|
+
#
|
|
34
|
+
# @param (see #eql?)
|
|
35
|
+
#
|
|
36
|
+
# @return [Fixnum] -1, 0, or +1 depending on whether the receiver is less than, equal to, or greater than the other object.
|
|
37
|
+
#
|
|
38
|
+
def <=>(other)
|
|
39
|
+
if other.instance_of? self.class
|
|
40
|
+
return self.filesize <=> other.filesize
|
|
41
|
+
elsif other.instance_of? Fixnum or other.instance_of? Integer or other.instance_of? Float
|
|
42
|
+
return self.filesize <=> other
|
|
43
|
+
end
|
|
44
|
+
raise ArgumentError.new('comparison of %s with %s failed!' % [self.class, other.class])
|
|
45
|
+
end
|
|
46
|
+
|
|
17
47
|
# The raw list entry string.
|
|
18
48
|
def raw
|
|
19
49
|
@raw ||= ''
|
data/lib/net/ftp/list/unix.rb
CHANGED
|
@@ -41,8 +41,18 @@ class Net::FTP::List::Unix < Net::FTP::List::Parser
|
|
|
41
41
|
|
|
42
42
|
# TODO: Permissions, users, groups, date/time.
|
|
43
43
|
filesize = match[18].to_i
|
|
44
|
-
|
|
45
|
-
mtime
|
|
44
|
+
mtime_string = "#{match[19]} #{match[20]}"
|
|
45
|
+
mtime = Time.parse(mtime_string)
|
|
46
|
+
|
|
47
|
+
# Unix mtimes specify a 4 digit year unless the data is within the past 180
|
|
48
|
+
# days or so. Future dates always specify a 4 digit year.
|
|
49
|
+
#
|
|
50
|
+
# Since the above #parse call fills in today's date for missing date
|
|
51
|
+
# components, it can sometimes get the year wrong. To fix this, we make
|
|
52
|
+
# sure all mtimes without a 4 digit year are in the past.
|
|
53
|
+
if match[20] !~ /\d{4}/ && mtime > Time.now
|
|
54
|
+
mtime = Time.parse("#{mtime_string} #{mtime.year - 1}")
|
|
55
|
+
end
|
|
46
56
|
|
|
47
57
|
basename = match[21].strip
|
|
48
58
|
|
data/net-ftp-list.gemspec
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
Gem::Specification.new do |s|
|
|
7
7
|
s.name = %q{net-ftp-list}
|
|
8
|
-
s.version = "3.2.
|
|
8
|
+
s.version = "3.2.1"
|
|
9
9
|
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
11
11
|
s.authors = ["Stateless Systems"]
|
|
12
|
-
s.date = %q{
|
|
12
|
+
s.date = %q{2012-08-01}
|
|
13
13
|
s.email = %q{enquiries@statelesssystems.com}
|
|
14
14
|
s.extra_rdoc_files = [
|
|
15
15
|
"README.txt"
|
|
@@ -3,6 +3,54 @@ require 'net/ftp/list'
|
|
|
3
3
|
|
|
4
4
|
class TestNetFTPEntry < Test::Unit::TestCase
|
|
5
5
|
|
|
6
|
+
def test_equality
|
|
7
|
+
a = Net::FTP::List::Entry.new('foo1', {:basename => 'foo1'})
|
|
8
|
+
b = Net::FTP::List::Entry.new('foo2', {:basename => 'foo2'})
|
|
9
|
+
c = Net::FTP::List::Entry.new('foo1', {:basename => 'foo1'})
|
|
10
|
+
|
|
11
|
+
assert a.eql? c
|
|
12
|
+
assert a.eql? a
|
|
13
|
+
assert !a.eql?(b)
|
|
14
|
+
assert !a.eql?(1)
|
|
15
|
+
assert !a.eql?(1.0)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_comparison
|
|
19
|
+
raw1 = '-rw-r--r-- 1 root other 1 Dec 31 23:59 file1'
|
|
20
|
+
raw2 = '-rw-r--r-- 1 root other 2 Dec 31 23:59 file2'
|
|
21
|
+
raw3 = '-rw-r--r-- 1 root other 3 Dec 31 23:59 file3'
|
|
22
|
+
|
|
23
|
+
file1 = Net::FTP::List.parse(raw1)
|
|
24
|
+
file2 = Net::FTP::List.parse(raw2)
|
|
25
|
+
file3 = Net::FTP::List.parse(raw3)
|
|
26
|
+
|
|
27
|
+
assert file2 > file1
|
|
28
|
+
assert file2 >= file1
|
|
29
|
+
assert file2 == file2
|
|
30
|
+
assert file2 <= file3
|
|
31
|
+
assert file2 < file3
|
|
32
|
+
assert !(file2 < file1)
|
|
33
|
+
assert !(file2 <= file1)
|
|
34
|
+
assert !(file2 == file1)
|
|
35
|
+
assert !(file2 == file3)
|
|
36
|
+
assert !(file2 > file3)
|
|
37
|
+
assert !(file2 >= file3)
|
|
38
|
+
|
|
39
|
+
assert !(file2 < 2)
|
|
40
|
+
assert !(file2 < 2.0)
|
|
41
|
+
assert file2 <= 2
|
|
42
|
+
assert file2 <= 2.0
|
|
43
|
+
assert file2 == 2
|
|
44
|
+
assert file2 == 2.0
|
|
45
|
+
assert !(file2 > 2)
|
|
46
|
+
assert !(file2 > 2.0)
|
|
47
|
+
assert file2 >= 2
|
|
48
|
+
assert file2 >= 2.0
|
|
49
|
+
|
|
50
|
+
assert_raise(ArgumentError) { assert file2 > nil }
|
|
51
|
+
assert_raise(ArgumentError) { assert file2 > true } # wrong class
|
|
52
|
+
end
|
|
53
|
+
|
|
6
54
|
def test_raise_on_unknown_options
|
|
7
55
|
assert_raise(ArgumentError) { Net::FTP::List::Entry.new("foo", {:bar => "baz"}) }
|
|
8
56
|
end
|
|
@@ -2,22 +2,13 @@ require 'test/unit'
|
|
|
2
2
|
require 'net/ftp/list'
|
|
3
3
|
|
|
4
4
|
class TestNetFTPListUnix < Test::Unit::TestCase
|
|
5
|
-
|
|
6
|
-
ONE_YEAR = (60 * 60 * 24 * 365)
|
|
7
|
-
|
|
8
|
-
FIRST_MINUTE_OF_YEAR = "Jan 1 00:00"
|
|
9
|
-
LAST_MINUTE_OF_YEAR = "Dec 31 23:59"
|
|
10
|
-
OTHER_RELATIVE_TIME = "Mar 11 07:57"
|
|
11
|
-
SYMBOLIC_LINK_TIME = "Oct 30 15:26"
|
|
12
|
-
ABSOLUTE_DATE = "Feb 15 2008"
|
|
13
|
-
|
|
14
5
|
def setup
|
|
15
|
-
@dir = Net::FTP::List.parse "drwxr-xr-x 4 user group 4096
|
|
16
|
-
@file = Net::FTP::List.parse "-rw-r--r-- 1 root other 531
|
|
17
|
-
@other_dir = Net::FTP::List.parse "drwxr-xr-x 8 1791 600 4096
|
|
6
|
+
@dir = Net::FTP::List.parse "drwxr-xr-x 4 user group 4096 Jan 1 00:00 etc" rescue nil
|
|
7
|
+
@file = Net::FTP::List.parse "-rw-r--r-- 1 root other 531 Dec 31 23:59 README" rescue nil
|
|
8
|
+
@other_dir = Net::FTP::List.parse "drwxr-xr-x 8 1791 600 4096 Mar 11 07:57 forums" rescue nil
|
|
18
9
|
@spaces = Net::FTP::List.parse 'drwxrwxr-x 2 danial danial 72 May 23 12:52 spaces suck' rescue nil
|
|
19
|
-
@symlink = Net::FTP::List.parse "lrwxrwxrwx 1 danial danial 4
|
|
20
|
-
@older_date = Net::FTP::List.parse "-rwxrwxrwx 1 owner group 154112
|
|
10
|
+
@symlink = Net::FTP::List.parse "lrwxrwxrwx 1 danial danial 4 Oct 30 15:26 bar -> /etc" rescue nil
|
|
11
|
+
@older_date = Net::FTP::List.parse "-rwxrwxrwx 1 owner group 154112 Feb 15 2008 participando.xls" rescue nil
|
|
21
12
|
@block_dev = Net::FTP::List.parse 'brw-r----- 1 root disk 1, 0 Apr 13 2006 ram0' rescue nil
|
|
22
13
|
@char_dev = Net::FTP::List.parse 'crw-rw-rw- 1 root root 1, 3 Apr 13 2006 null' rescue nil
|
|
23
14
|
@socket_dev = Net::FTP::List.parse 'srw-rw-rw- 1 root root 0 Aug 20 14:15 log' rescue nil
|
|
@@ -36,15 +27,53 @@ class TestNetFTPListUnix < Test::Unit::TestCase
|
|
|
36
27
|
assert_equal "Unix", @pipe_dev.server_type, 'LIST unix socket device'
|
|
37
28
|
end
|
|
38
29
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
30
|
+
class ::Time
|
|
31
|
+
class << self
|
|
32
|
+
def time_travel(time)
|
|
33
|
+
@traveled_to_time = time
|
|
34
|
+
|
|
35
|
+
begin
|
|
36
|
+
yield
|
|
37
|
+
ensure
|
|
38
|
+
@traveled_to_time = nil
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
alias_method :original_now, :now
|
|
43
|
+
def now
|
|
44
|
+
@traveled_to_time || original_now
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# mtimes in the past, same year.
|
|
50
|
+
def test_ruby_unix_like_date_past_same_year
|
|
51
|
+
Time.time_travel(Time.new(2009, 1, 1)) do
|
|
52
|
+
assert_equal Time.new(2009, 1, 1), Net::FTP::List.parse(@dir.raw).mtime
|
|
53
|
+
end
|
|
54
|
+
Time.time_travel(Time.new(2008, 4, 1)) do
|
|
55
|
+
assert_equal Time.new(2008, 3, 11, 7, 57), Net::FTP::List.parse(@other_dir.raw).mtime
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# mtimes in the past, previous year
|
|
60
|
+
def test_ruby_unix_like_date_past_previous_year
|
|
61
|
+
Time.time_travel(Time.new(2008, 2, 4)) do
|
|
62
|
+
assert_equal Time.new(2007, 10, 30, 15, 26), Net::FTP::List.parse(@symlink.raw).mtime
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# mtime in the future.
|
|
67
|
+
def test_ruby_unix_like_date_future
|
|
68
|
+
Time.time_travel(Time.new(2006, 3, 1)) do
|
|
69
|
+
assert_equal Time.new(2006, 4, 13), Net::FTP::List.parse(@char_dev.raw).mtime
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Parsed during a leap year.
|
|
74
|
+
def test_ruby_unix_like_date_leap_year
|
|
75
|
+
Time.time_travel(Time.new(2012, 1, 2)) do
|
|
76
|
+
assert_equal Time.new(2011, 10, 30, 15, 26), Net::FTP::List.parse(@symlink.raw).mtime
|
|
48
77
|
end
|
|
49
78
|
end
|
|
50
79
|
|
|
@@ -105,12 +134,4 @@ class TestNetFTPListUnix < Test::Unit::TestCase
|
|
|
105
134
|
assert_equal 'xconsole', @pipe_dev.basename
|
|
106
135
|
assert @pipe_dev.device?
|
|
107
136
|
end
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
private
|
|
111
|
-
def parse_adjust_date_and_time(date_and_time)
|
|
112
|
-
parsed_time = Time.parse(date_and_time)
|
|
113
|
-
parsed_time -= ONE_YEAR if parsed_time > Time.now
|
|
114
|
-
parsed_time
|
|
115
|
-
end
|
|
116
137
|
end
|
metadata
CHANGED
|
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
|
5
5
|
segments:
|
|
6
6
|
- 3
|
|
7
7
|
- 2
|
|
8
|
-
-
|
|
9
|
-
version: 3.2.
|
|
8
|
+
- 1
|
|
9
|
+
version: 3.2.1
|
|
10
10
|
platform: ruby
|
|
11
11
|
authors:
|
|
12
12
|
- Stateless Systems
|
|
@@ -14,7 +14,7 @@ autorequire:
|
|
|
14
14
|
bindir: bin
|
|
15
15
|
cert_chain: []
|
|
16
16
|
|
|
17
|
-
date:
|
|
17
|
+
date: 2012-08-01 00:00:00 +10:00
|
|
18
18
|
default_executable:
|
|
19
19
|
dependencies: []
|
|
20
20
|
|