rxcode 0.0.5 → 0.0.6
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/README.md +127 -1
- data/VERSION +1 -1
- data/lib/rxcode/spec/rake_task.rb +17 -9
- data/lib/rxcode/tasks/spec.rb +22 -1
- metadata +2 -2
data/README.md
CHANGED
|
@@ -1,6 +1,132 @@
|
|
|
1
1
|
# rxcode
|
|
2
2
|
|
|
3
|
-
RXCode
|
|
3
|
+
RXCode allows you to use Ruby to interact with your XCode projects and test your Objective-C code using MacRuby and
|
|
4
|
+
RSpec 2.
|
|
5
|
+
|
|
6
|
+
## Getting Started
|
|
7
|
+
|
|
8
|
+
RXCode is just a 'gem install' away:
|
|
9
|
+
|
|
10
|
+
$ gem install bundler
|
|
11
|
+
$ gem install rxcode
|
|
12
|
+
$ cd MyProjectRoot # The directory containing your MyProject.xcodeproj or MyProjects.xcworkspace
|
|
13
|
+
$ rxcode init
|
|
14
|
+
$ bundle install # optional, though recommended
|
|
15
|
+
|
|
16
|
+
This will bootstrap your XCode project with support for writing utility scripts (a.k.a. 'tasks') with Rake, testing your
|
|
17
|
+
code using MacRuby & RSpec, and managing Ruby library dependencies with Bundler.
|
|
18
|
+
|
|
19
|
+
To see what tasks RXCode provides by default, try the following command:
|
|
20
|
+
|
|
21
|
+
$ rake -T
|
|
22
|
+
|
|
23
|
+
## Testing Objective-C Code
|
|
24
|
+
|
|
25
|
+
RXCode brings the ease of BDD-style testing to Objective-C, allowing you to write tests for your Objective-C classes
|
|
26
|
+
using MacRuby and RSpec 2. While writing specs in MacRuby and RSpec provides a significant productivity boost, you will
|
|
27
|
+
want to review the following pros and cons of this approach:
|
|
28
|
+
|
|
29
|
+
**Pros**
|
|
30
|
+
|
|
31
|
+
* Quickly write BDD-style specs using RSpec's clear and concise DSL.
|
|
32
|
+
|
|
33
|
+
* Run just a subset of your entire suite easily using the `rspec` command, or from within TextMate.
|
|
34
|
+
|
|
35
|
+
* Run specs from the command-line using a provided Rake task, or with the `rspec` command.
|
|
36
|
+
|
|
37
|
+
**Cons**
|
|
38
|
+
|
|
39
|
+
* There is no way to run the tests under iOS, let alone test against specific iOS SDKs.
|
|
40
|
+
|
|
41
|
+
* MacRuby and RSpec must run in a garbage-collected environment -- memory leaks will not show up in tests.
|
|
42
|
+
|
|
43
|
+
* You cannot use XCode's debugger when running your tests.
|
|
44
|
+
|
|
45
|
+
* MacRuby provides a very convenient syntax for calling Objective-C code from Ruby, but handling C-level constructs
|
|
46
|
+
can be cumbersome.
|
|
47
|
+
|
|
48
|
+
Some of these may be addressed in future releases, or by other tools.
|
|
49
|
+
|
|
50
|
+
### Running Specs
|
|
51
|
+
|
|
52
|
+
Running your specs is easy from the command line:
|
|
53
|
+
|
|
54
|
+
$ macrake
|
|
55
|
+
|
|
56
|
+
And that's it. By default all your specs will be run. You should try this soon after you initialize your project to make
|
|
57
|
+
sure MacRuby and RSpec are working before you write your specs.
|
|
58
|
+
|
|
59
|
+
If you want to run specific specs, or customize the run at all, you should use the `rspec` command provided by RSpec:
|
|
60
|
+
|
|
61
|
+
$ rspec --format html path/to/file_spec.rb
|
|
62
|
+
|
|
63
|
+
You can also run the specs with little or no work from any editor or IDE that supports RSpec, such as TextMate. The
|
|
64
|
+
RSpec TextMate bundle works great, and provides a way to run focused tests quickly.
|
|
65
|
+
|
|
66
|
+
### Configuring Your Project to Allow Testing with RSpec
|
|
67
|
+
|
|
68
|
+
Now that you can run specs, you'd like to move on and actually write specs for your own code. In order to test your code
|
|
69
|
+
using MacRuby+RSpec, the code you want to test must be added to an Objective-C framework that MacRuby can load
|
|
70
|
+
dynamically. If you are writing an app for iPhone or iPad, this means you can't test any iOS-specific behavior.
|
|
71
|
+
|
|
72
|
+
In practice though, there's often a lot of model-related code in iOS projects that can be extracted and tested
|
|
73
|
+
independently within MacRuby. This also enforces a clean separation between model and view code, as well as ensuring
|
|
74
|
+
that this code is cross-platform.
|
|
75
|
+
|
|
76
|
+
1. Create a 'Cocoa Framework' target and add whatever code you'd like to test to it. Make sure header files are public
|
|
77
|
+
or private, so they will be included in the framework and a Bridge Support file can be created (see #3 below).
|
|
78
|
+
|
|
79
|
+
2. Update the framework target's build settings so that garbage collection is supported.
|
|
80
|
+
|
|
81
|
+
3. Append a 'Run Script' build phase to the target, with the following script:
|
|
82
|
+
|
|
83
|
+
rake rxcode:generate_bridgesupport_file
|
|
84
|
+
|
|
85
|
+
This rake task will generate a BridgeSupport file from the framework, which MacRuby uses to understand method
|
|
86
|
+
signatures and return values. Without this step, any method that returns a BOOL, for example, would be seen by
|
|
87
|
+
MacRuby as a plain integer.
|
|
88
|
+
|
|
89
|
+
4. Build the framework target, and ensure that no build errors occur.
|
|
90
|
+
|
|
91
|
+
5. Open the spec/spec_helper.rb file and require the framework like so:
|
|
92
|
+
|
|
93
|
+
RXCode.framework('YourFrameworkName')
|
|
94
|
+
|
|
95
|
+
This will cause MacRuby to load the framework and make it available to your specs. The `spec_helper.rb` contains
|
|
96
|
+
inline comments describing in detail how to load different types of frameworks.
|
|
97
|
+
|
|
98
|
+
6. Run the specs again, ensuring that your framework is loaded and RSpec completes without error.
|
|
99
|
+
|
|
100
|
+
### Writing Specs
|
|
101
|
+
|
|
102
|
+
Now that you're able to load your Objective-C framework into MacRuby and run RSpec, it's time to write some specs.
|
|
103
|
+
RXCode's rake tasks will automatically discover any specs you place in a location matching this file glob:
|
|
104
|
+
`./**/Specs/**/*_spec.rb`. Since XCode 4 creates a separate directory for each target, the expected project layout looks
|
|
105
|
+
like this:
|
|
106
|
+
|
|
107
|
+
> MyProject
|
|
108
|
+
> MyFramework
|
|
109
|
+
- Info.plist
|
|
110
|
+
- MyFrameworkClass.h
|
|
111
|
+
- MyFrameworkClass.m
|
|
112
|
+
> Specs
|
|
113
|
+
- MyFrameworkClass_spec.rb
|
|
114
|
+
- MyProject.xcodeproj
|
|
115
|
+
> spec
|
|
116
|
+
- spec_helper.rb
|
|
117
|
+
> support
|
|
118
|
+
|
|
119
|
+
## Ruby Versions & Bundler
|
|
120
|
+
|
|
121
|
+
RXCode has been designed to run under Ruby 1.8.7, 1.9.2, as well as MacRuby. This allows you to write Rake tasks that
|
|
122
|
+
can be integrated into a Run Script build phase in XCode, as well as a scheme's pre- and post- actions. However, only
|
|
123
|
+
MacRuby is capable of testing your Objective-C code.
|
|
124
|
+
|
|
125
|
+
Because you will be running RXCode under multiple rubies, using Bundler can really help manage installing all required
|
|
126
|
+
gems.
|
|
127
|
+
|
|
128
|
+
**NOTE**: Bundler versions prior to 1.0.15 had an issue that caused the `exec` and `open` commands fail under MacRuby.
|
|
129
|
+
Make sure that you have the latest bundler installed.
|
|
4
130
|
|
|
5
131
|
## Copyright
|
|
6
132
|
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.0.
|
|
1
|
+
0.0.6
|
|
@@ -1,20 +1,28 @@
|
|
|
1
|
-
require 'rspec/core/rake_task'
|
|
2
1
|
require 'rxcode/spec/rake_ext'
|
|
3
2
|
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
begin
|
|
4
|
+
require 'rspec/core/rake_task'
|
|
5
|
+
rescue LoadError => e
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
if defined?(::RSpec::Core::RakeTask)
|
|
9
|
+
|
|
10
|
+
module RXCode
|
|
11
|
+
module Spec
|
|
6
12
|
|
|
7
|
-
|
|
13
|
+
class RakeTask < ::RSpec::Core::RakeTask
|
|
8
14
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
15
|
+
def initialize(*args)
|
|
16
|
+
super do |t|
|
|
17
|
+
t.pattern = "./**/Specs/**/*_spec.rb"
|
|
12
18
|
|
|
13
|
-
|
|
19
|
+
yield t if block_given?
|
|
20
|
+
end
|
|
14
21
|
end
|
|
22
|
+
|
|
15
23
|
end
|
|
16
24
|
|
|
17
25
|
end
|
|
26
|
+
end
|
|
18
27
|
|
|
19
|
-
end
|
|
20
28
|
end
|
data/lib/rxcode/tasks/spec.rb
CHANGED
|
@@ -1,3 +1,24 @@
|
|
|
1
1
|
require 'rxcode/spec/rake_task'
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
desc %{Run specs using MacRuby and RSpec}
|
|
4
|
+
if defined?(MACRUBY_VERSION)
|
|
5
|
+
|
|
6
|
+
if defined?(RXCode::Spec::RakeTask)
|
|
7
|
+
|
|
8
|
+
RXCode::Spec::RakeTask.new("rxcode:spec")
|
|
9
|
+
|
|
10
|
+
else
|
|
11
|
+
|
|
12
|
+
task 'rxcode:spec' do
|
|
13
|
+
raise "RSpec could not be found. Please install it to run specs"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
else
|
|
19
|
+
|
|
20
|
+
task 'rxcode:spec' do
|
|
21
|
+
raise "Testing with RSpec requires MacRuby."
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
metadata
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: rxcode
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease:
|
|
5
|
-
version: 0.0.
|
|
5
|
+
version: 0.0.6
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
8
8
|
- Christian Niles
|
|
@@ -163,7 +163,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
163
163
|
requirements:
|
|
164
164
|
- - ">="
|
|
165
165
|
- !ruby/object:Gem::Version
|
|
166
|
-
hash:
|
|
166
|
+
hash: 1093595179750362956
|
|
167
167
|
segments:
|
|
168
168
|
- 0
|
|
169
169
|
version: "0"
|