rucola 0.0.3 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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