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.
Files changed (77) hide show
  1. data/ChangeLog +468 -0
  2. data/History.txt +25 -0
  3. data/License.txt +1 -1
  4. data/Manifest.txt +32 -0
  5. data/README.txt +9 -67
  6. data/Rakefile +39 -31
  7. data/TODO +10 -18
  8. data/app_generators/rucola/rucola_generator.rb +15 -8
  9. data/app_generators/rucola/templates/Rakefile.erb +35 -7
  10. data/app_generators/rucola/templates/config/boot.rb +0 -1
  11. data/app_generators/rucola/templates/config/dependencies.rb +31 -0
  12. data/app_generators/rucola/templates/config/environment.rb +0 -1
  13. data/app_generators/rucola/templates/config/environments/debug.rb +13 -1
  14. data/app_generators/rucola/templates/config/environments/release.rb +15 -1
  15. data/app_generators/rucola/templates/config/environments/test.rb +7 -1
  16. data/app_generators/rucola/templates/misc/rb_main.rb.erb +12 -1
  17. data/app_generators/rucola/templates/project.pbxproj.erb +4 -0
  18. data/app_generators/rucola/templates/script/console +10 -0
  19. data/app_generators/rucola/templates/test/controllers/test_application_controller.rb +22 -10
  20. data/app_generators/rucola/templates/test/test_helper.rb +1 -0
  21. data/bin/rucola +4 -2
  22. data/lib/rucola/dependencies.rb +241 -0
  23. data/lib/rucola/dependencies/exclusions.rb +20 -0
  24. data/lib/rucola/dependencies/override_require_and_gem.rb +30 -0
  25. data/lib/rucola/dependencies/resolver.rb +68 -0
  26. data/lib/rucola/fsevents.rb +108 -0
  27. data/lib/rucola/initializer.rb +149 -117
  28. data/lib/rucola/log.rb +61 -0
  29. data/lib/rucola/nib.rb +3 -3
  30. data/lib/rucola/reloader.rb +39 -0
  31. data/lib/rucola/ruby_debug.rb +27 -0
  32. data/lib/rucola/rucola_support.rb +1 -2
  33. data/lib/rucola/rucola_support/core_ext.rb +4 -2
  34. data/lib/rucola/rucola_support/core_ext/objc.rb +9 -4
  35. data/lib/rucola/rucola_support/core_ext/objc/nsimage.rb +22 -0
  36. data/lib/rucola/rucola_support/core_ext/ruby.rb +11 -4
  37. data/lib/rucola/rucola_support/core_ext/ruby/file.rb +11 -0
  38. data/lib/rucola/rucola_support/core_ext/ruby/kernel.rb +16 -0
  39. data/lib/rucola/rucola_support/core_ext/ruby/object.rb +47 -0
  40. data/lib/rucola/rucola_support/core_ext/ruby/string.rb +8 -0
  41. data/lib/rucola/rucola_support/notifications/notifications.rb +26 -28
  42. data/lib/rucola/rucola_support/rc_app.rb +18 -0
  43. data/lib/rucola/tasks/dependencies.rake +49 -0
  44. data/lib/rucola/tasks/deploy.rake +131 -0
  45. data/lib/rucola/tasks/main.rake +39 -6
  46. data/lib/rucola/tasks/xcode.rake +54 -11
  47. data/lib/rucola/test_case.rb +138 -0
  48. data/lib/rucola/test_helper.rb +11 -5
  49. data/lib/rucola/version.rb +2 -2
  50. data/lib/rucola/xcode.rb +39 -9
  51. data/rucola_generators/controller/templates/test_controller_template.rb.erb +19 -7
  52. data/rucola_generators/simple_model/USAGE +5 -0
  53. data/rucola_generators/simple_model/simple_model_generator.rb +54 -0
  54. data/rucola_generators/simple_model/templates/simple_model.rb.erb +2 -0
  55. data/rucola_generators/simple_model/templates/test_simple_model.rb.erb +11 -0
  56. data/rucola_generators/window_controller/templates/test_window_controller_template.rb.erb +24 -13
  57. data/test/fixtures/dependencies/foo.rb +2 -0
  58. data/test/fixtures/dependencies/foo/bar.rb +0 -0
  59. data/test/fixtures/dependencies/foo/baz.rb +0 -0
  60. data/test/fixtures/dependencies/requires_fileutils.rb +1 -0
  61. data/test/fixtures/some_reloadable_class.rb +4 -0
  62. data/test/test_core_ext.rb +80 -0
  63. data/test/test_dependencies.rb +205 -0
  64. data/test/test_fsevents.rb +152 -0
  65. data/test/test_helper.rb +30 -1
  66. data/test/test_initializer.rb +56 -23
  67. data/test/test_log.rb +44 -0
  68. data/test/test_objc_core_ext.rb +23 -0
  69. data/test/test_rc_app.rb +5 -0
  70. data/test/test_reloader.rb +28 -0
  71. data/test/test_rucola_generator.rb +7 -0
  72. data/test/test_simple_model_generator.rb +48 -0
  73. data/test/test_xcode.rb +85 -5
  74. data/website/index.html +17 -91
  75. data/website/index.txt +14 -81
  76. data/website/template.rhtml +1 -1
  77. metadata +120 -76
@@ -0,0 +1,48 @@
1
+ require File.join(File.dirname(__FILE__), "test_generator_helper.rb")
2
+
3
+ class TestSimpleModelGenerator < Test::Unit::TestCase
4
+ include RubiGen::GeneratorTestHelper
5
+
6
+ def setup
7
+ bare_setup
8
+ end
9
+
10
+ def teardown
11
+ bare_teardown
12
+ end
13
+
14
+ # Some generator-related assertions:
15
+ # assert_generated_file(name, &block) # block passed the file contents
16
+ # assert_directory_exists(name)
17
+ # assert_generated_class(name, &block)
18
+ # assert_generated_module(name, &block)
19
+ # assert_generated_test_for(name, &block)
20
+ # The assert_generated_(class|module|test_for) &block is passed the body of the class/module within the file
21
+ # assert_has_method(body, *methods) # check that the body has a list of methods (methods with parentheses not supported yet)
22
+ #
23
+ # Other helper methods are:
24
+ # app_root_files - put this in teardown to show files generated by the test method (e.g. p app_root_files)
25
+ # bare_setup - place this in setup method to create the APP_ROOT folder for each test
26
+ # bare_teardown - place this in teardown method to destroy the TMP_ROOT or APP_ROOT folder after each test
27
+
28
+ def test_generator_without_options
29
+ name = "foo_bar"
30
+ run_generator('simple_model', [name], sources)
31
+
32
+ assert_generated_file("app/models/foo_bar.rb") do |content|
33
+ assert(content == "class FooBar < OSX::NSObject\nend")
34
+ end
35
+
36
+ assert_generated_file("test/models/test_foo_bar.rb")
37
+ end
38
+
39
+ private
40
+ def sources
41
+ [RubiGen::PathSource.new(:test, File.join(File.dirname(__FILE__),"..", generator_path))
42
+ ]
43
+ end
44
+
45
+ def generator_path
46
+ "rucola_generators"
47
+ end
48
+ end
@@ -19,6 +19,8 @@ describe 'Xcode' do
19
19
  OSX::NSMutableDictionary.stubs(:dictionaryWithContentsOfFile).with(@data_path).returns(@data)
20
20
 
21
21
  @project = Xcode.new(@project_path)
22
+ # Add a stub `Linked Frameworks` group
23
+ @project.objects['1058C7A0FEA54F0111CA2CBB'] = { 'name' => 'Linked Frameworks', 'children' => [] }.to_ns
22
24
  end
23
25
 
24
26
  it "should initialize" do
@@ -84,15 +86,92 @@ describe 'Xcode' do
84
86
  @project.object_for_id(id).last['files'].should == [@object_id]
85
87
  end
86
88
 
89
+ it "should generate UUIDs" do
90
+ @project.generate_uuid.length.should.be 24
91
+ end
92
+
93
+ # This is a hack for the test if it generates a unique object id.
94
+ # I couldn't find another way to first generate a dup and the second time a good one...
95
+ def mock_generate_uuid
96
+ Xcode.class_eval do
97
+ alias_method :original_generate_uuid, :generate_uuid
98
+ def generate_uuid
99
+ generate_uuid_counter
100
+ if @never_run.nil?
101
+ @never_run = false
102
+ '519A79DB0CC8AE6B00CBE85D'
103
+ else
104
+ '519A79DB0CC8AE6B00CBE85F'
105
+ end
106
+ end
107
+ end
108
+ end
109
+
110
+ def unmock_generate_uuid
111
+ Xcode.class_eval do
112
+ alias_method :generate_uuid, :original_generate_uuid
113
+ end
114
+ end
115
+
116
+ it "should generate a non-duplicate object id" do
117
+ objects = {'519A79DB0CC8AE6B00CBE85D' => 1, '519A79DB0CC8AE6B00CBE85E' => 2}
118
+ @project.expects(:objects).returns(objects)
119
+ @project.expects(:generate_uuid_counter).times(2)
120
+ mock_generate_uuid # set the hack
121
+ @project.generate_object_id
122
+ unmock_generate_uuid # unset the hack
123
+ end
124
+
87
125
  # it "should create a new framework copy build phase" do
88
126
  # # FIXME: until we generate id's this is just a lame test
89
127
  # Xcode::NEW_COPY_FRAMEWORKS_BUILD_PHASE = @object
90
128
  # @project.new_framework_copy_build_phase.should == @object
91
129
  # end
92
130
 
131
+ it "should add a framework" do
132
+ name = 'BlaBla.framework'
133
+ path = '/foo/BlaBla.framework'
134
+
135
+ before = @project.objects.length
136
+ framework_obj, fileref_obj = @project.add_framework(name, path)
137
+ @project.objects.length.should.be(before + 2)
138
+
139
+ framework_obj.last.should == {
140
+ 'isa' => 'PBXFileReference',
141
+ 'lastKnownFileType' => 'wrapper.framework',
142
+ 'name' => name,
143
+ 'path' => path,
144
+ 'sourceTree' => '<absolute>'
145
+ }.to_ns
146
+
147
+ fileref_obj.last.should == {
148
+ 'fileRef' => framework_obj.first,
149
+ 'isa' => 'PBXBuildFile'
150
+ }.to_ns
151
+
152
+ linked_frameworks = @project.object_for_name('Linked Frameworks')
153
+ linked_frameworks.last['children'].should.include framework_obj.first
154
+ end
155
+
156
+ it "should add a framework as absolute" do
157
+ framework_obj, fileref_obj = @project.add_framework('BlaBla.framework', '/foo/BlaBla.framework')
158
+ framework_obj.last['sourceTree'].should == '<absolute>'
159
+ end
160
+
161
+ it "should add a framework as relative (group)" do
162
+ framework_obj, fileref_obj = @project.add_framework('BlaBla.framework', 'vendor/frameworks/BlaBla.framework')
163
+ framework_obj.last['sourceTree'].should == '<group>'
164
+ end
165
+
166
+ it "should list the frameworks that it includes" do
167
+ framework_obj, fileref_obj = @project.add_framework('BlaBla.framework', '/foo/BlaBla.framework')
168
+ @project.frameworks.should == [framework_obj]
169
+ end
170
+
93
171
  it "should change the path of a framework used in the project" do
94
- id, values = 'FRAMEWORK_ID'.to_ns, { 'name' => 'RubyCocoa.framework', 'path' => '/foo/RubyCocoa.framework', 'sourceTree' => '<absolute>' }.to_ns
95
- @project.add_object(id, values)
172
+ framework_obj, fileref_obj = @project.add_framework('RubyCocoa.framework', '/foo/RubyCocoa.framework')
173
+ id = framework_obj.first
174
+
96
175
  framework_path = 'vendor/RubyCocoa.framework'
97
176
  @project.change_framework_location('RubyCocoa.framework', framework_path)
98
177
 
@@ -107,8 +186,8 @@ describe 'Xcode' do
107
186
  end
108
187
 
109
188
  it "should bundle a framework with the application" do
110
- id, values = 'FRAMEWORK_ID'.to_ns, { 'name' => 'BlaBla.framework', 'path' => '/foo/BlaBla.framework', 'sourceTree' => '<absolute>' }.to_ns
111
- @project.add_object(id, values)
189
+ framework_obj, fileref_obj = @project.add_framework('BlaBla.framework', '/foo/BlaBla.framework')
190
+ id = framework_obj.first
112
191
 
113
192
  @project.bundle_framework('BlaBla.framework')
114
193
 
@@ -118,11 +197,12 @@ describe 'Xcode' do
118
197
 
119
198
  build_phase_id = @project.object_for_id(build_phases.first).last['files'].first
120
199
  build_phase_id, build_phase = @project.object_for_id(build_phase_id)
121
- build_phase['fileRef'].should == 'FRAMEWORK_ID'
200
+ build_phase['fileRef'].should == id
122
201
  end
123
202
 
124
203
  it "should bundle the RubyCocoa framework with the application" do
125
204
  @project.expects(:bundle_framework).with('RubyCocoa.framework')
126
205
  @project.bundle_rubycocoa_framework
127
206
  end
207
+
128
208
  end
@@ -33,7 +33,7 @@
33
33
  <h1>rucola</h1>
34
34
  <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/rucola"; return false'>
35
35
  <p>Get Version</p>
36
- <a href="http://rubyforge.org/projects/rucola" class="numbers">0.0.3</a>
36
+ <a href="http://rubyforge.org/projects/rucola" class="numbers">0.5.0</a>
37
37
  </div>
38
38
  <h1>&#x2192; &#8216;rucola&#8217;</h1>
39
39
 
@@ -41,12 +41,12 @@
41
41
  <h2>What</h2>
42
42
 
43
43
 
44
- <p>A Framework for building Cocoa applications in Ruby</p>
44
+ <p>A Framework for rapidly building RubyCocoa applications</p>
45
45
 
46
46
 
47
47
  <p>Rucola is a light weight framework that helps you write RubyCocoa apps.
48
48
  It allows you to build, test, and deploy applications using rake commands,
49
- eliminating the need to use XCode, however you can use XCode if you wish.</p>
49
+ eliminating the need to use XCode for the most common tasks.</p>
50
50
 
51
51
 
52
52
  <p>Rucola provides a set of generators to help you generate controllers, window controllers,
@@ -58,7 +58,7 @@ ways of doing things.</p>
58
58
 
59
59
 
60
60
  <ul>
61
- <li><a href="http://sourceforge.net/project/showfiles.php?group_id=44114&#38;package_id=36578">RubyCocoa 0.13</a> That&#8217;s <span class="caps">NOT</span> the one included with Leopard, which is 0.12</li>
61
+ <li><a href="http://sourceforge.net/project/showfiles.php?group_id=44114&#38;package_id=36578">RubyCocoa 0.13.2</a> <em>That&#8217;s <span class="caps">NOT</span> the one currently included with Leopard</em></li>
62
62
  <li>For testing it&#8217;s adviced to install the following gems: test-spec, mocha, zentest (autotest)</li>
63
63
  </ul>
64
64
 
@@ -66,7 +66,7 @@ ways of doing things.</p>
66
66
  <h2>Installing</h2>
67
67
 
68
68
 
69
- <p><pre class='syntax'>sudo gem install rucola</pre></p>
69
+ <p><pre class='syntax'>$ sudo gem install rucola</pre></p>
70
70
 
71
71
 
72
72
  <h2>Demonstration of usage</h2>
@@ -75,100 +75,21 @@ ways of doing things.</p>
75
75
  <h3>Generating an application skeleton</h3>
76
76
 
77
77
 
78
- <pre><code>rucola MyApp -a "Your Name"</code></pre>
79
-
78
+ <code>$ rucola MyApp -a "Your Name"</code>
80
79
 
81
80
  <p>Running this command will give you a complete, working application with a single window already
82
81
  bound to your application controller.</p>
83
82
 
84
83
 
85
- <h3>Using Notifications</h3>
86
-
87
-
88
- <h4>Rucola
89
- <pre class='syntax'>
90
- <span class="keyword">class </span><span class="class">Foo</span> <span class="punct">&lt;</span> <span class="constant">Rucola</span><span class="punct">::</span><span class="constant">RCController</span>
91
- <span class="ident">notify</span> <span class="symbol">:some_method</span><span class="punct">,</span> <span class="symbol">:when</span> <span class="punct">=&gt;</span> <span class="symbol">:something_happens</span>
92
-
93
- <span class="keyword">def </span><span class="method">some_method</span><span class="punct">(</span><span class="ident">notification</span><span class="punct">)</span>
94
- <span class="ident">puts</span> <span class="punct">&quot;</span><span class="string">w00t!</span><span class="punct">&quot;</span>
95
- <span class="keyword">end</span>
96
- <span class="keyword">end</span>
97
- </pre></h4>
98
-
99
-
100
- <h4>Objective C (Excluding header file)
101
- <pre class='syntax'>
102
- @implementation Foo
103
- -(id)init {
104
- if(self = [super init]) {
105
- NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
106
- [center addObserver:self selector:(some_method:) name:@&quot;SomethingHappensNotification&quot; object:nil];
107
- }
108
- return self;
109
- }
110
-
111
- -(void)some_method:(NSNotification *) notification {
112
- NSLog(&quot;w00t!&quot;);
113
- }
114
- @end
115
- </pre></h4>
116
-
117
-
118
- <h3>Alternative Way Of Using Notifications</h3>
119
-
120
-
121
- <pre class='syntax'>
122
- <span class="keyword">class </span><span class="class">Foo</span> <span class="punct">&lt;</span> <span class="constant">Rucola</span><span class="punct">::</span><span class="constant">RCController</span>
123
- <span class="ident">notify_on</span> <span class="symbol">:something_happens</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">notification</span><span class="punct">|</span>
124
- <span class="ident">puts</span> <span class="punct">&quot;</span><span class="string">w0t0!</span><span class="punct">&quot;</span>
125
- <span class="keyword">end</span>
126
- <span class="keyword">end</span>
127
- </pre>
128
-
129
-
130
- <h3>Working with Interface Builder</h3>
84
+ <h3>Running an application</h3>
131
85
 
132
86
 
133
- <p>A Cocoa application contains `outlets`. Outlets allow you to bind variable names to objects.
134
- An object can be a user interface element or an instance of a class.</p>
87
+ <code>$ rake</code>
135
88
 
136
-
137
- <pre class='syntax'>
138
- <span class="keyword">class </span><span class="class">ApplicationController</span> <span class="punct">&lt;</span> <span class="constant">Rucola</span><span class="punct">::</span><span class="constant">RCController</span>
139
- <span class="ident">ib_outlet</span> <span class="symbol">:main_window</span>
140
-
141
- <span class="keyword">def </span><span class="method">awakeFromNib</span>
142
- <span class="comment"># All the application delegate methods will be called on this object.</span>
143
- <span class="constant">OSX</span><span class="punct">::</span><span class="constant">NSApp</span><span class="punct">.</span><span class="ident">delegate</span> <span class="punct">=</span> <span class="constant">self</span>
144
-
145
- <span class="ident">puts</span> <span class="punct">&quot;</span><span class="string">ApplicationController awoke.</span><span class="punct">&quot;</span>
146
- <span class="ident">puts</span> <span class="punct">&quot;</span><span class="string">Edit: app/controllers/application_controller.rb</span><span class="punct">&quot;</span>
147
- <span class="ident">puts</span> <span class="punct">&quot;</span><span class="string"><span class="escape">\n</span>It's window is: <span class="expr">#{@main_window.inspect}</span></span><span class="punct">&quot;</span>
148
- <span class="keyword">end</span>
149
-
150
- <span class="comment"># NSApplication delegate methods</span>
151
- <span class="keyword">def </span><span class="method">applicationDidFinishLaunching</span><span class="punct">(</span><span class="ident">notification</span><span class="punct">)</span>
152
- <span class="ident">puts</span> <span class="punct">&quot;</span><span class="string"><span class="escape">\n</span>Application finished launching.</span><span class="punct">&quot;</span>
153
- <span class="keyword">end</span>
154
-
155
- <span class="keyword">def </span><span class="method">applicationWillTerminate</span><span class="punct">(</span><span class="ident">notification</span><span class="punct">)</span>
156
- <span class="ident">puts</span> <span class="punct">&quot;</span><span class="string"><span class="escape">\n</span>Application will terminate.</span><span class="punct">&quot;</span>
157
- <span class="keyword">end</span>
158
- <span class="keyword">end</span>
159
- </pre>
160
-
161
-
162
- <p>The `@main_window` variable now points to the user interface window. You can invoke any methods of NSWindow.</p>
163
-
164
-
165
- <p>There is also a `rake ib:update` that will update your nib files with the outlets you specify in your code.
166
- For example, if we wanted to add a button to the application controller above, we could add `ib_outlet :my_button`.
167
- After you&#8217;ve added this, you can run `rake ib:update` and your outlet will be available in interface builder that
168
- you can now hook up to your UI button.</p>
89
+ <h2>Extras</h2>
169
90
 
170
91
 
171
- <h2>Extras</h2>
92
+ <p>Documentation can be found <a href="http://rucola.rubyforge.org/rdoc/">here.</a></p>
172
93
 
173
94
 
174
95
  <p>Sample apps can be found at:</p>
@@ -216,8 +137,13 @@ script/plugin install SACrashReporter
216
137
  <p>Read the <a href="http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/">8 steps for fixing other people&#8217;s code</a> and for section <a href="http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/#8b-google-groups">8b: Submit patch to Google Groups</a>, use the Google Group above.</p>
217
138
 
218
139
 
219
- <p>The trunk repository is <code>svn://rubyforge.org/var/svn/rucola/trunk</code> for anonymous access.</p>
140
+ <p>Browse the git repo online at: <code>http://github.com/alloy/rucola/tree/master</code></p>
141
+
142
+
143
+ <p>The latest version can be checked out with:</p>
144
+
220
145
 
146
+ <code>$ git clone git://github.com/alloy/rucola.git</code>
221
147
 
222
148
  <h2>License</h2>
223
149
 
@@ -230,7 +156,7 @@ script/plugin install SACrashReporter
230
156
 
231
157
  <p>Comments are welcome. Send an email via the <a href="http://groups.google.com/group/rucola">forum</a></p>
232
158
  <p class="coda">
233
- <a href="http://groups.google.com/group/rucola">Eloy Duran, Justin Palmer</a>, 26th November 2007<br>
159
+ <a href="http://groups.google.com/group/rucola">Eloy Duran</a>, 11th July 2008<br>
234
160
  Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
235
161
  </p>
236
162
  </div>
@@ -4,11 +4,11 @@ h1. &#x2192; 'rucola'
4
4
 
5
5
  h2. What
6
6
 
7
- A Framework for building Cocoa applications in Ruby
7
+ A Framework for rapidly building RubyCocoa applications
8
8
 
9
9
  Rucola is a light weight framework that helps you write RubyCocoa apps.
10
10
  It allows you to build, test, and deploy applications using rake commands,
11
- eliminating the need to use XCode, however you can use XCode if you wish.
11
+ eliminating the need to use XCode for the most common tasks.
12
12
 
13
13
  Rucola provides a set of generators to help you generate controllers, window controllers,
14
14
  and document-based applications. It also provides APIs for simplifying some of Objective-C's
@@ -16,101 +16,30 @@ ways of doing things.
16
16
 
17
17
  h2. Requirements
18
18
 
19
- * "RubyCocoa 0.13":http://sourceforge.net/project/showfiles.php?group_id=44114&package_id=36578 That's NOT the one included with Leopard, which is 0.12
19
+ * "RubyCocoa 0.13.2":http://sourceforge.net/project/showfiles.php?group_id=44114&package_id=36578 <em>That's NOT the one currently included with Leopard</em>
20
20
  * For testing it's adviced to install the following gems: test-spec, mocha, zentest (autotest)
21
21
 
22
22
  h2. Installing
23
23
 
24
- <pre syntax="sh">sudo gem install rucola</pre>
24
+ <pre syntax="sh">$ sudo gem install rucola</pre>
25
25
 
26
26
  h2. Demonstration of usage
27
27
 
28
28
  h3. Generating an application skeleton
29
29
 
30
- rucola MyApp -a "Your Name"
30
+ <code>$ rucola MyApp -a "Your Name"</code>
31
31
 
32
32
  Running this command will give you a complete, working application with a single window already
33
33
  bound to your application controller.
34
34
 
35
+ h3. Running an application
35
36
 
36
- h3. Using Notifications
37
-
38
- h4. Rucola
39
- <pre syntax="ruby">
40
- class Foo < Rucola::RCController
41
- notify :some_method, :when => :something_happens
42
-
43
- def some_method(notification)
44
- puts "w00t!"
45
- end
46
- end
47
- </pre>
48
-
49
- h4. Objective C (Excluding header file)
50
- <pre syntax="c">
51
- @implementation Foo
52
- -(id)init {
53
- if(self = [super init]) {
54
- NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
55
- [center addObserver:self selector:(some_method:) name:@"SomethingHappensNotification" object:nil];
56
- }
57
- return self;
58
- }
59
-
60
- -(void)some_method:(NSNotification *) notification {
61
- NSLog("w00t!");
62
- }
63
- @end
64
- </pre>
65
-
66
- h3. Alternative Way Of Using Notifications
67
-
68
- <pre syntax="ruby">
69
- class Foo < Rucola::RCController
70
- notify_on :something_happens do |notification|
71
- puts "w0t0!"
72
- end
73
- end
74
- </pre>
75
-
76
- h3. Working with Interface Builder
77
-
78
- A Cocoa application contains `outlets`. Outlets allow you to bind variable names to objects.
79
- An object can be a user interface element or an instance of a class.
80
-
81
- <pre syntax="ruby">
82
- class ApplicationController < Rucola::RCController
83
- ib_outlet :main_window
84
-
85
- def awakeFromNib
86
- # All the application delegate methods will be called on this object.
87
- OSX::NSApp.delegate = self
88
-
89
- puts "ApplicationController awoke."
90
- puts "Edit: app/controllers/application_controller.rb"
91
- puts "\nIt's window is: #{@main_window.inspect}"
92
- end
93
-
94
- # NSApplication delegate methods
95
- def applicationDidFinishLaunching(notification)
96
- puts "\nApplication finished launching."
97
- end
98
-
99
- def applicationWillTerminate(notification)
100
- puts "\nApplication will terminate."
101
- end
102
- end
103
- </pre>
104
-
105
- The `@main_window` variable now points to the user interface window. You can invoke any methods of NSWindow.
106
-
107
- There is also a `rake ib:update` that will update your nib files with the outlets you specify in your code.
108
- For example, if we wanted to add a button to the application controller above, we could add `ib_outlet :my_button`.
109
- After you've added this, you can run `rake ib:update` and your outlet will be available in interface builder that
110
- you can now hook up to your UI button.
37
+ <code>$ rake</code>
111
38
 
112
39
  h2. Extras
113
40
 
41
+ Documentation can be found "here.":http://rucola.rubyforge.org/rdoc/
42
+
114
43
  Sample apps can be found at:
115
44
 
116
45
  <pre syntax="sh"> svn co svn://rubyforge.org/var/svn/rucola/extras/examples/</pre>
@@ -144,7 +73,11 @@ h2. How to submit patches
144
73
 
145
74
  Read the "8 steps for fixing other people's code":http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/ and for section "8b: Submit patch to Google Groups":http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/#8b-google-groups, use the Google Group above.
146
75
 
147
- The trunk repository is <code>svn://rubyforge.org/var/svn/rucola/trunk</code> for anonymous access.
76
+ Browse the git repo online at: <code>http://github.com/alloy/rucola/tree/master</code>
77
+
78
+ The latest version can be checked out with:
79
+
80
+ <code>$ git clone git://github.com/alloy/rucola.git</code>
148
81
 
149
82
  h2. License
150
83