rucola 0.0.3 → 0.5.0
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 +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
@@ -0,0 +1,20 @@
|
|
1
|
+
module Rucola
|
2
|
+
class Dependencies
|
3
|
+
class << self
|
4
|
+
def exclusions
|
5
|
+
@exclusions ||= []
|
6
|
+
end
|
7
|
+
|
8
|
+
def exclude(regexp)
|
9
|
+
exclusions << regexp
|
10
|
+
end
|
11
|
+
|
12
|
+
def exclude?(name)
|
13
|
+
exclusions.any? { |regexp| name =~ regexp }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# define libs that should not be resolved here
|
18
|
+
exclude(/osx\//)
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# These monkey patches are used in a app if it has rucola bundled
|
2
|
+
|
3
|
+
# make Gem work
|
4
|
+
unless defined? Gem
|
5
|
+
module Gem #:nodoc:
|
6
|
+
class LoadError < StandardError #:nodoc:
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module Rucola
|
12
|
+
class Dependencies
|
13
|
+
def self.override_require_and_gem!
|
14
|
+
Kernel.module_eval do
|
15
|
+
alias_method :__require_before_rucola_standalone_app, :require
|
16
|
+
def require(name)
|
17
|
+
return if name == 'rubygems' # atm we don't want to allow rubygems
|
18
|
+
# check if there's an exception for this requirement and load it, otherwise load the original
|
19
|
+
exception = Rucola::Dependencies.instance.exceptions[name] if Rucola::Dependencies.respond_to?(:instance) # check if everything is done loading
|
20
|
+
__require_before_rucola_standalone_app(exception || name)
|
21
|
+
end
|
22
|
+
|
23
|
+
def gem(name, version)
|
24
|
+
#puts "Gem required: #{name}"
|
25
|
+
require(name)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'osx/cocoa'
|
3
|
+
|
4
|
+
require File.expand_path('../exclusions', __FILE__)
|
5
|
+
|
6
|
+
class DependencyResolver #:nodoc:
|
7
|
+
class UnableToResolveError < StandardError #:nodoc:
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(name, version)
|
11
|
+
@name, @version = name, version
|
12
|
+
end
|
13
|
+
|
14
|
+
def require!
|
15
|
+
verbose_before = $VERBOSE
|
16
|
+
$VERBOSE = nil
|
17
|
+
begin
|
18
|
+
if Kernel.private_methods.include? 'gem_original_require'
|
19
|
+
gem_original_require(@name)
|
20
|
+
else
|
21
|
+
require(@name)
|
22
|
+
end
|
23
|
+
rescue LoadError
|
24
|
+
# unfortunately, rubygems will always require 'etc.bundle' & 'fileutils' so there's no real way of knowing
|
25
|
+
# wether or not it was required by rubygems or the actual library.
|
26
|
+
begin
|
27
|
+
Gem.activate(@name, true, @version)
|
28
|
+
require(@name)
|
29
|
+
rescue NameError
|
30
|
+
raise UnableToResolveError, "Unable to resolve: '#{@name}', '#{@version}'"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
$VERBOSE = verbose_before
|
34
|
+
end
|
35
|
+
|
36
|
+
def difference_in_loaded_features
|
37
|
+
# save this to set it back to what it originally was
|
38
|
+
loaded_features_before_rubygems = $LOADED_FEATURES.dup
|
39
|
+
|
40
|
+
$LOADED_FEATURES.replace([])
|
41
|
+
require 'rubygems' rescue LoadError
|
42
|
+
|
43
|
+
Kernel.module_eval do
|
44
|
+
alias_method :__require_before_dependency_resolver, :require
|
45
|
+
def require(name)
|
46
|
+
unless Rucola::Dependencies.exclude?(name)
|
47
|
+
__require_before_dependency_resolver(name)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# save this so we can compare what else was added except for rubygems
|
53
|
+
loaded_features_before = $LOADED_FEATURES.dup
|
54
|
+
|
55
|
+
require!
|
56
|
+
|
57
|
+
result = ($LOADED_FEATURES - loaded_features_before)
|
58
|
+
$LOADED_FEATURES.replace(loaded_features_before_rubygems)
|
59
|
+
result
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
name, version = ARGV[0..1]
|
64
|
+
$LOAD_PATH.replace(YAML.load(ARGV[2])) unless ARGV[2].nil?
|
65
|
+
|
66
|
+
dr = DependencyResolver.new(name, version)
|
67
|
+
# print to stdout the serialized results array
|
68
|
+
puts YAML.dump(dr.difference_in_loaded_features)
|
@@ -0,0 +1,108 @@
|
|
1
|
+
OSX.require_framework '/System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework'
|
2
|
+
|
3
|
+
module Rucola
|
4
|
+
class FSEvents
|
5
|
+
class FSEvent
|
6
|
+
attr_reader :fsevents_object
|
7
|
+
attr_reader :id
|
8
|
+
attr_reader :path
|
9
|
+
def initialize(fsevents_object, id, path)
|
10
|
+
@fsevents_object, @id, @path = fsevents_object, id, path
|
11
|
+
end
|
12
|
+
|
13
|
+
# Returns an array of the files/dirs in the path that the event occurred in.
|
14
|
+
# The files are sorted by the modification time, the first entry is the last modified file.
|
15
|
+
def files
|
16
|
+
Dir.glob("#{File.expand_path(path)}/*").sort_by {|f| File.mtime(f) }.reverse
|
17
|
+
end
|
18
|
+
|
19
|
+
# Returns the last modified file in the path that the event occurred in.
|
20
|
+
def last_modified_file
|
21
|
+
files.first
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class StreamError < StandardError; end
|
26
|
+
|
27
|
+
attr_reader :paths
|
28
|
+
attr_reader :stream
|
29
|
+
|
30
|
+
attr_accessor :allocator
|
31
|
+
attr_accessor :context
|
32
|
+
attr_accessor :since
|
33
|
+
attr_accessor :latency
|
34
|
+
attr_accessor :flags
|
35
|
+
|
36
|
+
class << self
|
37
|
+
# Initializes a new FSEvents `watchdog` object,
|
38
|
+
# creates, starts and then returns the stream.
|
39
|
+
#
|
40
|
+
# Pass it a block which will be used as a callback.
|
41
|
+
# The block will receive an array of FSEvent objects.
|
42
|
+
#
|
43
|
+
# fsevents = Rucola::FSEvents.start_watching('/some/path') do |events|
|
44
|
+
# events.each do |event|
|
45
|
+
# p event
|
46
|
+
# end
|
47
|
+
# end
|
48
|
+
# p fsevents
|
49
|
+
def start_watching(*paths, &block)
|
50
|
+
fsevents = new(paths.flatten, &block)
|
51
|
+
fsevents.create_stream
|
52
|
+
fsevents.start
|
53
|
+
fsevents
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# Creates a new FSEvents `watchdog` object.
|
58
|
+
# Pass it an array of paths and a block with your callback. Options allow you to specify in more detail how
|
59
|
+
# the events watcher should behave.
|
60
|
+
#
|
61
|
+
# *:since: The service will report events that have happened after the supplied event ID. Never use 0 because that
|
62
|
+
# will cause every fsevent since the "beginning of time" to be reported. Use OSX::KFSEventStreamEventIdSinceNow
|
63
|
+
# if you want to receive events that have happened after this call. (Default: OSX::KFSEventStreamEventIdSinceNow).
|
64
|
+
# *:latency: Number of seconds to wait until an FSEvent is reported, this allows the service to bundle events. (Default: 0.0)
|
65
|
+
#
|
66
|
+
# For the rest of the options read the Cocoa documentation.
|
67
|
+
def initialize(paths, options={}, &block)
|
68
|
+
raise ArgumentError, 'No callback block was specified.' unless block_given?
|
69
|
+
paths.each { |path| raise ArgumentError, "The specified path (#{path}) does not exist." unless File.exist?(path) }
|
70
|
+
|
71
|
+
@allocator = options[:allocator] || OSX::KCFAllocatorDefault
|
72
|
+
@context = options[:context] || nil
|
73
|
+
@since = options[:since] || OSX::KFSEventStreamEventIdSinceNow
|
74
|
+
@latency = options[:latency] || 0.0
|
75
|
+
@flags = options[:flags] || 0
|
76
|
+
@stream = options[:stream] || nil
|
77
|
+
|
78
|
+
@paths = paths
|
79
|
+
@user_callback = block
|
80
|
+
@callback = Proc.new do |stream, client_callback_info, number_of_events, paths_pointer, event_flags, event_ids|
|
81
|
+
paths_pointer.regard_as('*')
|
82
|
+
events = []
|
83
|
+
number_of_events.times {|i| events << Rucola::FSEvents::FSEvent.new(self, event_ids[i], paths_pointer[i]) }
|
84
|
+
@user_callback.call(events)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# Create the stream.
|
89
|
+
# Raises a Rucola::FSEvents::StreamError if the stream could not be created.
|
90
|
+
def create_stream
|
91
|
+
@stream = OSX.FSEventStreamCreate(@allocator, @callback, @context, @paths, @since, @latency, @flags)
|
92
|
+
raise(StreamError, 'Unable to create FSEvents stream.') unless @stream
|
93
|
+
OSX.FSEventStreamScheduleWithRunLoop(@stream, OSX.CFRunLoopGetCurrent, OSX::KCFRunLoopDefaultMode)
|
94
|
+
end
|
95
|
+
|
96
|
+
# Start the stream.
|
97
|
+
# Raises a Rucola::FSEvents::StreamError if the stream could not be started.
|
98
|
+
def start
|
99
|
+
raise(StreamError, 'Unable to start FSEvents stream.') unless OSX.FSEventStreamStart(@stream)
|
100
|
+
end
|
101
|
+
|
102
|
+
# Stop the stream.
|
103
|
+
# You can resume it by calling `start` again.
|
104
|
+
def stop
|
105
|
+
OSX.FSEventStreamStop(@stream)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
data/lib/rucola/initializer.rb
CHANGED
@@ -1,39 +1,40 @@
|
|
1
1
|
require 'osx/cocoa'
|
2
2
|
require 'pathname'
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
4
|
+
if !defined?(RUBYCOCOA_ENV) or RUBYCOCOA_ENV.nil?
|
5
|
+
if ENV['RUBYCOCOA_ENV']
|
6
|
+
RUBYCOCOA_ENV = ENV['RUBYCOCOA_ENV']
|
7
|
+
else
|
8
|
+
if ENV['DYLD_LIBRARY_PATH']
|
9
|
+
env = ENV['DYLD_LIBRARY_PATH'].split('/').last.downcase
|
10
|
+
if %(debug release test).include?(env)
|
11
|
+
RUBYCOCOA_ENV = env
|
12
|
+
else
|
13
|
+
RUBYCOCOA_ENV = 'debug'
|
14
|
+
end
|
14
15
|
else
|
15
|
-
RUBYCOCOA_ENV = '
|
16
|
+
RUBYCOCOA_ENV = 'release'
|
16
17
|
end
|
17
|
-
else
|
18
|
-
RUBYCOCOA_ENV = 'release'
|
19
18
|
end
|
20
19
|
end
|
21
20
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
21
|
+
if !defined?(RUBYCOCOA_ROOT) or RUBYCOCOA_ROOT.nil?
|
22
|
+
if ENV['RUBYCOCOA_ROOT']
|
23
|
+
# rake will set the RUBYCOCOA_ROOT for debugging purpose
|
24
|
+
RUBYCOCOA_ROOT = Pathname.new(ENV['RUBYCOCOA_ROOT'])
|
25
|
+
else
|
26
|
+
# We are running in debug from xcode, which doesn't set RUBYCOCOA_ROOT.
|
27
|
+
# Or we are simply running in release.
|
28
|
+
RUBYCOCOA_ROOT =
|
29
|
+
if RUBYCOCOA_ENV == 'release'
|
30
|
+
Pathname.new(OSX::NSBundle.mainBundle.resourcePath.fileSystemRepresentation)
|
31
|
+
else
|
32
|
+
Pathname.new(ENV['DYLD_LIBRARY_PATH'] + "../../../").cleanpath
|
33
|
+
end
|
34
|
+
end
|
34
35
|
end
|
35
36
|
|
36
|
-
$:.unshift(RUBYCOCOA_ROOT)
|
37
|
+
$:.unshift(RUBYCOCOA_ROOT.to_s)
|
37
38
|
|
38
39
|
module Rucola
|
39
40
|
# Are we building and running or just running this application by clicking on
|
@@ -44,15 +45,23 @@ module Rucola
|
|
44
45
|
end
|
45
46
|
|
46
47
|
|
47
|
-
#
|
48
|
-
require 'erb'
|
48
|
+
# we need to require everything that would be needed by a standalone application
|
49
|
+
require 'erb' # FIXME: this should only be required if we're really gonna use erb (AR project)
|
50
|
+
require 'rucola/rucola_support'
|
51
|
+
require 'rucola/dependencies'
|
52
|
+
require 'rucola/dependencies/exclusions'
|
53
|
+
require 'rucola/dependencies/override_require_and_gem'
|
54
|
+
require 'rucola/plugin'
|
55
|
+
require 'rucola/ruby_debug'
|
56
|
+
|
49
57
|
module Rucola
|
50
58
|
# Rails-like Initializer responsible for processing configuration.
|
51
59
|
class Initializer
|
52
|
-
# The Configuration instance used by this Initializer instance.
|
53
|
-
attr_reader :configuration
|
54
|
-
|
55
60
|
class << self
|
61
|
+
def instance
|
62
|
+
@initializer ||= new
|
63
|
+
end
|
64
|
+
|
56
65
|
# Load the config/boot.rb file.
|
57
66
|
def boot
|
58
67
|
Rucola::Plugin.before_boot
|
@@ -64,7 +73,7 @@ module Rucola
|
|
64
73
|
# to alter behaviour before any of the application's files are required
|
65
74
|
# and the app is started.
|
66
75
|
def do_boot
|
67
|
-
require
|
76
|
+
Kernel.require Rucola::RCApp.root_path + '/config/boot'
|
68
77
|
end
|
69
78
|
|
70
79
|
# Returns the path to the plugins root directory. Eg /MyApp/vendor/plugins.
|
@@ -77,53 +86,71 @@ module Rucola
|
|
77
86
|
root = plugins_root
|
78
87
|
if root.exist?
|
79
88
|
root.children.each do |plugin|
|
80
|
-
|
81
|
-
|
89
|
+
init_rb = plugin + 'init.rb'
|
90
|
+
next unless init_rb.exist?
|
91
|
+
Kernel.require init_rb
|
82
92
|
end
|
83
93
|
end
|
84
94
|
end
|
85
95
|
|
86
|
-
# Run the initializer and start the application.
|
87
|
-
#
|
88
|
-
# a command to run.
|
89
|
-
#
|
90
|
-
# OSX::Initializer.run(:set_load_path)
|
96
|
+
# Run the initializer and start the application.
|
97
|
+
# Pass it a block to set the configuration.
|
91
98
|
#
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
99
|
+
# Rucola::Initializer.run do |config|
|
100
|
+
# config.use_debugger = true
|
101
|
+
# # See +Configuration+ for more info on the options.
|
102
|
+
# end
|
103
|
+
def run
|
104
|
+
if @initializer.nil?
|
105
|
+
@initializer = new
|
106
|
+
|
107
|
+
yield @initializer.configuration if block_given?
|
108
|
+
@initializer.process
|
109
|
+
|
110
|
+
start_app
|
111
|
+
else
|
112
|
+
yield @initializer.configuration if block_given?
|
113
|
+
end
|
97
114
|
end
|
98
115
|
|
99
116
|
# Starts the application's run loop.
|
100
117
|
def start_app
|
101
|
-
OSX.NSApplicationMain(0, nil) unless
|
118
|
+
OSX.NSApplicationMain(0, nil) unless Rucola::RCApp.test? || ENV['DONT_START_RUBYCOCOA_APP']
|
102
119
|
end
|
103
120
|
end
|
104
121
|
|
105
|
-
#
|
106
|
-
|
107
|
-
|
108
|
-
|
122
|
+
# The Configuration instance used by this Initializer instance.
|
123
|
+
attr_reader :configuration
|
124
|
+
|
125
|
+
# Create an initializer instance.
|
126
|
+
def initialize
|
127
|
+
@configuration = Configuration.new
|
109
128
|
end
|
110
129
|
|
111
|
-
# Step through the initialization routines
|
112
|
-
# routines if active_record isnt' being used.
|
130
|
+
# Step through the initialization routines.
|
113
131
|
def process
|
114
132
|
Rucola::Plugin.before_process(self)
|
115
|
-
unless ENV['DYLD_LIBRARY_PATH'].nil?
|
116
|
-
set_load_path
|
117
|
-
copy_load_paths_for_release
|
118
|
-
end
|
119
133
|
|
120
|
-
|
134
|
+
# load the environment config
|
135
|
+
@configuration.load_environment_configuration!
|
136
|
+
|
137
|
+
Rucola::Debugger.use! if @configuration.use_debugger
|
138
|
+
use_reloader! if @configuration.use_reloader
|
139
|
+
|
140
|
+
require_dependencies
|
121
141
|
require_frameworks
|
142
|
+
require_lib_source_files
|
122
143
|
require_ruby_source_files
|
123
|
-
|
144
|
+
|
124
145
|
Rucola::Plugin.after_process(self)
|
125
146
|
end
|
126
147
|
|
148
|
+
# Requires all the dependencies specified in config/dependencies.rb
|
149
|
+
def require_dependencies
|
150
|
+
deps_file = (RUBYCOCOA_ROOT + 'config/dependencies.rb').to_s
|
151
|
+
Rucola::Dependencies.load(deps_file).require!
|
152
|
+
end
|
153
|
+
|
127
154
|
# Requires all frameworks specified by the Configuration#objc_frameworks
|
128
155
|
# list. This is also responsible for including osx/active_record_proxy if
|
129
156
|
# use_active_record? is true
|
@@ -131,11 +158,6 @@ module Rucola
|
|
131
158
|
configuration.objc_frameworks.each { |framework| OSX.require_framework(framework) }
|
132
159
|
end
|
133
160
|
|
134
|
-
# Loads the Rucola support library
|
135
|
-
def require_rucola_support
|
136
|
-
require Pathname.new(__FILE__).dirname + 'rucola_support'
|
137
|
-
end
|
138
|
-
|
139
161
|
# Recursively requires any ruby source file that it finds.
|
140
162
|
def require_ruby_source_files_in_dir_recursive(dir)
|
141
163
|
dir.children.each do |child|
|
@@ -147,6 +169,13 @@ module Rucola
|
|
147
169
|
end
|
148
170
|
end
|
149
171
|
|
172
|
+
# Requires any ruby source files in the app/lib/ directory.
|
173
|
+
def require_lib_source_files
|
174
|
+
Dir[RUBYCOCOA_ROOT + 'lib/*.rb'].each do |f|
|
175
|
+
require f
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
150
179
|
# Loops through the subdirectories of the app/ directory.
|
151
180
|
# It requires any ruby file in any of the subdirectories and registers
|
152
181
|
# the required file in the hash +@require_ruby_source_files+ with the name
|
@@ -159,45 +188,26 @@ module Rucola
|
|
159
188
|
end
|
160
189
|
end
|
161
190
|
|
162
|
-
|
163
|
-
|
164
|
-
|
191
|
+
# Loads the +Reloader+ lib if +use_reloader+ is set to +true+ on the +Configuration+.
|
192
|
+
def use_reloader!
|
193
|
+
if configuration.use_reloader
|
194
|
+
Kernel.require 'rucola/reloader'
|
195
|
+
Rucola::Reloader.start!
|
165
196
|
end
|
166
197
|
end
|
167
198
|
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
return if @environment_loaded
|
172
|
-
@environment_loaded = true
|
173
|
-
|
174
|
-
config = configuration
|
175
|
-
constants = self.class.constants
|
176
|
-
eval(IO.read(configuration.environment_path), binding, configuration.environment_path)
|
177
|
-
|
178
|
-
(self.class.constants - constants).each do |const|
|
179
|
-
Object.const_set(const, self.class.const_get(const))
|
199
|
+
def load_application_initializers
|
200
|
+
Dir["#{configuration.root_path}/config/initializers/**/*.rb"].sort.each do |initializer|
|
201
|
+
load(initializer)
|
180
202
|
end
|
181
203
|
end
|
182
204
|
|
183
205
|
# Set the paths from which your application will automatically load source files.
|
184
|
-
def set_load_path
|
185
|
-
load_paths = configuration.load_paths
|
186
|
-
load_paths.reverse_each { |dir| $LOAD_PATH.unshift(dir) if File.directory?(dir) } unless
|
206
|
+
def set_load_path!
|
207
|
+
load_paths = configuration.load_paths || [] # TODO: from script/console the configuration isn't ran.
|
208
|
+
load_paths.reverse_each { |dir| $LOAD_PATH.unshift(dir) if File.directory?(dir) } unless Rucola::RCApp.test? # FIXME: why??
|
187
209
|
$LOAD_PATH.uniq!
|
188
210
|
end
|
189
|
-
|
190
|
-
# Copy the default load paths to the resource directory for the application if
|
191
|
-
# we are building a release, otherwise we do nothing. When in debug or test mode,
|
192
|
-
# the files are loaded directly from your working directory.
|
193
|
-
#
|
194
|
-
# TODO: Remove debug database from released app if it exists.
|
195
|
-
def copy_load_paths_for_release
|
196
|
-
return unless configuration.environment == 'release'
|
197
|
-
configuration.load_paths.each do |path|
|
198
|
-
`cp -R #{path} #{RUBYCOCOA_ROOT}/#{File.basename(path)}` if File.directory?(path)
|
199
|
-
end
|
200
|
-
end
|
201
211
|
end
|
202
212
|
|
203
213
|
class Configuration
|
@@ -215,37 +225,59 @@ module Rucola
|
|
215
225
|
# all +models+, +config+, +controllers+ and +db+ paths are included in this list.
|
216
226
|
attr_accessor :load_paths
|
217
227
|
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
228
|
+
# Defines wether or not you want to use the +Reloader+.
|
229
|
+
#
|
230
|
+
# Turning on the reloader will start a fsevent loop which watches the files in app/ for changes
|
231
|
+
# and try to reload any classes that have been saved while the app is running.
|
232
|
+
#
|
233
|
+
# It could however lead to erratic behaviour so use it with caution.
|
234
|
+
attr_accessor :use_reloader
|
225
235
|
|
226
|
-
|
227
|
-
|
228
|
-
|
236
|
+
# Defines wether or not you want to use the +debugger+.
|
237
|
+
#
|
238
|
+
# The debugger allows you to easily set breakpoints and debug them.
|
239
|
+
# See the documentation from ruby-debug for its usage:
|
240
|
+
# http://www.datanoise.com/ruby-debug/
|
241
|
+
attr_accessor :use_debugger
|
229
242
|
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
243
|
+
# Defines wether or not you want to allow the use of RubyGems.
|
244
|
+
#
|
245
|
+
# You can completely disable the usage of RubyGems by setting this to false.
|
246
|
+
#
|
247
|
+
# Unless you're using gems which are installed on a system by default, it's
|
248
|
+
# better to set it to false. This will enable you to debug wether or not your
|
249
|
+
# application has been bundled succesfully, PLUS not using rubygems will improve
|
250
|
+
# the performance of your application.
|
251
|
+
attr_accessor :use_rubygems
|
237
252
|
|
238
|
-
#
|
239
|
-
|
240
|
-
|
253
|
+
# Declare which dependency types should be bundled with a release build.
|
254
|
+
# Most of the times you would probably only bundle gems if you're targeting
|
255
|
+
# a ruby which is compatible and contains the right site libs.
|
256
|
+
#
|
257
|
+
# # Only bundles gems
|
258
|
+
# config.dependency_types = :gem
|
259
|
+
#
|
260
|
+
# # Bundles gems and site libs
|
261
|
+
# config.dependency_types = :gem, :site
|
262
|
+
#
|
263
|
+
# # Bundles site and other libs, where other are libs outside any of the default load paths.
|
264
|
+
# config.dependency_types = :site, :other
|
265
|
+
attr_accessor :dependency_types
|
266
|
+
|
267
|
+
def initialize
|
268
|
+
@objc_frameworks = []
|
269
|
+
@load_paths = default_load_paths
|
270
|
+
@dependency_types = []
|
271
|
+
@use_reloader = @use_debugger = @use_debugger = false
|
241
272
|
end
|
242
273
|
|
243
|
-
#
|
244
|
-
# default the file is at <tt>config/environments/#{environment}.rb</tt>.
|
245
|
-
def
|
246
|
-
|
274
|
+
# Loads the current environment's file (debug.rb, release.rb, test.rb).
|
275
|
+
# By default the file is at <tt>config/environments/#{environment}.rb</tt>.
|
276
|
+
def load_environment_configuration!
|
277
|
+
root = defined?(SOURCE_ROOT) ? SOURCE_ROOT : RCApp.root_path
|
278
|
+
require "#{root}/config/environments/#{RCApp.env}.rb"
|
247
279
|
end
|
248
|
-
|
280
|
+
|
249
281
|
private
|
250
282
|
# Set the load paths, which specifies what directories should be copied over on release.
|
251
283
|
# We can't use RUBYCOCOA_ROOT here because when building for release the .app file is the
|