exegesis 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,9 @@
1
+ = 0.0.3 - 0.0.4
2
+ * Make sure Forwardable gem dependency gets loaded at the appropriate
3
+ load-level
4
+ * Skirt a very rare crash during tests (happens _literally_ only to my one
5
+ computer) in rubinius 2.0.0rc1
6
+ * Internal Refactoring to avoid stubbing core classes like `File` and `Dir`
1
7
 
2
8
  * 0.0.2
3
9
  Large amount of functionality in place, including BaseDirectories,
@@ -19,18 +19,23 @@ class FileSearcher
19
19
  # Create a new FileSearcher on the given path
20
20
  #
21
21
  # @param parent [Directory] the parent directory to search downward from
22
- def initialize(parent)
22
+ def initialize(parent, fs_interface = File)
23
+ @fs_interface = fs_interface
23
24
  @parent = parent
24
25
  end
25
26
 
26
27
  #All of the directories in the given path
27
28
  def directories
28
- content.select { |s| File.directory?(s) }.map { |s| Directory.create(parent, File.basename(s)) }
29
+ content.
30
+ select { |s| fs_interface.directory?(s) }.
31
+ map { |s| Directory.create(parent, fs_interface.basename(s)) }
29
32
  end
30
33
 
31
34
  #All of the files in the given path
32
35
  def files
33
- content.select { |s| File.file?(s) }.map { |s| SourceFile.create(parent, File.basename(s)) }
36
+ content.
37
+ select { |s| fs_interface.file?(s) }.
38
+ map { |s| SourceFile.create(parent, fs_interface.basename(s)) }
34
39
  end
35
40
 
36
41
  #All of the content from the given path
@@ -44,5 +49,5 @@ class FileSearcher
44
49
 
45
50
  private
46
51
 
47
- attr_reader :parent
52
+ attr_reader :parent, :fs_interface
48
53
  end
@@ -1,6 +1,5 @@
1
1
  module Registerable
2
2
  def self.included(base)
3
- base.private_class_method :new, :allocate
4
3
  base.instance_eval do
5
4
  extend ClassMethods
6
5
  include InstanceMethods
@@ -21,7 +21,7 @@ class SourceFile
21
21
  include FileSystemEntity
22
22
 
23
23
  def content
24
- File.read(path)
24
+ fs_interface.read(path)
25
25
  end
26
26
 
27
27
  attr_reader :dependencies
@@ -32,14 +32,17 @@ class SourceFile
32
32
 
33
33
  private
34
34
 
35
- def initialize(parent, name)
35
+ def initialize(parent, name, fs_interface = File)
36
36
  raise ArgumentError, "parent must be a directory" unless parent.is_a?(Directory)
37
37
 
38
- @ext = File.extname(name)
38
+ @fs_interface = fs_interface
39
+ @ext = fs_interface.extname(name)
39
40
  @name = name
40
41
  @parent = parent
41
42
  @dependencies = []
42
43
  end
44
+
45
+ attr_reader :fs_interface
43
46
  end
44
47
 
45
48
  class InvalidDependency < StandardError ; end
@@ -1,4 +1,4 @@
1
1
  module Exegesis
2
2
  #@private
3
- VERSION = "0.0.3"
3
+ VERSION = "0.0.4"
4
4
  end
@@ -47,12 +47,6 @@ describe Flyweight, "mixin", "other objects" do
47
47
  end
48
48
  end
49
49
 
50
- describe 'instantiation' do
51
- it 'disallows instantiation via #new' do
52
- expect { Example.new(parent, 'n') }.to raise_error NoMethodError
53
- end
54
- end
55
-
56
50
  describe 'creating a new instance' do
57
51
  subject { Example.create(parent, 'n') }
58
52
  end
@@ -16,12 +16,6 @@ describe Directory do
16
16
 
17
17
  subject { directory }
18
18
 
19
- describe 'instantiation' do
20
- it 'disallows instantiation via #new' do
21
- expect { Directory.new(parent, name, searcher) }.to raise_error NoMethodError
22
- end
23
- end
24
-
25
19
  describe 'api' do
26
20
  it { should respond_to :directories }
27
21
  it { should respond_to :parent }
@@ -1,30 +1,31 @@
1
1
  require 'unit_spec_helper'
2
2
 
3
3
  describe FileSearcher do
4
- let (:root) { double('a fake backend') }
5
- let (:root_path) { double('a fake path') }
6
- let (:globbed_path) { double('a fake glob of root_path with *') }
7
- let (:file_searcher) { FileSearcher.new(root) }
8
- let (:dir) { double('a fake directory') }
9
- let (:file) { double('a fake file') }
10
- let (:file_path) { double('the fake file path') }
11
- let (:dir_path) { double('the directory file path') }
4
+ let (:root) { double('a fake backend') }
5
+ let (:root_path) { double('a fake path') }
6
+ let (:globbed_path) { double('a fake glob of root_path with *') }
7
+ let (:fs_interface) { double('a File System Interface like `File`') }
8
+ let (:file_searcher) { FileSearcher.new(root, fs_interface) }
9
+ let (:dir) { double('a fake directory') }
10
+ let (:file) { double('a fake file') }
11
+ let (:file_path) { double('the fake file path') }
12
+ let (:dir_path) { double('the directory file path') }
12
13
 
13
14
  let (:fake_source_file_instance) { double('a fake SourceFile instance') }
14
15
  let (:fake_directory_instance) { double('a fake Directory instance') }
15
16
 
16
17
  before do
17
- File.stub(:directory?).with(dir).and_return(true)
18
- File.stub(:file?).with(dir).and_return(false)
19
- File.stub(:basename).with(dir).and_return(dir)
18
+ fs_interface.stub(:directory?).with(dir).and_return(true)
19
+ fs_interface.stub(:file?).with(dir).and_return(false)
20
+ fs_interface.stub(:basename).with(dir).and_return(dir)
20
21
 
21
- File.stub(:directory?).with(file).and_return(false)
22
- File.stub(:file?).with(file).and_return(true)
23
- File.stub(:basename).with(file).and_return(file)
22
+ fs_interface.stub(:directory?).with(file).and_return(false)
23
+ fs_interface.stub(:file?).with(file).and_return(true)
24
+ fs_interface.stub(:basename).with(file).and_return(file)
24
25
 
25
- File.stub(:join).with(root_path, '*').and_return(globbed_path)
26
- File.stub(:join).with(root_path, file).and_return(file_path)
27
- File.stub(:join).with(root_path, dir).and_return(dir_path)
26
+ fs_interface.stub(:join).with(root_path, '*').and_return(globbed_path)
27
+ fs_interface.stub(:join).with(root_path, file).and_return(file_path)
28
+ fs_interface.stub(:join).with(root_path, dir).and_return(dir_path)
28
29
 
29
30
  Directory.stub(:new).with(root, dir).and_return(fake_directory_instance)
30
31
  SourceFile.stub(:new).with(root, file).and_return(fake_source_file_instance)
@@ -43,13 +44,15 @@ describe FileSearcher do
43
44
  it { should respond_to :content }
44
45
  end
45
46
 
46
- describe '#content' do
47
- before do
48
- Dir.stub(:[])
49
- file_searcher.content
50
- end
47
+ pending "better dependency injection" do
48
+ describe '#content' do
49
+ before do
50
+ Dir.stub(:[])
51
+ file_searcher.content
52
+ end
51
53
 
52
- the(Dir) { should have_received(:[]).with(globbed_path) }
54
+ the(Dir) { should have_received(:[]).with(globbed_path) }
55
+ end
53
56
  end
54
57
 
55
58
  context do
@@ -1,17 +1,13 @@
1
1
  require 'unit_spec_helper'
2
2
 
3
3
  describe Flyweight do
4
- let (:processor) { proc { instance_key } }
5
- let (:flyweight) { Flyweight.new(&processor) }
6
- let (:instance) { double('instance') }
7
- let (:instance_key) { double('instance_key') }
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') }
8
8
 
9
9
  subject { flyweight }
10
10
 
11
- before do
12
- processor.stub(:call).and_return(instance_key)
13
- end
14
-
15
11
  context 'shared examples' do
16
12
  shared_examples_for 'flyweight unregistration' do
17
13
  before { flyweight.unregister!(key) }
@@ -48,8 +44,6 @@ describe Flyweight do
48
44
  before { flyweight.register!(instance) }
49
45
 
50
46
  describe '#register! and #register' do
51
- the(:processor) { should have_received(:call).with(instance) }
52
-
53
47
  describe 'registering an instance with an already-used key' do
54
48
  it 'raises an error' do
55
49
  expect { flyweight.register!(instance) }.to raise_error Flyweight::AlreadyRegisteredError
@@ -1,28 +1,27 @@
1
1
  require 'unit_spec_helper'
2
2
 
3
3
  describe SourceFile do
4
- let(:basename) { 'fake' }
5
- let(:extension) { '.c' }
6
- let(:name) { basename + extension }
7
- let(:parent) { double('directory') }
4
+ let(:basename) { 'fake' }
5
+ let(:extension) { '.c' }
6
+ let(:name) { basename + extension }
7
+ let(:parent) { double('directory') }
8
+ let(:fs_interface) { double('an arbitrary interface to a filesystem') }
8
9
 
10
+ # TODO: Eliminate use of File here? More mocks?
9
11
  let(:full_path) { File.join(parent.path, name) }
10
12
  let(:content) { double('content') }
11
13
 
12
- let(:source_file) { SourceFile.create(parent, name) }
14
+ let(:source_file) { SourceFile.create(parent, name, fs_interface) }
15
+
13
16
 
14
17
  subject { source_file }
15
18
 
16
19
  before do
17
20
  parent.stub(:path).and_return('/path/to/parent/')
18
21
  parent.stub(:is_a?).with(Directory).and_return(true)
19
- File.stub(:read).with(full_path).and_return(content)
20
- end
21
22
 
22
- describe 'instantiation' do
23
- it 'disallows instantiation via #new' do
24
- expect { SourceFile.new(parent, name) }.to raise_error NoMethodError
25
- end
23
+ fs_interface.stub(:read).with(full_path).and_return(content)
24
+ fs_interface.stub(:extname).with(name).and_return(extension)
26
25
  end
27
26
 
28
27
  describe 'api' do
@@ -91,7 +90,7 @@ describe SourceFile do
91
90
  describe '#content' do
92
91
  before { source_file.content }
93
92
 
94
- the_class(File) { should have_received(:read).with(full_path) }
93
+ the(:fs_interface) { should have_received(:read).with(full_path) }
95
94
  end
96
95
 
97
96
  describe '#dependencies' do
metadata CHANGED
@@ -2,14 +2,14 @@
2
2
  name: exegesis
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.3
5
+ version: 0.0.4
6
6
  platform: ruby
7
7
  authors:
8
8
  - Joe Fredette
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-07 00:00:00.000000000 Z
12
+ date: 2012-11-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  type: :runtime