oofile 0.0.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/CHANGELOG.rdoc +2 -0
- data/COPYING +32 -0
- data/README.rdoc +19 -0
- data/TODO.rdoc +2 -0
- data/doc/demo.rdoc +70 -0
- data/doc/demo.script +43 -0
- data/lib/oofile/filesystem.rb +95 -0
- data/lib/oofile.rb +2 -0
- data/test/data/testfile.txt +1 -0
- data/test/filesystem_test.rb +106 -0
- metadata +112 -0
data/CHANGELOG.rdoc
ADDED
data/COPYING
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
SiteBuilder Licence
|
2
|
+
|
3
|
+
COPYRIGHT AND PERMISSION NOTICE
|
4
|
+
|
5
|
+
Copyright (c) 2011 Green Bar Software Limited, UK
|
6
|
+
|
7
|
+
All rights reserved.
|
8
|
+
|
9
|
+
Permission is hereby granted, free of charge, to any person obtaining a
|
10
|
+
copy of this software and associated documentation files (the
|
11
|
+
"Software"), to deal in the Software without restriction, including
|
12
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
13
|
+
distribute, and/or sell copies of the Software, and to permit persons
|
14
|
+
to whom the Software is furnished to do so, provided that the above
|
15
|
+
copyright notice(s) and this permission notice appear in all copies of
|
16
|
+
the Software and that both the above copyright notice(s) and this
|
17
|
+
permission notice appear in supporting documentation.
|
18
|
+
|
19
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
20
|
+
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
21
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
22
|
+
OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
23
|
+
HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
|
24
|
+
INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
|
25
|
+
FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
26
|
+
NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
|
27
|
+
WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
28
|
+
|
29
|
+
Except as contained in this notice, the name of a copyright holder
|
30
|
+
shall not be used in advertising or otherwise to promote the sale, use
|
31
|
+
or other dealings in this Software without prior written authorization
|
32
|
+
of the copyright holder.
|
data/README.rdoc
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
== OOFile
|
2
|
+
oofile is an object-oriented way of accessing the filesystem.
|
3
|
+
|
4
|
+
=== How to use it
|
5
|
+
* Install with:
|
6
|
+
gem install oofile
|
7
|
+
* Basic operation can be seen in demo.rdoc
|
8
|
+
* *source* http://github.com/dafydd/sitebuilder
|
9
|
+
* To build me, set an environment variable called *SANDBOX* to the directory above your sitebuilder directory. The tests need this pathname to access test data.
|
10
|
+
|
11
|
+
=== Compatibility
|
12
|
+
This project is being developed on OS X. Automated testing for Linux will be included in future releases.
|
13
|
+
|
14
|
+
=== Licence
|
15
|
+
This is open source software and comes with no warranty. See COPYING for details.
|
16
|
+
|
17
|
+
http://www.greenbarsoft.co.uk
|
18
|
+
|
19
|
+
Copyright 2009-2011 Green Bar Software Limited, UK
|
data/TODO.rdoc
ADDED
data/doc/demo.rdoc
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
== Sample output
|
2
|
+
|
3
|
+
|
4
|
+
>> require 'oofile'
|
5
|
+
=> true
|
6
|
+
>>
|
7
|
+
?> dir_string = File.join(ENV['SANDBOX'],'oofile','test','data')
|
8
|
+
=> "/Users/dev/oofile/test/data"
|
9
|
+
>> file_string = File.join(dir_string,'testfile.txt')
|
10
|
+
=> "/Users/dev/oofile/test/data/testfile.txt"
|
11
|
+
>>
|
12
|
+
?> file_string
|
13
|
+
=> "/Users/dev/oofile/test/data/testfile.txt"
|
14
|
+
>>
|
15
|
+
?> dir_string
|
16
|
+
=> "/Users/dev/oofile/test/data"
|
17
|
+
>>
|
18
|
+
?> f = OOFile::FsEntry.fs_entry_from(file_string)
|
19
|
+
=> #<OOFile::FileEntry:0x1016a34f0 @path="/Users/dev/oofile/test/data/testfile.txt">
|
20
|
+
>>
|
21
|
+
?> f.extname
|
22
|
+
=> ".txt"
|
23
|
+
>>
|
24
|
+
?> f.extnless
|
25
|
+
=> "testfile"
|
26
|
+
>>
|
27
|
+
?> f.basename
|
28
|
+
=> "testfile.txt"
|
29
|
+
>>
|
30
|
+
?> f.dirname
|
31
|
+
=> "/Users/dev/oofile/test/data"
|
32
|
+
>>
|
33
|
+
?> f.ctime
|
34
|
+
=> Sat Feb 26 01:34:57 +0000 2011
|
35
|
+
>>
|
36
|
+
?> f.size
|
37
|
+
=> 28
|
38
|
+
>>
|
39
|
+
?> # equality comparison
|
40
|
+
?> f == OOFile::FsEntry.fs_entry_from(file_string)
|
41
|
+
=> true
|
42
|
+
>>
|
43
|
+
?> # directories
|
44
|
+
?>
|
45
|
+
?> d= OOFile::FsEntry.fs_entry_from(dir_string)
|
46
|
+
=> #<OOFile::DirEntry:0x10168a5b8 @path="/Users/dev/oofile/test/data">
|
47
|
+
>>
|
48
|
+
?> d.extname
|
49
|
+
=> ""
|
50
|
+
>>
|
51
|
+
?> d.extnless
|
52
|
+
=> "data"
|
53
|
+
>>
|
54
|
+
?> d.basename
|
55
|
+
=> "data"
|
56
|
+
>>
|
57
|
+
?> d.dirname
|
58
|
+
=> "/Users/dev/oofile/test"
|
59
|
+
>>
|
60
|
+
?> d.ctime
|
61
|
+
=> Sat Feb 26 01:34:57 +0000 2011
|
62
|
+
>>
|
63
|
+
?> d.size
|
64
|
+
=> 102
|
65
|
+
>>
|
66
|
+
?>
|
67
|
+
?> >> => nil
|
68
|
+
|
69
|
+
|
70
|
+
oofile 0.0.1
|
data/doc/demo.script
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'oofile'
|
2
|
+
|
3
|
+
dir_string = File.join(ENV['SANDBOX'],'oofile','test','data')
|
4
|
+
file_string = File.join(dir_string,'testfile.txt')
|
5
|
+
|
6
|
+
file_string
|
7
|
+
|
8
|
+
dir_string
|
9
|
+
|
10
|
+
f = OOFile::FsEntry.fs_entry_from(file_string)
|
11
|
+
|
12
|
+
f.extname
|
13
|
+
|
14
|
+
f.extnless
|
15
|
+
|
16
|
+
f.basename
|
17
|
+
|
18
|
+
f.dirname
|
19
|
+
|
20
|
+
f.ctime
|
21
|
+
|
22
|
+
f.size
|
23
|
+
|
24
|
+
# equality comparison
|
25
|
+
f == OOFile::FsEntry.fs_entry_from(file_string)
|
26
|
+
|
27
|
+
# directories
|
28
|
+
|
29
|
+
d= OOFile::FsEntry.fs_entry_from(dir_string)
|
30
|
+
|
31
|
+
d.extname
|
32
|
+
|
33
|
+
d.extnless
|
34
|
+
|
35
|
+
d.basename
|
36
|
+
|
37
|
+
d.dirname
|
38
|
+
|
39
|
+
d.ctime
|
40
|
+
|
41
|
+
d.size
|
42
|
+
|
43
|
+
|
@@ -0,0 +1,95 @@
|
|
1
|
+
#require 'FileUtils'
|
2
|
+
module OOFile
|
3
|
+
|
4
|
+
# Abstract class which is the abstract base class for file system instances
|
5
|
+
class FsEntry
|
6
|
+
# This is the canonical path to the file system entry
|
7
|
+
attr_reader :path
|
8
|
+
|
9
|
+
def initialize(path)
|
10
|
+
@path = File.expand_path(path)
|
11
|
+
end
|
12
|
+
|
13
|
+
def ==(other)
|
14
|
+
self.path==(other.path)
|
15
|
+
end
|
16
|
+
|
17
|
+
def extname
|
18
|
+
File::extname(@path)
|
19
|
+
end
|
20
|
+
|
21
|
+
# the bare filename without the file extension
|
22
|
+
def extnless
|
23
|
+
b = basename
|
24
|
+
b[0,b.size-extname.size]
|
25
|
+
end
|
26
|
+
|
27
|
+
def basename
|
28
|
+
File::basename(@path)
|
29
|
+
end
|
30
|
+
|
31
|
+
def dirname
|
32
|
+
File::dirname(@path)
|
33
|
+
end
|
34
|
+
|
35
|
+
def ctime
|
36
|
+
File::ctime(@path)
|
37
|
+
end
|
38
|
+
|
39
|
+
def size
|
40
|
+
File.size(@path)
|
41
|
+
end
|
42
|
+
|
43
|
+
# creates a file system entry for a fully qualified pathname
|
44
|
+
def self.fs_entry_from(f)
|
45
|
+
return FileEntry.new(f) if File.file?(f)
|
46
|
+
return DirEntry.new(f) if File.directory?(f)
|
47
|
+
UnknownEntry.new(f)
|
48
|
+
end
|
49
|
+
|
50
|
+
# creates a file system entry for a filename in the current file system entry object
|
51
|
+
def fs_entry_from(fs_entry)
|
52
|
+
FsEntry.fs_entry_from(File.join(@path, fs_entry))
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
# I represent a file in the filesystem
|
58
|
+
class FileEntry < FsEntry
|
59
|
+
|
60
|
+
# I am visitable with a traverser.
|
61
|
+
def traverse(traverser)
|
62
|
+
traverser.traverse_file(self)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# I represent filesystem entries that have been detected but aren't supported.
|
67
|
+
class UnknownEntry < FsEntry
|
68
|
+
end
|
69
|
+
|
70
|
+
# I represent directories in the filesystem.
|
71
|
+
class DirEntry < FsEntry
|
72
|
+
|
73
|
+
# I am visitable with a Traverser. I perform inorder traversal of FsEntries.
|
74
|
+
def traverse(traverser)
|
75
|
+
traverser.traverse_dir(self)
|
76
|
+
Dir.new(@path).each do |stringpath|
|
77
|
+
subentry = fs_entry_from(stringpath)
|
78
|
+
subentry.traverse(traverser) unless stringpath=='.' || stringpath=='..'
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
# Visitor for traversing a filesystem
|
85
|
+
class Traverser
|
86
|
+
# callback when traversing a DirEntry object
|
87
|
+
def traverse_dir(dir_entry)
|
88
|
+
end
|
89
|
+
|
90
|
+
# callback when traversing a FileEntry object
|
91
|
+
def traverse_file(file_entry)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
data/lib/oofile.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
My ctime is used for tests.
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'mocha'
|
4
|
+
require 'oofile/filesystem'
|
5
|
+
|
6
|
+
|
7
|
+
FS = File::SEPARATOR
|
8
|
+
TEST_DIRNAME = 'data'
|
9
|
+
TESTDATA_DIR = ENV['SANDBOX']+FS+'sitebuilder'+FS+'test'+FS+TEST_DIRNAME
|
10
|
+
TEST_FILENAME = 'testfile.txt'
|
11
|
+
TEST_FILEPATH = TESTDATA_DIR+FS+TEST_FILENAME
|
12
|
+
|
13
|
+
class FsEntryTest < Test::Unit::TestCase
|
14
|
+
|
15
|
+
def test_instances_and_equality
|
16
|
+
a_file = OOFile::FsEntry.new('/this/that/foo.txt')
|
17
|
+
another_file = OOFile::FsEntry.new('/this/that/foo.txt')
|
18
|
+
different_file=OOFile::FsEntry.new('/this/that/other.txt')
|
19
|
+
|
20
|
+
assert_equal(another_file, a_file)
|
21
|
+
assert_equal(a_file, another_file)
|
22
|
+
assert_not_equal(a_file, different_file)
|
23
|
+
assert_not_equal(another_file, different_file)
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_extname
|
27
|
+
assert_equal('.txt', OOFile::FsEntry.new('/this/that/foo.txt').extname)
|
28
|
+
assert_equal('', OOFile::FsEntry.new('/this/that/foo.').extname)
|
29
|
+
assert_equal('', OOFile::FsEntry.new('/this/that/foo').extname)
|
30
|
+
assert_equal('', OOFile::FsEntry.new('/this/that/.foo').extname)
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_extnless
|
34
|
+
assert_equal('foo', OOFile::FsEntry.new('/this/that/foo.txt').extnless)
|
35
|
+
assert_equal('foo.',OOFile::FsEntry.new('/this/that/foo.').extnless)
|
36
|
+
assert_equal('foo', OOFile::FsEntry.new('/this/that/foo').extnless)
|
37
|
+
assert_equal('.foo',OOFile::FsEntry.new('/this/that/.foo').extnless)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_basename
|
41
|
+
assert_equal('foo.txt', OOFile::FsEntry.new('/this/that/foo.txt').basename)
|
42
|
+
assert_equal('foo.txt', OOFile::FsEntry.new('/foo.txt').basename)
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_dirname
|
46
|
+
assert_equal('/this/that', OOFile::FsEntry.new('/this/that/foo.txt').dirname)
|
47
|
+
assert_equal('/this/that', OOFile::FsEntry.new('/this/that/foo/').dirname)
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_ctime
|
51
|
+
assert_equal(File::ctime(TEST_FILEPATH), OOFile::FsEntry.new(TEST_FILEPATH).ctime)
|
52
|
+
assert OOFile::FsEntry.new(TEST_FILEPATH).ctime.to_i > 0
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_size
|
56
|
+
assert_equal(28, OOFile::FsEntry.new(TEST_FILEPATH).size)
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_fs_entry_from
|
60
|
+
assert_equal OOFile::FileEntry, OOFile::FsEntry.fs_entry_from(TEST_FILEPATH).class
|
61
|
+
assert_equal OOFile::DirEntry, OOFile::FsEntry.fs_entry_from(TESTDATA_DIR).class
|
62
|
+
assert_equal OOFile::UnknownEntry, OOFile::FsEntry.fs_entry_from('/dev/null').class
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_instance_fs_entry_from
|
66
|
+
instance = OOFile::FsEntry.fs_entry_from(TESTDATA_DIR)
|
67
|
+
file_result = instance.fs_entry_from(TEST_FILENAME)
|
68
|
+
dir_result = instance.fs_entry_from('.')
|
69
|
+
|
70
|
+
assert_equal instance.path+FS+TEST_FILENAME, file_result.path
|
71
|
+
assert_equal instance.path, dir_result.path
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
class FileEntryTest < Test::Unit::TestCase
|
77
|
+
|
78
|
+
def test_traverse
|
79
|
+
traverser = OOFile::Traverser.new
|
80
|
+
traverser.expects(:traverse_file).once().with do |file|
|
81
|
+
OOFile::FileEntry==file.class && 'testfile.txt'==file.basename
|
82
|
+
end
|
83
|
+
traverser.expects(:traverse_dir).never()
|
84
|
+
|
85
|
+
file = OOFile::FsEntry.fs_entry_from(TEST_FILEPATH)
|
86
|
+
file.traverse(traverser)
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
class DirEntryTest < Test::Unit::TestCase
|
92
|
+
|
93
|
+
def test_traverse
|
94
|
+
traverser = OOFile::Traverser.new
|
95
|
+
traverser.expects(:traverse_file).once().with do |file|
|
96
|
+
OOFile::FileEntry==file.class && 'testfile.txt'==file.basename
|
97
|
+
end
|
98
|
+
traverser.expects(:traverse_dir).once().with do |dir|
|
99
|
+
OOFile::DirEntry==dir.class && TESTDATA_DIR==dir.path
|
100
|
+
end
|
101
|
+
|
102
|
+
file = OOFile::FsEntry.fs_entry_from(TESTDATA_DIR)
|
103
|
+
file.traverse(traverser)
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
metadata
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: oofile
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Dafydd Rees
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-02-26 00:00:00 +00:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: mocha
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 43
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
- 9
|
33
|
+
- 8
|
34
|
+
version: 0.9.8
|
35
|
+
type: :development
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: rcov
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 55
|
46
|
+
segments:
|
47
|
+
- 0
|
48
|
+
- 9
|
49
|
+
- 6
|
50
|
+
version: 0.9.6
|
51
|
+
type: :development
|
52
|
+
version_requirements: *id002
|
53
|
+
description: Object-oriented access to the filesystem.
|
54
|
+
email: os@greenbarsoft.co.uk
|
55
|
+
executables: []
|
56
|
+
|
57
|
+
extensions: []
|
58
|
+
|
59
|
+
extra_rdoc_files:
|
60
|
+
- CHANGELOG.rdoc
|
61
|
+
- COPYING
|
62
|
+
- README.rdoc
|
63
|
+
- doc/demo.rdoc
|
64
|
+
- TODO.rdoc
|
65
|
+
files:
|
66
|
+
- doc/demo.script
|
67
|
+
- lib/oofile/filesystem.rb
|
68
|
+
- lib/oofile.rb
|
69
|
+
- test/data/testfile.txt
|
70
|
+
- test/filesystem_test.rb
|
71
|
+
- ./test/filesystem_test.rb
|
72
|
+
- CHANGELOG.rdoc
|
73
|
+
- COPYING
|
74
|
+
- README.rdoc
|
75
|
+
- doc/demo.rdoc
|
76
|
+
- TODO.rdoc
|
77
|
+
has_rdoc: true
|
78
|
+
homepage: http://www.greenbarsoft.co.uk/software/oofile
|
79
|
+
licenses: []
|
80
|
+
|
81
|
+
post_install_message:
|
82
|
+
rdoc_options: []
|
83
|
+
|
84
|
+
require_paths:
|
85
|
+
- lib
|
86
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
87
|
+
none: false
|
88
|
+
requirements:
|
89
|
+
- - ">="
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
hash: 3
|
92
|
+
segments:
|
93
|
+
- 0
|
94
|
+
version: "0"
|
95
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
|
+
none: false
|
97
|
+
requirements:
|
98
|
+
- - ">="
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
hash: 3
|
101
|
+
segments:
|
102
|
+
- 0
|
103
|
+
version: "0"
|
104
|
+
requirements: []
|
105
|
+
|
106
|
+
rubyforge_project:
|
107
|
+
rubygems_version: 1.3.7
|
108
|
+
signing_key:
|
109
|
+
specification_version: 3
|
110
|
+
summary: Static site generator
|
111
|
+
test_files:
|
112
|
+
- ./test/filesystem_test.rb
|