ib 0.4.0 → 0.4.1
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.
- 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
|
-
[](https://travis-ci.org/yury/ib)
|
6
|
+
[](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
|