exegesis 0.0.4 → 0.0.5
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 +11 -2
- data/NOTES.md +24 -0
- data/lib/exegesis.rb +1 -17
- data/lib/exegesis/base_directory.rb +13 -11
- data/lib/exegesis/directory.rb +24 -14
- data/lib/exegesis/file_searcher.rb +31 -29
- data/lib/exegesis/file_system_entity.rb +35 -35
- data/lib/exegesis/flyweight.rb +104 -103
- data/lib/exegesis/registerable.rb +42 -40
- data/lib/exegesis/source_file.rb +23 -21
- data/lib/exegesis/version.rb +1 -1
- data/spec/integration/flyweight_registerable_spec.rb +2 -2
- data/spec/integration/visitor_spec.rb +1 -1
- data/spec/shared/file_system_entity_examples.rb +15 -0
- data/spec/spec_helper.rb +5 -2
- data/spec/unit/base_directory_spec.rb +27 -28
- data/spec/unit/directory_spec.rb +37 -8
- data/spec/unit/file_searcher_spec.rb +10 -10
- data/spec/unit/flyweight_spec.rb +9 -9
- data/spec/unit/source_file_spec.rb +8 -7
- metadata +18 -50
- data/spec/fake_project/AUTHORS +0 -1
- data/spec/fake_project/Rakefile +0 -14
- data/spec/fake_project/config.yml +0 -6
- data/spec/fake_project/src/grafton.c +0 -25
- data/spec/fake_project/src/node.c +0 -23
- data/spec/fake_project/src/node.h +0 -19
- data/spec/fake_project/test/example2_test.c +0 -29
- data/spec/fake_project/test/example_test.c +0 -12
- data/spec/fake_project/test/test_helper.h +0 -19
@@ -1,57 +1,59 @@
|
|
1
|
-
module
|
2
|
-
|
3
|
-
base
|
4
|
-
|
5
|
-
|
1
|
+
module Exegesis
|
2
|
+
module Registerable
|
3
|
+
def self.included(base)
|
4
|
+
base.instance_eval do
|
5
|
+
extend ClassMethods
|
6
|
+
include InstanceMethods
|
7
|
+
end
|
6
8
|
end
|
7
|
-
end
|
8
9
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
module ClassMethods
|
11
|
+
def create(*args)
|
12
|
+
retrieve(*args) || build(*args)
|
13
|
+
end
|
13
14
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
def retrieve(*args)
|
16
|
+
path = build_path(*args.take(2))
|
17
|
+
registry[path] if registry.has_key?(path)
|
18
|
+
end
|
18
19
|
|
19
|
-
|
20
|
-
|
21
|
-
|
20
|
+
def build(*args)
|
21
|
+
new(*args).tap do |instance|
|
22
|
+
registry.register! instance
|
23
|
+
end
|
22
24
|
end
|
23
|
-
end
|
24
25
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
26
|
+
def registry
|
27
|
+
@flyweight ||= Flyweight.new do |dir|
|
28
|
+
if dir.respond_to? :path
|
29
|
+
dir.path
|
30
|
+
else
|
31
|
+
dir
|
32
|
+
end
|
31
33
|
end
|
32
34
|
end
|
33
|
-
end
|
34
35
|
|
35
|
-
|
36
|
-
|
37
|
-
|
36
|
+
def clear_registry!
|
37
|
+
registry.clear!
|
38
|
+
end
|
38
39
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
40
|
+
def build_path(*args)
|
41
|
+
parent, name = *args
|
42
|
+
return parent if name.nil?
|
43
|
+
File.join(parent.path, name)
|
44
|
+
end
|
43
45
|
end
|
44
|
-
end
|
45
46
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
47
|
+
module InstanceMethods
|
48
|
+
def path
|
49
|
+
build_path(parent, name)
|
50
|
+
end
|
50
51
|
|
51
|
-
|
52
|
+
private
|
52
53
|
|
53
|
-
|
54
|
-
|
54
|
+
def build_path(parent, child)
|
55
|
+
self.class.build_path(parent, child)
|
56
|
+
end
|
55
57
|
end
|
56
58
|
end
|
57
59
|
end
|
data/lib/exegesis/source_file.rb
CHANGED
@@ -17,32 +17,34 @@
|
|
17
17
|
# Collaborators:
|
18
18
|
# SourceFile
|
19
19
|
# SourceFileFactory -- to build the appropriate subclass based on file extenstion
|
20
|
-
|
21
|
-
|
20
|
+
module Exegesis
|
21
|
+
class SourceFile
|
22
|
+
include FileSystemEntity
|
22
23
|
|
23
|
-
|
24
|
-
|
25
|
-
|
24
|
+
def content
|
25
|
+
fs_interface.read(path)
|
26
|
+
end
|
26
27
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
attr_reader :dependencies
|
29
|
+
def depends_on(file)
|
30
|
+
raise InvalidDependency unless file.is_a?(SourceFile)
|
31
|
+
@dependencies << file
|
32
|
+
end
|
32
33
|
|
33
|
-
|
34
|
+
private
|
34
35
|
|
35
|
-
|
36
|
-
|
36
|
+
def initialize(parent, name, fs_interface = File)
|
37
|
+
raise ArgumentError, "parent must be a directory" unless parent.is_a?(Directory)
|
37
38
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
39
|
+
@fs_interface = fs_interface
|
40
|
+
@ext = fs_interface.extname(name)
|
41
|
+
@name = name
|
42
|
+
@parent = parent
|
43
|
+
@dependencies = []
|
44
|
+
end
|
45
|
+
|
46
|
+
attr_reader :fs_interface
|
43
47
|
end
|
44
48
|
|
45
|
-
|
49
|
+
class InvalidDependency < StandardError ; end
|
46
50
|
end
|
47
|
-
|
48
|
-
class InvalidDependency < StandardError ; end
|
data/lib/exegesis/version.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
require 'integration_spec_helper'
|
2
2
|
|
3
|
-
describe Flyweight, "mixin", "other objects" do
|
3
|
+
describe Exegesis::Flyweight, "mixin", "other objects" do
|
4
4
|
before do
|
5
5
|
class Example
|
6
|
-
include Registerable
|
6
|
+
include Exegesis::Registerable
|
7
7
|
def initialize(parent, name, *args)
|
8
8
|
@parent = parent
|
9
9
|
@name = name
|
@@ -0,0 +1,15 @@
|
|
1
|
+
shared_examples_for 'a FileSystemEntity' do
|
2
|
+
describe 'api' do
|
3
|
+
it { should respond_to :path }
|
4
|
+
it { should respond_to :basename }
|
5
|
+
it { should respond_to :visit }
|
6
|
+
|
7
|
+
it { should respond_to :parent }
|
8
|
+
it { should respond_to :container } #alias
|
9
|
+
|
10
|
+
it { should respond_to :name }
|
11
|
+
|
12
|
+
it { should respond_to :ext }
|
13
|
+
it { should respond_to :extension } #alias
|
14
|
+
end
|
15
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -11,14 +11,17 @@ require 'rspec-spies'
|
|
11
11
|
#include helpers
|
12
12
|
Dir["./spec/helpers/*.rb"].each { |file| require file }
|
13
13
|
|
14
|
+
#include shared examples
|
15
|
+
Dir["./spec/shared/*_examples.rb"].each { |file| require file }
|
16
|
+
|
14
17
|
RSpec.configure do |config|
|
15
18
|
config.before do
|
16
19
|
allow_message_expectations_on_nil
|
17
20
|
end
|
18
21
|
|
19
22
|
config.after do
|
20
|
-
SourceFile.clear_registry!
|
21
|
-
Directory.clear_registry!
|
23
|
+
Exegesis::SourceFile.clear_registry!
|
24
|
+
Exegesis::Directory.clear_registry!
|
22
25
|
end
|
23
26
|
|
24
27
|
config.treat_symbols_as_metadata_keys_with_true_values = true
|
@@ -1,13 +1,12 @@
|
|
1
1
|
require 'unit_spec_helper'
|
2
2
|
|
3
|
-
describe BaseDirectory do
|
3
|
+
describe Exegesis::BaseDirectory do
|
4
4
|
let (:root) { double('some path to a project directory').as_null_object }
|
5
5
|
let (:searcher) { double('directory searcher like FileSearcher') }
|
6
6
|
let (:dir) { double('fake directory') }
|
7
7
|
let (:file) { double('fake file') }
|
8
8
|
|
9
|
-
let (:project) { BaseDirectory.create(root, searcher) }
|
10
|
-
|
9
|
+
let (:project) { Exegesis::BaseDirectory.create(root, searcher) }
|
11
10
|
|
12
11
|
before do
|
13
12
|
searcher.stub(:[]).with(root + '*').and_return([dir, file])
|
@@ -15,30 +14,30 @@ describe BaseDirectory do
|
|
15
14
|
searcher.stub(:search).and_return(searcher)
|
16
15
|
end
|
17
16
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
describe '#root' do
|
29
|
-
subject { project.root }
|
30
|
-
it { should == root }
|
31
|
-
end
|
32
|
-
|
33
|
-
it { should delegate(:files).to(searcher) }
|
34
|
-
it { should delegate(:directories).to(searcher) }
|
35
|
-
|
36
|
-
#it should also provide interface for
|
37
|
-
# * creating files/directories
|
38
|
-
# - something like `directories << Directory('foo')` ?
|
39
|
-
#
|
40
|
-
# *
|
41
|
-
#
|
42
|
-
#it should also have a #visit method, see the NOTES doc for details on that
|
17
|
+
subject { project }
|
18
|
+
|
19
|
+
it_should_behave_like 'a FileSystemEntity'
|
20
|
+
|
21
|
+
describe 'api' do
|
22
|
+
it { should be_a Exegesis::Directory }
|
23
|
+
it { should respond_to :root }
|
24
|
+
it { should respond_to :directories }
|
25
|
+
it { should respond_to :files }
|
43
26
|
end
|
27
|
+
|
28
|
+
describe '#root' do
|
29
|
+
subject { project.root }
|
30
|
+
it { should == root }
|
31
|
+
end
|
32
|
+
|
33
|
+
it { should delegate(:files).to(searcher) }
|
34
|
+
it { should delegate(:directories).to(searcher) }
|
35
|
+
|
36
|
+
#it should also provide interface for
|
37
|
+
# * creating files/directories
|
38
|
+
# - something like `directories << Directory('foo')` ?
|
39
|
+
#
|
40
|
+
# *
|
41
|
+
#
|
42
|
+
#it should also have a #visit method, see the NOTES doc for details on that
|
44
43
|
end
|
data/spec/unit/directory_spec.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
require 'unit_spec_helper'
|
2
2
|
|
3
|
-
describe Directory do
|
3
|
+
describe Exegesis::Directory do
|
4
4
|
let (:parent) { double('parent directory') }
|
5
5
|
let (:parent_path) { 'parent/' }
|
6
6
|
let (:name) { 'subdir/' }
|
7
7
|
let (:searcher) { double('searcher') }
|
8
|
-
let (:directory) { Directory.create(parent, name, searcher) }
|
8
|
+
let (:directory) { Exegesis::Directory.create(parent, name, searcher) }
|
9
9
|
|
10
10
|
before do
|
11
|
-
parent.stub(:is_a?).with(Directory).and_return(true)
|
11
|
+
parent.stub(:is_a?).with(Exegesis::Directory).and_return(true)
|
12
12
|
parent.stub(:path).and_return(parent_path)
|
13
13
|
|
14
14
|
searcher.stub(:new).and_return(searcher)
|
@@ -16,12 +16,16 @@ describe Directory do
|
|
16
16
|
|
17
17
|
subject { directory }
|
18
18
|
|
19
|
+
it_should_behave_like 'a FileSystemEntity'
|
20
|
+
|
19
21
|
describe 'api' do
|
20
|
-
it { should respond_to :directories
|
21
|
-
it { should respond_to :parent
|
22
|
-
it { should respond_to :files
|
23
|
-
it { should respond_to :path
|
24
|
-
it { should respond_to :children
|
22
|
+
it { should respond_to :directories }
|
23
|
+
it { should respond_to :parent }
|
24
|
+
it { should respond_to :files }
|
25
|
+
it { should respond_to :path }
|
26
|
+
it { should respond_to :children }
|
27
|
+
it { should respond_to :find_file }
|
28
|
+
it { should respond_to :find_directory }
|
25
29
|
|
26
30
|
its(:class) { should respond_to :create }
|
27
31
|
end
|
@@ -35,4 +39,29 @@ describe Directory do
|
|
35
39
|
it { should be_a String }
|
36
40
|
it { should == File.join(parent_path, name) }
|
37
41
|
end
|
42
|
+
|
43
|
+
describe '#find_file' do
|
44
|
+
let(:file_foo) { double("sourcefile('foo')", name: 'foo') }
|
45
|
+
let(:file_bar) { double("sourcefile('bar')", name: 'bar') }
|
46
|
+
let(:files) { [file_foo, file_bar] }
|
47
|
+
|
48
|
+
before { directory.stub(:files).and_return files }
|
49
|
+
|
50
|
+
subject { directory.find_file('foo') }
|
51
|
+
|
52
|
+
it { should be file_foo }
|
53
|
+
end
|
54
|
+
|
55
|
+
describe '#find_directory' do
|
56
|
+
let(:directory_foo) { double("directory('foo')", name: 'foo') }
|
57
|
+
let(:directory_bar) { double("directory('bar')", name: 'bar') }
|
58
|
+
let(:directories) { [directory_foo, directory_bar] }
|
59
|
+
|
60
|
+
before { directory.stub(:directories).and_return directories }
|
61
|
+
|
62
|
+
subject { directory.find_directory('foo') }
|
63
|
+
|
64
|
+
it { should be directory_foo }
|
65
|
+
end
|
66
|
+
|
38
67
|
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
require 'unit_spec_helper'
|
2
2
|
|
3
|
-
describe FileSearcher do
|
3
|
+
describe Exegesis::FileSearcher do
|
4
4
|
let (:root) { double('a fake backend') }
|
5
5
|
let (:root_path) { double('a fake path') }
|
6
6
|
let (:globbed_path) { double('a fake glob of root_path with *') }
|
7
7
|
let (:fs_interface) { double('a File System Interface like `File`') }
|
8
|
-
let (:file_searcher) { FileSearcher.new(root, fs_interface) }
|
8
|
+
let (:file_searcher) { Exegesis::FileSearcher.new(root, fs_interface) }
|
9
9
|
let (:dir) { double('a fake directory') }
|
10
10
|
let (:file) { double('a fake file') }
|
11
11
|
let (:file_path) { double('the fake file path') }
|
@@ -27,11 +27,11 @@ describe FileSearcher do
|
|
27
27
|
fs_interface.stub(:join).with(root_path, file).and_return(file_path)
|
28
28
|
fs_interface.stub(:join).with(root_path, dir).and_return(dir_path)
|
29
29
|
|
30
|
-
Directory.stub(:new).with(root, dir).and_return(fake_directory_instance)
|
31
|
-
SourceFile.stub(:new).with(root, file).and_return(fake_source_file_instance)
|
30
|
+
Exegesis::Directory.stub(:new).with(root, dir).and_return(fake_directory_instance)
|
31
|
+
Exegesis::SourceFile.stub(:new).with(root, file).and_return(fake_source_file_instance)
|
32
32
|
|
33
|
-
fake_source_file_instance.stub(:is_a?).with(SourceFile).and_return(true)
|
34
|
-
fake_directory_instance.stub(:is_a?).with(Directory).and_return(true)
|
33
|
+
fake_source_file_instance.stub(:is_a?).with(Exegesis::SourceFile).and_return(true)
|
34
|
+
fake_directory_instance.stub(:is_a?).with(Exegesis::Directory).and_return(true)
|
35
35
|
|
36
36
|
root.stub(:path).and_return(root_path)
|
37
37
|
end
|
@@ -67,8 +67,8 @@ describe FileSearcher do
|
|
67
67
|
it { should contain(fake_directory_instance) }
|
68
68
|
it { should exclude(fake_source_file_instance) }
|
69
69
|
|
70
|
-
the_class(Directory) { should have_received(:new).with(root, dir) }
|
71
|
-
the_class(SourceFile) { should_not have_received(:new) }
|
70
|
+
the_class(Exegesis::Directory) { should have_received(:new).with(root, dir) }
|
71
|
+
the_class(Exegesis::SourceFile) { should_not have_received(:new) }
|
72
72
|
end
|
73
73
|
|
74
74
|
describe '#files' do
|
@@ -78,8 +78,8 @@ describe FileSearcher do
|
|
78
78
|
it { should contain(fake_source_file_instance) }
|
79
79
|
it { should exclude(fake_directory_instance) }
|
80
80
|
|
81
|
-
the_class(Directory) { should_not have_received(:new) }
|
82
|
-
the_class(SourceFile) { should have_received(:new).with(root, file) }
|
81
|
+
the_class(Exegesis::Directory) { should_not have_received(:new) }
|
82
|
+
the_class(Exegesis::SourceFile) { should have_received(:new).with(root, file) }
|
83
83
|
end
|
84
84
|
end
|
85
85
|
end
|
data/spec/unit/flyweight_spec.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'unit_spec_helper'
|
2
2
|
|
3
|
-
describe Flyweight do
|
4
|
-
let (:processor) { proc { |instance| instance_key }
|
5
|
-
let (:flyweight) { Flyweight.new(&processor)
|
6
|
-
let (:instance) { double('instance')
|
7
|
-
let (:instance_key) { double('instance_key')
|
3
|
+
describe Exegesis::Flyweight do
|
4
|
+
let (:processor) { proc { |instance| instance_key } }
|
5
|
+
let (:flyweight) { Exegesis::Flyweight.new(&processor) }
|
6
|
+
let (:instance) { double('instance') }
|
7
|
+
let (:instance_key) { double('instance_key') }
|
8
8
|
|
9
9
|
subject { flyweight }
|
10
10
|
|
@@ -17,12 +17,12 @@ describe Flyweight do
|
|
17
17
|
|
18
18
|
describe 'unregistering an unused key' do
|
19
19
|
it 'raises an error' do
|
20
|
-
expect { flyweight.unregister!(key) }.to raise_error Flyweight::NoEntryError
|
20
|
+
expect { flyweight.unregister!(key) }.to raise_error Exegesis::Flyweight::NoEntryError
|
21
21
|
end
|
22
22
|
|
23
23
|
describe '#unregister' do
|
24
24
|
it 'raises an error' do
|
25
|
-
expect { flyweight.unregister(key) }.to_not raise_error Flyweight::NoEntryError
|
25
|
+
expect { flyweight.unregister(key) }.to_not raise_error Exegesis::Flyweight::NoEntryError
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
@@ -46,12 +46,12 @@ describe Flyweight do
|
|
46
46
|
describe '#register! and #register' do
|
47
47
|
describe 'registering an instance with an already-used key' do
|
48
48
|
it 'raises an error' do
|
49
|
-
expect { flyweight.register!(instance) }.to raise_error Flyweight::AlreadyRegisteredError
|
49
|
+
expect { flyweight.register!(instance) }.to raise_error Exegesis::Flyweight::AlreadyRegisteredError
|
50
50
|
end
|
51
51
|
|
52
52
|
describe '#register' do
|
53
53
|
it 'does not raise an error' do
|
54
|
-
expect { flyweight.register(instance) }.to_not raise_error Flyweight::AlreadyRegisteredError
|
54
|
+
expect { flyweight.register(instance) }.to_not raise_error Exegesis::Flyweight::AlreadyRegisteredError
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|