rucola 0.0.3 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +468 -0
- data/History.txt +25 -0
- data/License.txt +1 -1
- data/Manifest.txt +32 -0
- data/README.txt +9 -67
- data/Rakefile +39 -31
- data/TODO +10 -18
- data/app_generators/rucola/rucola_generator.rb +15 -8
- data/app_generators/rucola/templates/Rakefile.erb +35 -7
- data/app_generators/rucola/templates/config/boot.rb +0 -1
- data/app_generators/rucola/templates/config/dependencies.rb +31 -0
- data/app_generators/rucola/templates/config/environment.rb +0 -1
- data/app_generators/rucola/templates/config/environments/debug.rb +13 -1
- data/app_generators/rucola/templates/config/environments/release.rb +15 -1
- data/app_generators/rucola/templates/config/environments/test.rb +7 -1
- data/app_generators/rucola/templates/misc/rb_main.rb.erb +12 -1
- data/app_generators/rucola/templates/project.pbxproj.erb +4 -0
- data/app_generators/rucola/templates/script/console +10 -0
- data/app_generators/rucola/templates/test/controllers/test_application_controller.rb +22 -10
- data/app_generators/rucola/templates/test/test_helper.rb +1 -0
- data/bin/rucola +4 -2
- data/lib/rucola/dependencies.rb +241 -0
- data/lib/rucola/dependencies/exclusions.rb +20 -0
- data/lib/rucola/dependencies/override_require_and_gem.rb +30 -0
- data/lib/rucola/dependencies/resolver.rb +68 -0
- data/lib/rucola/fsevents.rb +108 -0
- data/lib/rucola/initializer.rb +149 -117
- data/lib/rucola/log.rb +61 -0
- data/lib/rucola/nib.rb +3 -3
- data/lib/rucola/reloader.rb +39 -0
- data/lib/rucola/ruby_debug.rb +27 -0
- data/lib/rucola/rucola_support.rb +1 -2
- data/lib/rucola/rucola_support/core_ext.rb +4 -2
- data/lib/rucola/rucola_support/core_ext/objc.rb +9 -4
- data/lib/rucola/rucola_support/core_ext/objc/nsimage.rb +22 -0
- data/lib/rucola/rucola_support/core_ext/ruby.rb +11 -4
- data/lib/rucola/rucola_support/core_ext/ruby/file.rb +11 -0
- data/lib/rucola/rucola_support/core_ext/ruby/kernel.rb +16 -0
- data/lib/rucola/rucola_support/core_ext/ruby/object.rb +47 -0
- data/lib/rucola/rucola_support/core_ext/ruby/string.rb +8 -0
- data/lib/rucola/rucola_support/notifications/notifications.rb +26 -28
- data/lib/rucola/rucola_support/rc_app.rb +18 -0
- data/lib/rucola/tasks/dependencies.rake +49 -0
- data/lib/rucola/tasks/deploy.rake +131 -0
- data/lib/rucola/tasks/main.rake +39 -6
- data/lib/rucola/tasks/xcode.rake +54 -11
- data/lib/rucola/test_case.rb +138 -0
- data/lib/rucola/test_helper.rb +11 -5
- data/lib/rucola/version.rb +2 -2
- data/lib/rucola/xcode.rb +39 -9
- data/rucola_generators/controller/templates/test_controller_template.rb.erb +19 -7
- data/rucola_generators/simple_model/USAGE +5 -0
- data/rucola_generators/simple_model/simple_model_generator.rb +54 -0
- data/rucola_generators/simple_model/templates/simple_model.rb.erb +2 -0
- data/rucola_generators/simple_model/templates/test_simple_model.rb.erb +11 -0
- data/rucola_generators/window_controller/templates/test_window_controller_template.rb.erb +24 -13
- data/test/fixtures/dependencies/foo.rb +2 -0
- data/test/fixtures/dependencies/foo/bar.rb +0 -0
- data/test/fixtures/dependencies/foo/baz.rb +0 -0
- data/test/fixtures/dependencies/requires_fileutils.rb +1 -0
- data/test/fixtures/some_reloadable_class.rb +4 -0
- data/test/test_core_ext.rb +80 -0
- data/test/test_dependencies.rb +205 -0
- data/test/test_fsevents.rb +152 -0
- data/test/test_helper.rb +30 -1
- data/test/test_initializer.rb +56 -23
- data/test/test_log.rb +44 -0
- data/test/test_objc_core_ext.rb +23 -0
- data/test/test_rc_app.rb +5 -0
- data/test/test_reloader.rb +28 -0
- data/test/test_rucola_generator.rb +7 -0
- data/test/test_simple_model_generator.rb +48 -0
- data/test/test_xcode.rb +85 -5
- data/website/index.html +17 -91
- data/website/index.txt +14 -81
- data/website/template.rhtml +1 -1
- metadata +120 -76
data/lib/rucola/version.rb
CHANGED
data/lib/rucola/xcode.rb
CHANGED
@@ -2,9 +2,7 @@ require 'osx/cocoa'
|
|
2
2
|
require 'pathname'
|
3
3
|
|
4
4
|
module Rucola
|
5
|
-
class Xcode
|
6
|
-
# FIXME: We should probably generate random id keys!
|
7
|
-
|
5
|
+
class Xcode #:nodoc:
|
8
6
|
attr_reader :project
|
9
7
|
attr_reader :project_path
|
10
8
|
attr_reader :project_data
|
@@ -86,7 +84,41 @@ module Rucola
|
|
86
84
|
build_phase['files'].push(object_id) unless build_phase['files'].include?(object_id)
|
87
85
|
end
|
88
86
|
|
89
|
-
|
87
|
+
# Returns an array of framework objects that are in the project.
|
88
|
+
def frameworks
|
89
|
+
objects.select {|obj| obj.last['name'].include?('framework') unless obj.last['name'].nil? }
|
90
|
+
end
|
91
|
+
|
92
|
+
# Adds a framework to a project.
|
93
|
+
# Returns [framework_obj, fileref_obj].
|
94
|
+
def add_framework(name, path)
|
95
|
+
source_tree = path[0, 1] == '/' ? '<absolute>' : '<group>'
|
96
|
+
framework_obj = [generate_object_id, { 'isa' => 'PBXFileReference', 'lastKnownFileType' => 'wrapper.framework', 'name' => name, 'path' => path, 'sourceTree' => source_tree }.to_ns]
|
97
|
+
add_object(*framework_obj)
|
98
|
+
|
99
|
+
fileref_obj = [generate_object_id, { 'fileRef' => framework_obj.first, 'isa' => 'PBXBuildFile'}.to_ns]
|
100
|
+
add_object(*fileref_obj)
|
101
|
+
|
102
|
+
linked_frameworks_group = object_for_name('Linked Frameworks')
|
103
|
+
linked_frameworks_group.last['children'].push(framework_obj.first)
|
104
|
+
|
105
|
+
[framework_obj, fileref_obj]
|
106
|
+
end
|
107
|
+
|
108
|
+
def generate_uuid
|
109
|
+
("%04x%04x%04x%04x%04x%04x" % [rand(0x0010000),rand(0x0010000),rand(0x0010000),rand(0x0010000),rand(0x0010000),rand(0x0010000)]).upcase
|
110
|
+
end
|
111
|
+
|
112
|
+
# Makes sure that an unique object UUID is returned
|
113
|
+
def generate_object_id
|
114
|
+
uuids = objects.keys
|
115
|
+
begin
|
116
|
+
uuid = generate_uuid
|
117
|
+
end while uuids.include?(uuid)
|
118
|
+
uuid
|
119
|
+
end
|
120
|
+
|
121
|
+
NEW_COPY_FRAMEWORKS_BUILD_PHASE = {
|
90
122
|
'name' => 'Copy Frameworks',
|
91
123
|
'isa' => 'PBXCopyFilesBuildPhase',
|
92
124
|
'buildActionMask' => '2147483647',
|
@@ -94,14 +126,12 @@ module Rucola
|
|
94
126
|
'dstSubfolderSpec' => 10, # TODO: is 10 the number for the location popup choice: Frameworks
|
95
127
|
'runOnlyForDeploymentPostprocessing' => 0,
|
96
128
|
'files' => [].to_ns
|
97
|
-
}
|
129
|
+
}
|
98
130
|
# Creates a new framework copy build phase.
|
99
131
|
# It does not add it to the objects nor the build phases,
|
100
132
|
# do this with +add_object+ and +add_build_phase_to_project_target+.
|
101
|
-
#
|
102
|
-
# FIXME: Need to generate the id's instead of static.
|
103
133
|
def new_framework_copy_build_phase
|
104
|
-
NEW_COPY_FRAMEWORKS_BUILD_PHASE
|
134
|
+
[generate_object_id, NEW_COPY_FRAMEWORKS_BUILD_PHASE]
|
105
135
|
end
|
106
136
|
|
107
137
|
# Changes the path of the framework +framework_name+ to the path +new_path_to_framework+.
|
@@ -121,7 +151,7 @@ module Rucola
|
|
121
151
|
framework_id, framework_values = object_for_name(framework_name)
|
122
152
|
|
123
153
|
# create a new file wrapper for in the copy build phase
|
124
|
-
framework_in_build_phase_id =
|
154
|
+
framework_in_build_phase_id = generate_object_id
|
125
155
|
framework_in_build_phase_values = {
|
126
156
|
'isa' => 'PBXBuildFile',
|
127
157
|
'fileRef' => framework_id
|
@@ -1,19 +1,31 @@
|
|
1
1
|
require File.expand_path('../../test_helper', __FILE__)
|
2
2
|
|
3
3
|
describe '<%= name.camel_case %>Controller' do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
tests <%= name.camel_case %>Controller
|
5
|
+
|
6
|
+
# If necessary, you can setup custom objects for the ib_outlets defined in the class.
|
7
|
+
# Note however that by using 'tests <%= name.camel_case %>Controller' all the outlets will get stubbed
|
8
|
+
# with stubs that respond to every message with nil.
|
9
|
+
#
|
10
|
+
# def after_setup
|
11
|
+
# ib_outlets :window => mock("Main Window"),
|
12
|
+
# :tableView => OSX::NSTableView.alloc.init,
|
13
|
+
# :searchField => OSX::NSSearchField.alloc.init
|
14
|
+
#
|
15
|
+
# window.stubs(:title => 'Main Window')
|
16
|
+
# tableView.addTableColumn OSX::NSTableColumn.alloc.init
|
17
|
+
# searchField.stringValue = "foo"
|
18
|
+
# end
|
19
|
+
|
8
20
|
it "should initialize" do
|
9
|
-
|
21
|
+
controller.should.be.an.instance_of <%= name.camel_case %>Controller
|
10
22
|
end
|
11
23
|
|
12
24
|
it "should do stuff at awakeFromNib" do
|
13
25
|
# Some example code of testing your #awakeFromNib.
|
14
26
|
#
|
15
|
-
#
|
27
|
+
# controller.ib_outlet(:some_text_view).expects(:string=).with('foo')
|
16
28
|
|
17
|
-
|
29
|
+
controller.awakeFromNib
|
18
30
|
end
|
19
31
|
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'rucola/rucola_support'
|
2
|
+
|
3
|
+
class SimpleModelGenerator < RubiGen::Base
|
4
|
+
|
5
|
+
default_options :author => nil
|
6
|
+
|
7
|
+
attr_reader :name
|
8
|
+
|
9
|
+
def initialize(runtime_args, runtime_options = {})
|
10
|
+
super
|
11
|
+
usage if args.empty?
|
12
|
+
@name = args.shift
|
13
|
+
extract_options
|
14
|
+
end
|
15
|
+
|
16
|
+
def manifest
|
17
|
+
record do |m|
|
18
|
+
# Ensure appropriate folder(s) exists
|
19
|
+
m.directory 'app/models'
|
20
|
+
m.directory 'test/models'
|
21
|
+
|
22
|
+
# Create stubs
|
23
|
+
m.template "simple_model.rb.erb", "app/models/#{@name.snake_case}.rb"
|
24
|
+
m.template "test_simple_model.rb.erb", "test/models/test_#{@name.snake_case}.rb"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
protected
|
29
|
+
def banner
|
30
|
+
<<-EOS
|
31
|
+
Creates a model that inherits from NSObject.
|
32
|
+
|
33
|
+
USAGE: #{$0} #{spec.name} name"
|
34
|
+
EOS
|
35
|
+
end
|
36
|
+
|
37
|
+
def add_options!(opts)
|
38
|
+
# opts.separator ''
|
39
|
+
# opts.separator 'Options:'
|
40
|
+
# For each option below, place the default
|
41
|
+
# at the top of the file next to "default_options"
|
42
|
+
# opts.on("-a", "--author=\"Your Name\"", String,
|
43
|
+
# "Some comment about this option",
|
44
|
+
# "Default: none") { |options[:author]| }
|
45
|
+
# opts.on("-v", "--version", "Show the #{File.basename($0)} version number and quit.")
|
46
|
+
end
|
47
|
+
|
48
|
+
def extract_options
|
49
|
+
# for each option, extract it into a local variable (and create an "attr_reader :author" at the top)
|
50
|
+
# Templates can access these value via the attr_reader-generated methods, but not the
|
51
|
+
# raw instance variable value.
|
52
|
+
# @author = options[:author]
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require File.expand_path('../../test_helper', __FILE__)
|
2
|
+
|
3
|
+
describe '<%= name.camel_case %>' do
|
4
|
+
before do
|
5
|
+
@model = <%= name.camel_case %>.alloc.init
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should initialize" do
|
9
|
+
@model.should.be.an.instance_of <%= name.camel_case %>
|
10
|
+
end
|
11
|
+
end
|
@@ -1,26 +1,37 @@
|
|
1
1
|
require File.expand_path('../../test_helper', __FILE__)
|
2
2
|
|
3
3
|
describe '<%= name.camel_case %>Controller' do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
4
|
+
tests <%= name.camel_case %>Controller
|
5
|
+
|
6
|
+
# If necessary, you can setup custom objects for the ib_outlets defined in the class.
|
7
|
+
# Note however that by using 'tests <%= name.camel_case %>Controller' all the outlets will get stubbed
|
8
|
+
# with stubs that respond to every message with nil.
|
9
|
+
#
|
10
|
+
# def after_setup
|
11
|
+
# ib_outlets :window => mock("Main Window"),
|
12
|
+
# :tableView => OSX::NSTableView.alloc.init,
|
13
|
+
# :searchField => OSX::NSSearchField.alloc.init
|
14
|
+
#
|
15
|
+
# window.stubs(:title => 'Main Window')
|
16
|
+
# tableView.addTableColumn OSX::NSTableColumn.alloc.init
|
17
|
+
# searchField.stringValue = "foo"
|
18
|
+
#
|
19
|
+
# # If this is a window controller belonging to a document model,
|
20
|
+
# # then this will allow you to mock the document.
|
21
|
+
# #
|
22
|
+
# # @document = mock('Document')
|
23
|
+
# end
|
24
|
+
|
14
25
|
it "should initialize" do
|
15
|
-
|
26
|
+
controller.should.be.an.instance_of <%= name.camel_case %>Controller
|
16
27
|
end
|
17
28
|
|
18
29
|
it "should do stuff at awakeFromNib" do
|
19
30
|
# Some example code of testing your #awakeFromNib.
|
20
31
|
#
|
21
32
|
# @document.expects(:some_method).returns('foo')
|
22
|
-
#
|
33
|
+
# controller.ib_outlet(:some_text_view).expects(:string=).with('foo')
|
23
34
|
|
24
|
-
|
35
|
+
controller.awakeFromNib
|
25
36
|
end
|
26
37
|
end
|
File without changes
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'fileutils'
|
data/test/test_core_ext.rb
CHANGED
@@ -1,5 +1,51 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/test_helper'
|
2
2
|
|
3
|
+
class FooBar
|
4
|
+
def self.a_original_class_method
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
module Baz
|
9
|
+
def a_new_class_method; end
|
10
|
+
end
|
11
|
+
FooBar.extend(Baz)
|
12
|
+
|
13
|
+
class FooBarSubclass < FooBar
|
14
|
+
def self.a_original_class_method_in_a_subclass
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# Object ext. specs
|
19
|
+
|
20
|
+
describe "Object: class methods" do
|
21
|
+
it "should return the metaclass of a class" do
|
22
|
+
class << FooBar
|
23
|
+
self.should.be FooBar.metaclass
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should return an array of class methods that have been added by extending the class" do
|
28
|
+
FooBar.extended_class_methods.should.include 'a_new_class_method'
|
29
|
+
FooBar.extended_class_methods.should.not.include 'a_original_class_method'
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should return an array of all the class methods that were defined in this class without the ones that were defined in superclasses" do
|
33
|
+
FooBarSubclass.own_class_methods.should.include 'a_original_class_method_in_a_subclass'
|
34
|
+
FooBarSubclass.own_class_methods.should.not.include 'a_original_class_method'
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should return an array of all the class methods that were defined in only this class, so not from it's superclasses or from extending" do
|
38
|
+
FooBar.original_class_methods.should.include 'a_original_class_method'
|
39
|
+
FooBar.original_class_methods.should.not.include 'a_new_class_method'
|
40
|
+
|
41
|
+
FooBarSubclass.original_class_methods.should.include 'a_original_class_method_in_a_subclass'
|
42
|
+
FooBarSubclass.original_class_methods.should.not.include 'a_original_class_method'
|
43
|
+
FooBarSubclass.original_class_methods.should.not.include 'a_new_class_method'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# String ext. specs
|
48
|
+
|
3
49
|
describe 'String#camel_case' do
|
4
50
|
it "should return foo_bar as FooBar" do
|
5
51
|
"foo_bar".camel_case.should == 'FooBar'
|
@@ -13,3 +59,37 @@ describe 'String#camel_case' do
|
|
13
59
|
'foo'.camel_case.should == 'Foo'
|
14
60
|
end
|
15
61
|
end
|
62
|
+
|
63
|
+
describe "String#to_const" do
|
64
|
+
it "should return the constant FooBar for string 'foo_bar'" do
|
65
|
+
"foo_bar".to_const.should.be FooBar
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should return the constant FooBar for string 'FooBar'" do
|
69
|
+
"FooBar".to_const.should.be FooBar
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# File ext. specs
|
74
|
+
|
75
|
+
describe "File.to_const" do
|
76
|
+
it "should return the constant FooBar for file '/some/path/foo_bar.rb'" do
|
77
|
+
File.to_const('/some/path/foo_bar.rb').should.be FooBar
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should return the constant FooBar for file 'foo_bar.rb'" do
|
81
|
+
File.to_const('foo_bar.rb').should.be FooBar
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# Kernel ext. specs
|
86
|
+
|
87
|
+
describe "Kernel.logger" do
|
88
|
+
it "should return a Rucola Log class instance" do
|
89
|
+
Kernel.log.kind_of?(Rucola::Log).should == true
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should return the same logger instance on multiple calls" do
|
93
|
+
Kernel.log.object_id.should == Kernel.log.object_id
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,205 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
require 'rucola/dependencies'
|
3
|
+
|
4
|
+
Rucola::Dependencies.verbose = false
|
5
|
+
$LOAD_PATH.unshift(File.join(FIXTURES, 'dependencies/'))
|
6
|
+
|
7
|
+
module DependenciesSpecHelper
|
8
|
+
def self.included(klass)
|
9
|
+
klass.class_eval do
|
10
|
+
after do
|
11
|
+
@dep = nil
|
12
|
+
FileUtils.rm_rf(copied_deps_path)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def deps_path(file = '')
|
20
|
+
File.join(FIXTURES, 'dependencies', file)
|
21
|
+
end
|
22
|
+
|
23
|
+
def copied_deps_path(file = '')
|
24
|
+
File.join(TMP_PATH, 'copied_dependencies', file)
|
25
|
+
end
|
26
|
+
|
27
|
+
def stubbed_equal_required_files
|
28
|
+
klass = Rucola::Dependencies::RequiredFile
|
29
|
+
klass.any_instance.stubs(:resolve_relative_and_full_path).returns(['path/foo.rb', '/full/path/foo.rb'])
|
30
|
+
[klass.new(''), klass.new('')]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "Dependencies::Dependency" do
|
35
|
+
include DependenciesSpecHelper
|
36
|
+
|
37
|
+
before do
|
38
|
+
@dep = Rucola::Dependencies::Dependency.new('foo')
|
39
|
+
end
|
40
|
+
|
41
|
+
after do
|
42
|
+
@dep = nil
|
43
|
+
FileUtils.rm_rf(copied_deps_path)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should initialize" do
|
47
|
+
@dep.should.be.instance_of Rucola::Dependencies::Dependency
|
48
|
+
@dep.name.should == 'foo'
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should be able to require it" do
|
52
|
+
Kernel.expects(:require).with('foo')
|
53
|
+
@dep.require!
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should activate a specific gem if a version is specified" do
|
57
|
+
Kernel.stubs(:require)
|
58
|
+
@dep.instance_variable_set(:@version, '1.1.1')
|
59
|
+
Gem.expects(:activate).with('foo', '1.1.1')
|
60
|
+
@dep.require!
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should be able to resolve the files it needs" do
|
64
|
+
lambda { @dep.resolve! }.should.not.change('$LOADED_FEATURES.dup')
|
65
|
+
required_files = @dep.required_files.map {|f| f.full_path }.sort
|
66
|
+
required_files.should == [deps_path('foo.rb'), deps_path('foo/bar.rb'), deps_path('foo/baz.rb')]
|
67
|
+
end
|
68
|
+
|
69
|
+
# FIXME: For some reason running this in the complete test suite will fail.
|
70
|
+
# But in practice or by only running this test it works :/
|
71
|
+
xit "should be able to copy to the specified destination path" do
|
72
|
+
@dep.resolve!
|
73
|
+
@dep.copy_to(copied_deps_path)
|
74
|
+
%w{ foo.rb foo/bar.rb foo/baz.rb }.each do |file|
|
75
|
+
File.exist?(copied_deps_path(file)).should.be true
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should be possible to only copy `gem` lib files" do
|
80
|
+
should_copy_types(:gem)
|
81
|
+
@dep.copy_to(copied_deps_path, :types => [:gem])
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should be possible to only copy `standard` lib files" do
|
85
|
+
should_copy_types(:standard)
|
86
|
+
@dep.copy_to(copied_deps_path, :types => [:standard])
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should be possible to only copy `gem` libs" do
|
90
|
+
should_copy_types(:other)
|
91
|
+
@dep.copy_to(copied_deps_path, :types => [:other])
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should be possible to combine the types of libs to be copied" do
|
95
|
+
should_copy_types(:other, :gem)
|
96
|
+
@dep.copy_to(copied_deps_path, :types => [:other, :gem])
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should be possible to get a list of required files of only certain types" do
|
100
|
+
dep = Rucola::Dependencies::Dependency.new('requires_fileutils')
|
101
|
+
dep.resolve!
|
102
|
+
dep.required_files_of_types(:other).all? {|f| f.should.be.other_lib }
|
103
|
+
dep.required_files_of_types(:standard).all? {|f| f.should.be.standard_lib }
|
104
|
+
end
|
105
|
+
|
106
|
+
private
|
107
|
+
|
108
|
+
def should_copy_types(*types)
|
109
|
+
keys = [:gem, :other, :standard]
|
110
|
+
files = []
|
111
|
+
keys.each do |type|
|
112
|
+
file = mock(type.to_s)
|
113
|
+
file.stubs({ :full_path => '/some/path', :gem_lib? => false, :standard_lib? => false, :other_lib? => false }.merge({ "#{type}_lib?".to_sym => true }))
|
114
|
+
if types.include?(type)
|
115
|
+
file.expects(:copy_to).times(1).with(copied_deps_path)
|
116
|
+
else
|
117
|
+
file.expects(:copy_to).times(0)
|
118
|
+
end
|
119
|
+
files << file
|
120
|
+
end
|
121
|
+
@dep.instance_variable_set(:@required_files, files)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
describe "Dependencies" do
|
126
|
+
include DependenciesSpecHelper
|
127
|
+
|
128
|
+
before do
|
129
|
+
@deps = Rucola::Dependencies.new
|
130
|
+
@deps.dependency 'foo'
|
131
|
+
@deps.dependency 'rubynode', '>=0.1.3'
|
132
|
+
@deps.dependency 'fileutils'
|
133
|
+
@deps.resolve!
|
134
|
+
end
|
135
|
+
|
136
|
+
it "should create a Dependency instance when a dependency is specified" do
|
137
|
+
lambda { @deps.dependency('hpricot') }.should.change("@deps.dependencies.length", +1, self)
|
138
|
+
end
|
139
|
+
|
140
|
+
it "should be able to require all the dependencies" do
|
141
|
+
@deps.dependencies.each { |dep| dep.expects(:require!) }
|
142
|
+
@deps.require!
|
143
|
+
end
|
144
|
+
|
145
|
+
it "should be able to resolve all the files needed by the dependencies" do
|
146
|
+
@deps.dependencies.each do |dep|
|
147
|
+
dep.required_files.should.not.be.empty
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
it "should be able to copy to the specified destination path" do
|
152
|
+
@deps.copy_to(copied_deps_path)
|
153
|
+
%w{ foo.rb rubynode.rb fileutils.rb }.each do |file|
|
154
|
+
File.exist?(copied_deps_path(file)).should.be true
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
it "should be possible to only copy specific types of files" do
|
159
|
+
@deps.dependencies.each do |dep|
|
160
|
+
dep.expects(:copy_to).with(copied_deps_path, { :types => [:gem, :other]})
|
161
|
+
end
|
162
|
+
@deps.copy_to(copied_deps_path, :types => [:gem, :other])
|
163
|
+
end
|
164
|
+
|
165
|
+
it "should be able to return a complete list of unique required files" do
|
166
|
+
files = stubbed_equal_required_files
|
167
|
+
@deps.dependencies.stubs(:collect).returns([[files.first], [files.last]])
|
168
|
+
|
169
|
+
@deps.required_files.length.should.be 1
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
describe "Dependencies::Dependency::RequiredFile" do
|
174
|
+
include DependenciesSpecHelper
|
175
|
+
|
176
|
+
it "should be able to compare to another instance" do
|
177
|
+
files = stubbed_equal_required_files
|
178
|
+
files.first.should == files.last
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
describe "Dependencies, with problematic dependencies" do
|
183
|
+
before do
|
184
|
+
@deps = Rucola::Dependencies.new
|
185
|
+
end
|
186
|
+
|
187
|
+
# FIXME: resolving activesupport works, but combined with stubbing resolve_relative_and_full_path it breaks...
|
188
|
+
xit "should not break with activesupport" do
|
189
|
+
@deps.dependency 'activesupport'
|
190
|
+
@deps.resolve!
|
191
|
+
@deps.dependencies.first.required_files.should.not.be.empty
|
192
|
+
end
|
193
|
+
|
194
|
+
it "should not break with osx/cocoa (excluded)" do
|
195
|
+
@deps.dependency 'osx/cocoa'
|
196
|
+
@deps.resolve!
|
197
|
+
@deps.dependencies.first.required_files.should.be.empty
|
198
|
+
end
|
199
|
+
|
200
|
+
it "should not break with osx/foundation (excluded)" do
|
201
|
+
@deps.dependency 'osx/foundation'
|
202
|
+
@deps.resolve!
|
203
|
+
@deps.dependencies.first.required_files.should.be.empty
|
204
|
+
end
|
205
|
+
end
|