ib 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/ib/dependency_resolver.rb +44 -42
- data/lib/ib/generator.rb +2 -2
- data/lib/ib/generator/rendering_helper.rb +0 -8
- data/lib/ib/generator/templates/Stubs.h.erb +13 -13
- data/lib/ib/generator/templates/Stubs.m.erb +3 -3
- data/lib/ib/oc_interface.rb +63 -0
- data/lib/ib/parser.rb +2 -8
- data/lib/ib/version.rb +1 -1
- data/spec/fixtures/dependency_test/add_button.rb +2 -0
- data/spec/fixtures/dependency_test/app_delegate.rb +5 -0
- data/spec/fixtures/dependency_test/base_view.rb +2 -0
- data/spec/fixtures/dependency_test/sub_class_2.rb +1 -0
- data/spec/fixtures/dependency_test/sub_view_1.rb +6 -0
- data/spec/fixtures/dependency_test/ui_my_web_view.rb +2 -0
- data/spec/lib/ib/dependency_resolver_spec.rb +97 -23
- data/spec/lib/ib/generator_spec.rb +59 -2
- data/spec/lib/ib/oc_interface_spec.rb +70 -0
- data/spec/lib/ib/parser_spec.rb +7 -7
- metadata +15 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7b752f7f0c21e08af52130f46871d317f331eddf
|
4
|
+
data.tar.gz: 852fbda61f72e63f5c149cf0781c882db013099c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3ec9c8ebd0f1f41db37f27da4cc3c97d697d01dc4f03415a7ad6df4d4b20aa7dcfa5d73dcff46628027b0d17cf00ef57c4af6c349f798bb61f198c5262e1bf61
|
7
|
+
data.tar.gz: 3d74f7834a96440c976d20e26bc7bb4d1655e8f824e9c8fd20fa1158981eb77b9cad6f801b5a6567f9cbf807467b897c032b79513125c5df705b4c8cec3f2ab7
|
data/README.md
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
RubyMotion interface builder support (yes, with outlets)
|
4
4
|
|
5
5
|
<a href='http://spellhub.com/projects/project/7'><img src="http://spellhub.com/projects/status/7" height="18"></a>
|
6
|
-
[![Build Status](https://travis-ci.org/yury/ib.png)](https://travis-ci.org/yury/ib)
|
6
|
+
[![Build Status](https://travis-ci.org/yury/ib.png?branch=master)](https://travis-ci.org/yury/ib)
|
7
7
|
|
8
8
|
[**Change Log**](https://github.com/yury/ib/wiki/Change-Log)
|
9
9
|
|
@@ -13,24 +13,56 @@ module IB
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
-
|
16
|
+
module TSortable
|
17
|
+
def to_node
|
18
|
+
sub_class_dependencies_nodes = sub_class_dependencies.inject({}) do |sum, i|
|
19
|
+
sum.merge!({ i => [] })
|
20
|
+
end
|
21
|
+
|
22
|
+
(super_class ? node_with_super_class : node_without_super_class).
|
23
|
+
merge(sub_class_dependencies_nodes)
|
24
|
+
end
|
25
|
+
|
26
|
+
def node_with_super_class
|
27
|
+
{
|
28
|
+
sub_class => sub_class_dependencies,
|
29
|
+
super_class => [],
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
def node_without_super_class
|
34
|
+
{ sub_class => sub_class_dependencies }
|
35
|
+
end
|
36
|
+
|
37
|
+
def merge!(a, b)
|
38
|
+
b.each do |k, v|
|
39
|
+
if a.key?(k)
|
40
|
+
a[k].concat(v)
|
41
|
+
else
|
42
|
+
a[k] = v
|
43
|
+
end
|
44
|
+
end
|
45
|
+
a
|
46
|
+
end
|
47
|
+
module_function :merge!
|
48
|
+
end
|
49
|
+
|
50
|
+
attr_reader :dependency_graph, :files
|
17
51
|
|
18
52
|
def initialize(files)
|
19
53
|
@files = files
|
20
|
-
@
|
54
|
+
@dependency_graph = struct_class_dependency_graph
|
21
55
|
end
|
22
56
|
|
23
57
|
def sort_classes
|
24
|
-
@
|
58
|
+
@dependency_graph.tsort
|
25
59
|
end
|
26
60
|
|
27
61
|
def sort_files
|
28
62
|
sort_classes.map do |klass|
|
29
|
-
files.select do |file,
|
30
|
-
|
31
|
-
end.
|
32
|
-
end.map do |file, _|
|
33
|
-
file
|
63
|
+
files.select do |file, interfaces|
|
64
|
+
interfaces.any? {|i| i.has_sub_class?(klass) }
|
65
|
+
end.keys[0]
|
34
66
|
end.uniq.compact
|
35
67
|
end
|
36
68
|
|
@@ -43,41 +75,11 @@ module IB
|
|
43
75
|
end
|
44
76
|
|
45
77
|
private
|
46
|
-
def
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
def has_super_class?(class_definition)
|
53
|
-
class_definition[:class][0].size == 2
|
54
|
-
end
|
55
|
-
|
56
|
-
def struct_class_node
|
57
|
-
list_of_hash = @files.map do |file, class_definitions|
|
58
|
-
class_definitions.map do |class_definition| create_node(class_definition) end
|
59
|
-
end.flatten
|
60
|
-
|
61
|
-
list_of_hash.inject(TSortHash.new) do |sum, x|
|
62
|
-
sum.merge!(x)
|
78
|
+
def struct_class_dependency_graph
|
79
|
+
nodes = @files.values.flatten.map {|i| i.extend TSortable }.map(&:to_node)
|
80
|
+
nodes.inject(TSortHash.new) do |sum, x|
|
81
|
+
TSortable.merge!(sum, x)
|
63
82
|
end
|
64
83
|
end
|
65
|
-
|
66
|
-
def create_node(class_definition)
|
67
|
-
has_super_class?(class_definition) ?
|
68
|
-
node_with_super_class(class_definition):
|
69
|
-
node_without_super_class(class_definition)
|
70
|
-
end
|
71
|
-
|
72
|
-
def node_with_super_class(class_definition)
|
73
|
-
{
|
74
|
-
class_definition[:class][0][0] => [class_definition[:class][0][1]],
|
75
|
-
class_definition[:class][0][1] => [],
|
76
|
-
}
|
77
|
-
end
|
78
|
-
|
79
|
-
def node_without_super_class(class_definition)
|
80
|
-
{ class_definition[:class][0][0] => [] }
|
81
|
-
end
|
82
84
|
end
|
83
85
|
end
|
data/lib/ib/generator.rb
CHANGED
@@ -6,7 +6,7 @@ class IB::Generator
|
|
6
6
|
def initialize motion_template_type
|
7
7
|
# NOTE: motion_template_type equal to Motion::Project::App.template
|
8
8
|
# but, this class use its value for judging build platform.
|
9
|
-
@build_platform = motion_template_type
|
9
|
+
@build_platform = motion_template_type
|
10
10
|
end
|
11
11
|
|
12
12
|
def absolute_template_path path
|
@@ -20,7 +20,7 @@ class IB::Generator
|
|
20
20
|
|
21
21
|
def write files, dest
|
22
22
|
files = IB::Parser.new.find_all(files)
|
23
|
-
|
23
|
+
|
24
24
|
FileUtils.mkpath dest
|
25
25
|
|
26
26
|
File.open("#{dest}/Stubs.h", 'w') do |f|
|
@@ -19,14 +19,6 @@ module IB
|
|
19
19
|
@build_platform == :osx
|
20
20
|
end
|
21
21
|
|
22
|
-
def generate_type type
|
23
|
-
type == "id" ? type : "#{type} *"
|
24
|
-
end
|
25
|
-
|
26
|
-
def generate_action action
|
27
|
-
action[1] ? "#{action[0]}:(#{action[2] ? "#{action[2]}*" : 'id'}) #{action[1]}" : "#{action[0]}"
|
28
|
-
end
|
29
|
-
|
30
22
|
end
|
31
23
|
end
|
32
24
|
end
|
@@ -9,22 +9,22 @@
|
|
9
9
|
#import <Cocoa/Cocoa.h>
|
10
10
|
<% end %>
|
11
11
|
|
12
|
-
<% @files.
|
13
|
-
<%
|
14
|
-
@interface <%=
|
15
|
-
<% unless
|
16
|
-
<%
|
17
|
-
@property IBOutlet <%=
|
12
|
+
<% @files.each do |path, interfaces| %>
|
13
|
+
<% interfaces.each do |interface| %>
|
14
|
+
@interface <%= interface.sub_class + ": " + interface.super_class %>
|
15
|
+
<% unless interface.outlets.empty? %><%= "\n"%><% end %>
|
16
|
+
<% interface.outlets.each do |outlet| %>
|
17
|
+
@property IBOutlet <%= outlet.formated_type %> <%= outlet.variable %>;
|
18
18
|
<% end %>
|
19
|
-
<% unless
|
20
|
-
<%
|
21
|
-
@property IBOutletCollection(<%= type %>) NSArray * <%=
|
19
|
+
<% unless interface.outlets.empty? %><%= "\n"%><% end %>
|
20
|
+
<% interface.outlet_collections.each do|outlet_collection| %>
|
21
|
+
@property IBOutletCollection(<%= outlet_collection.type %>) NSArray * <%= outlet_collection.variable %>;
|
22
22
|
<% end %>
|
23
|
-
<% unless
|
24
|
-
<%
|
25
|
-
-(IBAction) <%=
|
23
|
+
<% unless interface.outlet_collections.empty? %><%= "\n"%><% end %>
|
24
|
+
<% interface.actions.each do |action| %>
|
25
|
+
-(IBAction) <%= action.to_declare %>;
|
26
26
|
<% end %>
|
27
|
-
<% unless
|
27
|
+
<% unless interface.actions.empty? %><%= "\n"%><% end %>
|
28
28
|
@end
|
29
29
|
|
30
30
|
<% end; end %>
|
@@ -3,9 +3,9 @@
|
|
3
3
|
|
4
4
|
#import "Stubs.h"
|
5
5
|
|
6
|
-
<% @files.map do |path,
|
7
|
-
<%
|
8
|
-
@implementation <%=
|
6
|
+
<% @files.map do |path, interfaces| %>
|
7
|
+
<% interfaces.each do |interface| %>
|
8
|
+
@implementation <%= interface[:class][0][0] %>
|
9
9
|
@end
|
10
10
|
|
11
11
|
<% end; end; %>
|
@@ -0,0 +1,63 @@
|
|
1
|
+
class IB::OCInterface
|
2
|
+
attr_reader :sub_class, :super_class, :outlets,
|
3
|
+
:outlet_collections, :actions, :path
|
4
|
+
|
5
|
+
class Outlet < Struct.new(:variable, :type);
|
6
|
+
def formated_type
|
7
|
+
type == "id" ? type : "#{type} *"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class OutletCollection < Struct.new(:variable, :type); end
|
12
|
+
|
13
|
+
class Action < Struct.new(:variable, :arg, :return_type)
|
14
|
+
def to_declare
|
15
|
+
arg ? "#{variable}:(#{return_type ? "#{return_type}*" : 'id'}) #{arg}" : "#{variable}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize(params)
|
20
|
+
@params = params
|
21
|
+
@sub_class = params[:class][0][0]
|
22
|
+
@super_class = params[:class][0][1]
|
23
|
+
@outlets = create_instances(Outlet, params[:outlets])
|
24
|
+
@outlet_collections = create_instances(OutletCollection, params[:outlet_collections])
|
25
|
+
@actions = create_instances(Action, params[:actions])
|
26
|
+
@path = params[:path]
|
27
|
+
end
|
28
|
+
|
29
|
+
def [](key)
|
30
|
+
@params[key]
|
31
|
+
end
|
32
|
+
|
33
|
+
def super_class
|
34
|
+
@super_class ||
|
35
|
+
((@sub_class == 'AppDelegate') ? 'UIResponder <UIApplicationDelegate>' : 'NSObject')
|
36
|
+
end
|
37
|
+
|
38
|
+
def sub_class_dependencies
|
39
|
+
[
|
40
|
+
@super_class,
|
41
|
+
extract_types(@outlets),
|
42
|
+
extract_types(@outlet_collections)
|
43
|
+
].flatten.uniq.compact.select { |klass| klass != 'id' }
|
44
|
+
end
|
45
|
+
|
46
|
+
def has_class?(klass)
|
47
|
+
[sub_class, *sub_class_dependencies].any? { |k| k == klass }
|
48
|
+
end
|
49
|
+
|
50
|
+
def has_sub_class?(klass)
|
51
|
+
sub_class == klass
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
def create_instances(klass, array)
|
56
|
+
Array(array).map { |x| klass.new(*x) }
|
57
|
+
end
|
58
|
+
|
59
|
+
def extract_types(array)
|
60
|
+
Array(array).map { |x| x.type }.compact
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
data/lib/ib/parser.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'ib/dependency_resolver'
|
2
|
+
require 'ib/oc_interface'
|
2
3
|
|
3
4
|
class IB::Parser
|
4
5
|
NAME_REGEX = /[a-zA-Z][_a-zA-Z0-9]*/
|
@@ -51,14 +52,7 @@ class IB::Parser
|
|
51
52
|
|
52
53
|
info[:path] = path
|
53
54
|
|
54
|
-
|
55
|
-
if info[:outlets].empty? &&
|
56
|
-
info[:outlet_collections].empty? &&
|
57
|
-
info[:actions].empty? && info[:class][0][1].nil?
|
58
|
-
next
|
59
|
-
end
|
60
|
-
|
61
|
-
infos << info
|
55
|
+
infos << IB::OCInterface.new(info)
|
62
56
|
end
|
63
57
|
|
64
58
|
infos
|
data/lib/ib/version.rb
CHANGED
@@ -5,15 +5,15 @@ describe IB::DependencyResolver do
|
|
5
5
|
context 'init with simple dependency' do
|
6
6
|
before do
|
7
7
|
@files = {
|
8
|
-
'aaa.rb' => [{
|
8
|
+
'aaa.rb' => [IB::OCInterface.new({
|
9
9
|
class: [['SubClass1', 'SubClass2']],
|
10
|
-
}],
|
11
|
-
'bbb.rb' => [{
|
10
|
+
})],
|
11
|
+
'bbb.rb' => [IB::OCInterface.new({
|
12
12
|
class: [['SubClass2', 'SuperClass']],
|
13
|
-
}],
|
14
|
-
'ccc.rb' => [{
|
13
|
+
})],
|
14
|
+
'ccc.rb' => [IB::OCInterface.new({
|
15
15
|
class: [['SuperClass', 'UIViewController']],
|
16
|
-
}],
|
16
|
+
})],
|
17
17
|
}
|
18
18
|
end
|
19
19
|
|
@@ -21,7 +21,7 @@ describe IB::DependencyResolver do
|
|
21
21
|
it 'create a instance IB::DependencyResolver' do
|
22
22
|
resolver = IB::DependencyResolver.new(@files)
|
23
23
|
expect(
|
24
|
-
resolver.
|
24
|
+
resolver.dependency_graph.kind_of?(IB::DependencyResolver::TSortHash)
|
25
25
|
).to be_true
|
26
26
|
end
|
27
27
|
end
|
@@ -48,15 +48,20 @@ describe IB::DependencyResolver do
|
|
48
48
|
context 'init with no dependencies' do
|
49
49
|
before do
|
50
50
|
@files = {
|
51
|
-
'aaa.rb' => [
|
52
|
-
|
53
|
-
|
54
|
-
|
51
|
+
'aaa.rb' => [
|
52
|
+
IB::OCInterface.new({
|
53
|
+
class: [['SubClass1']],
|
54
|
+
}
|
55
|
+
)
|
56
|
+
],
|
57
|
+
'bbb.rb' => [IB::OCInterface.new({
|
55
58
|
class: [['SubClass2']],
|
56
|
-
|
57
|
-
|
59
|
+
})
|
60
|
+
],
|
61
|
+
'ccc.rb' => [IB::OCInterface.new({
|
58
62
|
class: [['SuperClass']],
|
59
|
-
|
63
|
+
})
|
64
|
+
],
|
60
65
|
}
|
61
66
|
end
|
62
67
|
|
@@ -65,7 +70,7 @@ describe IB::DependencyResolver do
|
|
65
70
|
resolver = IB::DependencyResolver.new(@files)
|
66
71
|
expect(
|
67
72
|
resolver.sort_classes
|
68
|
-
).to eq(['SubClass1', 'SubClass2', 'SuperClass'])
|
73
|
+
).to eq(['SubClass1', 'NSObject','SubClass2', 'SuperClass'])
|
69
74
|
end
|
70
75
|
end
|
71
76
|
|
@@ -82,13 +87,20 @@ describe IB::DependencyResolver do
|
|
82
87
|
context 'init with dependency in one file' do
|
83
88
|
before do
|
84
89
|
@files = {
|
85
|
-
'aaa.rb' => [
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
90
|
+
'aaa.rb' => [
|
91
|
+
IB::OCInterface.new({
|
92
|
+
class: [['SubClass1', 'SubClass2']],
|
93
|
+
}
|
94
|
+
),
|
95
|
+
IB::OCInterface.new({
|
96
|
+
class: [['SubClass2', 'SuperClass']],
|
97
|
+
}
|
98
|
+
),
|
99
|
+
IB::OCInterface.new({
|
100
|
+
class: [['SuperClass']],
|
101
|
+
}
|
102
|
+
),
|
103
|
+
],
|
92
104
|
}
|
93
105
|
end
|
94
106
|
|
@@ -97,7 +109,7 @@ describe IB::DependencyResolver do
|
|
97
109
|
resolver = IB::DependencyResolver.new(@files)
|
98
110
|
expect(
|
99
111
|
resolver.sort_classes
|
100
|
-
).to eq(['SuperClass', 'SubClass2', 'SubClass1'])
|
112
|
+
).to eq(['SuperClass', 'SubClass2', 'SubClass1', 'NSObject'])
|
101
113
|
end
|
102
114
|
end
|
103
115
|
|
@@ -110,4 +122,66 @@ describe IB::DependencyResolver do
|
|
110
122
|
end
|
111
123
|
end
|
112
124
|
end
|
125
|
+
|
126
|
+
context 'init with complex dependencies' do
|
127
|
+
before do
|
128
|
+
@files = {
|
129
|
+
'aaa.rb' => [
|
130
|
+
IB::OCInterface.new({
|
131
|
+
class: [['SubClass1', 'SubClass2']],
|
132
|
+
outlets: [
|
133
|
+
["greenLabel", "UIGreenLabel"],
|
134
|
+
],
|
135
|
+
}
|
136
|
+
)
|
137
|
+
],
|
138
|
+
'bbb.rb' => [
|
139
|
+
IB::OCInterface.new({
|
140
|
+
class: [['SubClass2', 'SuperClass']],
|
141
|
+
}
|
142
|
+
)
|
143
|
+
],
|
144
|
+
'ccc.rb' => [
|
145
|
+
IB::OCInterface.new({
|
146
|
+
class: [['SuperClass', 'UIViewController']],
|
147
|
+
}
|
148
|
+
)
|
149
|
+
],
|
150
|
+
'ddd.rb' => [
|
151
|
+
IB::OCInterface.new({
|
152
|
+
class: [['UIGreenLabel', 'UIView']],
|
153
|
+
}
|
154
|
+
)
|
155
|
+
],
|
156
|
+
}
|
157
|
+
end
|
158
|
+
|
159
|
+
describe 'new' do
|
160
|
+
it 'create a instance IB::DependencyResolver' do
|
161
|
+
resolver = IB::DependencyResolver.new(@files)
|
162
|
+
expect(
|
163
|
+
resolver.dependency_graph.kind_of?(IB::DependencyResolver::TSortHash)
|
164
|
+
).to be_true
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
describe 'sort_classes' do
|
169
|
+
it 'create a instance IB::DependencyResolver' do
|
170
|
+
resolver = IB::DependencyResolver.new(@files)
|
171
|
+
expect(
|
172
|
+
resolver.sort_classes
|
173
|
+
).to eq(['UIViewController', 'SuperClass', 'SubClass2', 'UIView', 'UIGreenLabel', 'SubClass1'])
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
describe 'sort_files' do
|
178
|
+
it 'create a instance IB::DependencyResolver' do
|
179
|
+
resolver = IB::DependencyResolver.new(@files)
|
180
|
+
expect(
|
181
|
+
resolver.sort_files
|
182
|
+
).to eq(['ccc.rb', 'bbb.rb', 'ddd.rb', 'aaa.rb'])
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
113
187
|
end
|
@@ -15,7 +15,7 @@ describe IB::Generator do
|
|
15
15
|
#import <CoreData/CoreData.h>
|
16
16
|
#import <UIKit/UIKit.h>
|
17
17
|
|
18
|
-
@interface AppDelegate
|
18
|
+
@interface AppDelegate: UIResponder <UIApplicationDelegate>
|
19
19
|
|
20
20
|
@property IBOutlet UIWindow * window;
|
21
21
|
@property IBOutlet UINavigationController * navigationController;
|
@@ -50,6 +50,9 @@ describe IB::Generator do
|
|
50
50
|
@interface AnotherView: EmptyView
|
51
51
|
@end
|
52
52
|
|
53
|
+
@interface SimpleClass: NSObject
|
54
|
+
@end
|
55
|
+
|
53
56
|
OBJC
|
54
57
|
end
|
55
58
|
|
@@ -65,7 +68,7 @@ OBJC
|
|
65
68
|
#import <CoreData/CoreData.h>
|
66
69
|
#import <Cocoa/Cocoa.h>
|
67
70
|
|
68
|
-
@interface AppDelegate
|
71
|
+
@interface AppDelegate: UIResponder <UIApplicationDelegate>
|
69
72
|
|
70
73
|
@property IBOutlet UIWindow * window;
|
71
74
|
@property IBOutlet UINavigationController * navigationController;
|
@@ -100,6 +103,9 @@ OBJC
|
|
100
103
|
@interface AnotherView: EmptyView
|
101
104
|
@end
|
102
105
|
|
106
|
+
@interface SimpleClass: NSObject
|
107
|
+
@end
|
108
|
+
|
103
109
|
OBJC
|
104
110
|
end
|
105
111
|
|
@@ -126,6 +132,57 @@ OBJC
|
|
126
132
|
@implementation AnotherView
|
127
133
|
@end
|
128
134
|
|
135
|
+
@implementation SimpleClass
|
136
|
+
@end
|
137
|
+
|
129
138
|
OBJC
|
130
139
|
end
|
140
|
+
|
141
|
+
it "generates stubs header with ios platform of dependency_test fixtures" do
|
142
|
+
files = IB::Parser.new.find_all("spec/fixtures/dependency_test")
|
143
|
+
stubs = IB::Generator.new(:ios).render_stub_file('generator/templates/Stubs.h.erb', files)
|
144
|
+
|
145
|
+
stubs.should == <<-OBJC
|
146
|
+
// Generated by IB v#{IB::VERSION} gem. Do not edit it manually
|
147
|
+
// Run `rake ib:open` to refresh
|
148
|
+
|
149
|
+
#import <Foundation/Foundation.h>
|
150
|
+
#import <CoreData/CoreData.h>
|
151
|
+
#import <UIKit/UIKit.h>
|
152
|
+
|
153
|
+
@interface BaseView: NSObject
|
154
|
+
@end
|
155
|
+
|
156
|
+
@interface AddButton: BaseView
|
157
|
+
@end
|
158
|
+
|
159
|
+
@interface AppDelegate: UIResponder <UIApplicationDelegate>
|
160
|
+
@end
|
161
|
+
|
162
|
+
@interface SuperClass: UIViewController
|
163
|
+
@end
|
164
|
+
|
165
|
+
@interface SubView1: UIView
|
166
|
+
|
167
|
+
@property IBOutlet AddButton * button;
|
168
|
+
|
169
|
+
-(IBAction) action_test:(id) sender;
|
170
|
+
|
171
|
+
@end
|
172
|
+
|
173
|
+
@interface SubClass2: SuperClass
|
174
|
+
|
175
|
+
@property IBOutlet SubView1 * banner;
|
176
|
+
|
177
|
+
@end
|
178
|
+
|
179
|
+
@interface SubClass1: SubClass2
|
180
|
+
@end
|
181
|
+
|
182
|
+
@interface UIMyWebView: UIWebView
|
183
|
+
@end
|
184
|
+
|
185
|
+
OBJC
|
186
|
+
end
|
187
|
+
|
131
188
|
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'ib/oc_interface'
|
3
|
+
|
4
|
+
describe IB::OCInterface do
|
5
|
+
context 'instantiate' do
|
6
|
+
before do
|
7
|
+
@params = {
|
8
|
+
class: [["CustomView", "UIView"]],
|
9
|
+
outlets: [
|
10
|
+
["greenLabel", "UIGreenLabel"],
|
11
|
+
["redLabel", "UILabel"],
|
12
|
+
["untyped_label", "id"],
|
13
|
+
["yellowLabel", "id"]
|
14
|
+
],
|
15
|
+
outlet_collections: [
|
16
|
+
["greenLabelCollection", "UIGreenLabel"],
|
17
|
+
["redLabelCollection", "UILabel"],
|
18
|
+
["untyped_label_collection", "id"],
|
19
|
+
["yellowLabelCollection", "id"]
|
20
|
+
],
|
21
|
+
actions: [
|
22
|
+
["someAction", "sender", nil],
|
23
|
+
["segueAction", "sender", "UIStoryboardSegue"],
|
24
|
+
["anotherAction", "button", nil],
|
25
|
+
["actionWithComment", "sender", nil],
|
26
|
+
["actionWithBrackets", "sender", nil],
|
27
|
+
["actionWithoutArgs", nil, nil],
|
28
|
+
["actionWithDefaultedArgs", "sender", nil]
|
29
|
+
]
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
let(:subject) { IB::OCInterface.new(@params) }
|
34
|
+
describe '#new' do
|
35
|
+
it 'should return object' do
|
36
|
+
should be_kind_of(IB::OCInterface)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '#[]' do
|
41
|
+
it 'should be able to access original params' do
|
42
|
+
expect(subject[:class][0][0]).to eq('CustomView')
|
43
|
+
expect(subject[:class][0][1]).to eq('UIView')
|
44
|
+
expect(subject[:outlets]).to be_kind_of(Array)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe '#super_class' do
|
49
|
+
it 'should return super class' do
|
50
|
+
expect(subject.super_class).to eq('UIView')
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe '#dependency_classes' do
|
55
|
+
it 'should return super class' do
|
56
|
+
expect(subject.sub_class_dependencies).to be_kind_of(Array)
|
57
|
+
expect(subject.sub_class_dependencies).to eq(%w{
|
58
|
+
UIView UIGreenLabel UILabel
|
59
|
+
})
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe '#has_class?' do
|
64
|
+
it 'should return super class' do
|
65
|
+
expect(subject.has_class?('UIView')).to be_true
|
66
|
+
expect(subject.has_class?('FooBarDummyView')).to be_false
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
data/spec/lib/ib/parser_spec.rb
CHANGED
@@ -29,17 +29,17 @@ describe IB::Parser do
|
|
29
29
|
]
|
30
30
|
end
|
31
31
|
|
32
|
-
it "
|
33
|
-
IB::Parser.new.find("spec/fixtures/common/simple_class.rb").length.should ==
|
32
|
+
it "can output simple classes" do
|
33
|
+
IB::Parser.new.find("spec/fixtures/common/simple_class.rb").length.should == 1
|
34
34
|
end
|
35
35
|
|
36
36
|
it "finds all infos" do
|
37
37
|
infos = IB::Parser.new.find_all("spec/fixtures/dependency_test")
|
38
|
-
|
38
|
+
infos.values.each do |vals|
|
39
|
+
vals.each do |v|
|
40
|
+
expect(v).to be_kind_of(IB::OCInterface)
|
41
|
+
end
|
42
|
+
end
|
39
43
|
end
|
40
44
|
|
41
|
-
it "finds all sorted infos" do
|
42
|
-
infos = IB::Parser.new.find_all("spec/fixtures/dependency_test")
|
43
|
-
expect(infos.size).to eq 3
|
44
|
-
end
|
45
45
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yury Korolev
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-10-
|
12
|
+
date: 2013-10-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: xcodeproj
|
@@ -105,6 +105,7 @@ files:
|
|
105
105
|
- lib/ib/generator/rendering_helper.rb
|
106
106
|
- lib/ib/generator/templates/Stubs.h.erb
|
107
107
|
- lib/ib/generator/templates/Stubs.m.erb
|
108
|
+
- lib/ib/oc_interface.rb
|
108
109
|
- lib/ib/outlets.rb
|
109
110
|
- lib/ib/parser.rb
|
110
111
|
- lib/ib/project.rb
|
@@ -114,11 +115,17 @@ files:
|
|
114
115
|
- spec/fixtures/common/custom_view.rb
|
115
116
|
- spec/fixtures/common/empty_view.rb
|
116
117
|
- spec/fixtures/common/simple_class.rb
|
118
|
+
- spec/fixtures/dependency_test/add_button.rb
|
119
|
+
- spec/fixtures/dependency_test/app_delegate.rb
|
120
|
+
- spec/fixtures/dependency_test/base_view.rb
|
117
121
|
- spec/fixtures/dependency_test/sub_class_1.rb
|
118
122
|
- spec/fixtures/dependency_test/sub_class_2.rb
|
123
|
+
- spec/fixtures/dependency_test/sub_view_1.rb
|
119
124
|
- spec/fixtures/dependency_test/super_class.rb
|
125
|
+
- spec/fixtures/dependency_test/ui_my_web_view.rb
|
120
126
|
- spec/lib/ib/dependency_resolver_spec.rb
|
121
127
|
- spec/lib/ib/generator_spec.rb
|
128
|
+
- spec/lib/ib/oc_interface_spec.rb
|
122
129
|
- spec/lib/ib/parser_spec.rb
|
123
130
|
- spec/lib/ib/project_spec.rb
|
124
131
|
- spec/spec_helper.rb
|
@@ -153,11 +160,17 @@ test_files:
|
|
153
160
|
- spec/fixtures/common/custom_view.rb
|
154
161
|
- spec/fixtures/common/empty_view.rb
|
155
162
|
- spec/fixtures/common/simple_class.rb
|
163
|
+
- spec/fixtures/dependency_test/add_button.rb
|
164
|
+
- spec/fixtures/dependency_test/app_delegate.rb
|
165
|
+
- spec/fixtures/dependency_test/base_view.rb
|
156
166
|
- spec/fixtures/dependency_test/sub_class_1.rb
|
157
167
|
- spec/fixtures/dependency_test/sub_class_2.rb
|
168
|
+
- spec/fixtures/dependency_test/sub_view_1.rb
|
158
169
|
- spec/fixtures/dependency_test/super_class.rb
|
170
|
+
- spec/fixtures/dependency_test/ui_my_web_view.rb
|
159
171
|
- spec/lib/ib/dependency_resolver_spec.rb
|
160
172
|
- spec/lib/ib/generator_spec.rb
|
173
|
+
- spec/lib/ib/oc_interface_spec.rb
|
161
174
|
- spec/lib/ib/parser_spec.rb
|
162
175
|
- spec/lib/ib/project_spec.rb
|
163
176
|
- spec/spec_helper.rb
|