lanekit 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ## LaneKit
2
2
 
3
- LaneKit is a code generator for iOS Objective-C models for integration with RestKit. It includes support
3
+ LaneKit is an iOS Objective-C code generator of models and resource providers for integration with RestKit. It includes support
4
4
  for unit testing with SenTestingKit including fixtures and tests. LaneKit is a command line app written
5
5
  in Ruby and packaged as a Ruby Gem.
6
6
 
@@ -8,13 +8,13 @@ in Ruby and packaged as a Ruby Gem.
8
8
  - Questions? [Stack Overflow](http://stackoverflow.com/questions/tagged/lanekit) is the best place to find answers.
9
9
 
10
10
  ## Benefits
11
- * properly implemented models
11
+ * properly implemented models and resource providers
12
+ * easy integration with RestKit
12
13
  * consistent Objective-C code
13
14
  * unit tests
14
15
  * test fixtures in JSON and Objective-C
15
16
  * tested code
16
17
  * rapid development
17
- * easy integration with RestKit
18
18
  * enhanced productivity of junior developers
19
19
  * reduces dependency on senior developers
20
20
 
@@ -31,17 +31,21 @@ in Ruby and packaged as a Ruby Gem.
31
31
 
32
32
  ### Add a new model called Video to an existing Xcode project.
33
33
 
34
- $ lanekit generate model Video duration:string headline:string id:integer image:string location:string
35
-
36
- create Classes/Models
37
- create Classes/Tests/Fixtures
38
- create Classes/Tests/Models
39
- create Classes/Models/Video.h
40
- create Classes/Models/Video.m
41
- create Classes/Tests/Fixtures/VideoFixtures.h
42
- create Classes/Tests/Fixtures/VideoFixtures.m
43
- create Classes/Tests/Models/VideoTest.h
44
- create Classes/Tests/Models/VideoTest.m
34
+ $ lanekit generate model Video duration:string headline:string id:integer image:string location:string
35
+
36
+ create Classes/Models
37
+ create Classes/Tests/Fixtures
38
+ create Classes/Tests/Models
39
+ create Classes/Models/Contents.h
40
+ create Classes/Models/Contents.m
41
+ create Classes/Tests/Fixtures/ContentsFixtures.h
42
+ create Classes/Tests/Fixtures/ContentsFixtures.m
43
+ create Classes/Tests/Fixtures/ContentsFixtures.one.json
44
+ create Classes/Tests/Fixtures/ContentsFixtures.two.json
45
+ create Classes/Tests/Models/ContentsTest.h
46
+ create Classes/Tests/Models/ContentsTest.m
47
+ create Classes/Models/LKModel.h
48
+ create Classes/Models/LKModel.m
45
49
 
46
50
  and here is the Objective-C header file that was generated by LaneKit:
47
51
 
@@ -124,17 +128,100 @@ and here is the Objective-C .m file that was generated by LaneKit:
124
128
  @end
125
129
  ```
126
130
 
131
+ and here is the unit test fixtures file that was generated by LaneKit:
127
132
 
128
- ### Add a new model called Contents that contains a list of Videos and uses a relationship mapping.
133
+ ```objective-c
134
+ //
135
+ // VideoFixtures.m
136
+ //
137
+ // This model fixture was created on 2013-08-11 by LaneKit v0.2.0.
138
+ //
139
+
140
+ #import "VideoFixtures.h"
141
+
142
+ @implementation VideoFixtures
143
+
144
+ + (Video *)one
145
+ {
146
+ Video *video = Video.new;
147
+
148
+ video.duration = @"MyString";
149
+ video.headline = @"MyString";
150
+ video.id = [NSNumber numberWithInteger:1];
151
+ video.image = @"MyString";
152
+ video.itemDate = NSDate.new;
153
+ video.location = @"MyString";
154
+
155
+ return video;
156
+ }
157
+
158
+ + (Video *)two
159
+ {
160
+ Video *video = Video.new;
161
+
162
+ video.duration = @"MyString";
163
+ video.headline = @"MyString";
164
+ video.id = [NSNumber numberWithInteger:1];
165
+ video.image = @"MyString";
166
+ video.itemDate = NSDate.new;
167
+ video.location = @"MyString";
168
+
169
+ return video;
170
+ }
171
+
172
+ @end
129
173
  ```
130
- $ lanekit generate model contents contents:array:Video
131
- exist Classes/model
132
- create Classes/model/Contents.h
133
- create Classes/model/Contents.m
174
+
175
+ and here is the RestKit compatible JSON fixture file that was generated by LaneKit:
176
+
177
+ ```json
178
+ {
179
+ "video": {
180
+ "duration": "MyString",
181
+ "headline": "MyString",
182
+ "id": "1",
183
+ "image": "MyString",
184
+ "itemDate": "03/01/2012",
185
+ "location": "MyString"
186
+ }
187
+ }
134
188
  ```
135
189
 
190
+ and here is a unit test that was generated in Models/VideoTest.m by LaneKit:
191
+
192
+ ```objective-c
193
+ - (void)testVideoNewOne
194
+ {
195
+ Video *video = VideoFixtures.one;
196
+ STAssertNotNil(video, @"video is nil");
197
+
198
+ STAssertTrue([video.duration isEqualToString:@"MyString"], @"duration not correct value");
199
+ STAssertTrue([video.headline isEqualToString:@"MyString"], @"headline not correct value");
200
+ STAssertTrue(video.id.integerValue == [NSNumber numberWithInteger:1].integerValue, @"id not [NSNumber numberWithInteger:1]");
201
+ STAssertTrue([video.image isEqualToString:@"MyString"], @"image not correct value");
202
+ STAssertNotNil(video.itemDate, @"itemDate is nil");
203
+ }
204
+ ```
205
+
206
+ ### Add a new model called Contents that contains a list of Videos and uses a relationship mapping.
207
+
208
+ $ lanekit generate model contents contents:array:Video
209
+ exist Classes/model
210
+ create Classes/model/Contents.h
211
+ create Classes/model/Contents.m
212
+
213
+ ### Add a new resource provider called Contents.
214
+
215
+ $ lanekit generate provider Contents Contents http://scores.espn.go.com/allsports/scorecenter/v2/videos/build?sport=top
216
+ create Classes/Controllers
217
+ create Classes/Controllers/LKResourceProvider.h
218
+ create Classes/Controllers/LKResourceProvider.m
219
+ create Classes/Controllers/ContentsProvider.h
220
+ create Classes/Controllers/ContentsProvider.m
221
+
136
222
  ### Sample App
137
- The SportsFrames app is a fully functional sample app created to demonstrate the use of LaneKit in a real world app.
223
+ The SportsFrames app is a fully functional sample app using RestKit created to demonstrate the use of LaneKit in a real world app. It
224
+ has models and resource providers that are generated from LaneKit.
138
225
  Download the code from [GitHub](https://github.com/larryaasen/SportsFrames).
139
226
 
140
227
  ## Credits
@@ -0,0 +1,137 @@
1
+ module LaneKit
2
+ class Generate < Thor
3
+
4
+ include Thor::Actions
5
+
6
+ desc "model [options] NAME [attributes]", "Generates an Objective-C model for RestKit including unit tests"
7
+ long_desc <<-LONGDESC
8
+ Generates the Objective-C code for a model that is compatible with RestKit. It also generates test fixtures and unit tests.\n
9
+ NAME: the name of the model\n
10
+ [attributes] name:type:relationship, name:type:relationship, ...\n
11
+ where type is [date|integer|string|<class_name>] and relationship (optional) is the name of another class.
12
+ LONGDESC
13
+
14
+ def model(model_name, *attributes)
15
+ @using_core_data = options[:use_core_data]
16
+ #puts " using Core Data: #{@using_core_data}"
17
+ #puts " name: #{model_name}"
18
+
19
+ @model_name = LaneKit.derive_model_name(model_name)
20
+
21
+ @model_file_name = LaneKit.derive_file_name(@model_name)
22
+ @model_fixtures_file_name = "#{@model_file_name}Fixtures"
23
+ @model_tests_file_name = "#{@model_file_name}Test"
24
+
25
+ @class_name = LaneKit.derive_class_name(@model_name)
26
+
27
+ @attributes = []
28
+ @any_relationships = false
29
+
30
+ attributes.each {|attribute|
31
+ name, type, relationship = attribute.split(":")
32
+ objective_c_type = LaneKit.objective_c_type(type)
33
+ @attributes << {
34
+ :type => type,
35
+ :name => name,
36
+ :objective_c_type => objective_c_type,
37
+ :relationship => relationship,
38
+ :relationship_fixtures_file_name => "#{relationship}Fixtures",
39
+ :fixture_json => LaneKit.objective_c_type_fixture_json(type),
40
+ :fixture_value => LaneKit.objective_c_type_fixture_value(type),
41
+ :unit_test_assert => LaneKit.objective_c_type_unit_test_assert(@model_name, name, type)
42
+ }
43
+ @any_relationships = relationship ? true : @any_relationships
44
+ }
45
+
46
+ self.initialize_model
47
+ self.create_model_folders
48
+ self.create_model_files
49
+ self.update_xcode_project
50
+ end
51
+
52
+ def self.source_root
53
+ File.dirname('./')
54
+ end
55
+
56
+ no_tasks {
57
+ def initialize_model
58
+ # Model Base Class
59
+ @model_base_name = "LKModel"
60
+ @model_base_class_name = "LKModel"
61
+ @model_base_file_name = "LKModel"
62
+
63
+ @models_folder = "Classes/Models"
64
+ @tests_fixtures_folder = "Classes/Tests/Fixtures"
65
+ @tests_models_folder = "Classes/Tests/Models"
66
+
67
+ end
68
+
69
+ def source_paths
70
+ [@@template_folder]
71
+ end
72
+
73
+ def create_model_folders
74
+ empty_directory @models_folder
75
+ empty_directory @tests_fixtures_folder
76
+ empty_directory @tests_models_folder
77
+ end
78
+
79
+ def create_model_files
80
+ # 1) Create the Models
81
+ # Create the .h file
82
+ source = "model.h.erb"
83
+ target = File.join(@models_folder, "#{@model_file_name}.h")
84
+ template(source, target, @@template_opts)
85
+
86
+ # Create the .m file
87
+ source = "model.m.erb"
88
+ target = File.join(@models_folder, "#{@model_file_name}.m")
89
+ template(source, target, @@template_opts)
90
+
91
+ # 2) Create the Model Test Fixtures
92
+ # Create the .h file
93
+ source = "model_fixture.h.erb"
94
+ target = File.join(@tests_fixtures_folder, "#{@model_fixtures_file_name}.h")
95
+ template(source, target, @@template_opts)
96
+
97
+ # Create the .m file
98
+ source = "model_fixture.m.erb"
99
+ target = File.join(@tests_fixtures_folder, "#{@model_fixtures_file_name}.m")
100
+ template(source, target, @@template_opts)
101
+
102
+ # Create the one json file
103
+ source = "model_fixture.json.erb"
104
+ target = File.join(@tests_fixtures_folder, "#{@model_fixtures_file_name}.one.json")
105
+ template(source, target, @@template_opts)
106
+
107
+ # Create the two json file
108
+ source = "model_fixture.json.erb"
109
+ target = File.join(@tests_fixtures_folder, "#{@model_fixtures_file_name}.two.json")
110
+ template(source, target, @@template_opts)
111
+
112
+ # 3) Create the Model Tests
113
+ # Create the .h file
114
+ source = "model_test.h.erb"
115
+ target = File.join(@tests_models_folder, "#{@model_tests_file_name}.h")
116
+ template(source, target, @@template_opts)
117
+
118
+ # Create the .m file
119
+ source = "model_test.m.erb"
120
+ target = File.join(@tests_models_folder, "#{@model_tests_file_name}.m")
121
+ template(source, target, @@template_opts)
122
+
123
+ # 4) Create the base model
124
+ # Create the .h file
125
+ source = "model_base.h.erb"
126
+ target = File.join(@models_folder, "#{@model_base_file_name}.h")
127
+ template(source, target, @@template_opts)
128
+
129
+ # Create the .m file
130
+ source = "model_base.m.erb"
131
+ target = File.join(@models_folder, "#{@model_base_file_name}.m")
132
+ template(source, target, @@template_opts)
133
+ end
134
+ }
135
+ end
136
+ end
137
+
@@ -0,0 +1,82 @@
1
+ module LaneKit
2
+ class Generate
3
+
4
+ include Thor::Actions
5
+
6
+ desc "provider [options] NAME MODEL_NAME URL", "Generates an Objective-C resource provider for RestKit including unit tests"
7
+ long_desc <<-LONGDESC
8
+ Generates the Objective-C code for a resource provider that is compatible with RestKit. It also generates test fixtures and unit tests.\n
9
+ NAME: the name of the provider\n
10
+ MODEL_NAME: the name of the model\n
11
+ URL: the HTTP URL to the data\n
12
+ LONGDESC
13
+
14
+ def provider(name, model_name, url)
15
+ @using_core_data = options[:use_core_data]
16
+ #puts " using Core Data: #{@using_core_data}"
17
+ #puts " name: #{name}"
18
+ #puts " model_name: #{model_name}"
19
+ #puts " url: #{url}"
20
+
21
+ @provider_name = "#{LaneKit.derive_class_name(name)}Provider"
22
+ @model_name = LaneKit.derive_model_name(model_name)
23
+ @model_class_name = LaneKit.derive_class_name(@model_name)
24
+ @model_file_name = LaneKit.derive_file_name(@model_name)
25
+ @provider_url = url
26
+
27
+ self.initialize_provider
28
+ self.create_provider_folders
29
+ self.create_provider_files
30
+ end
31
+
32
+ def self.source_root
33
+ File.dirname('./')
34
+ end
35
+
36
+ no_commands do
37
+
38
+ def initialize_provider
39
+ @providers_folder = "Classes/Controllers"
40
+
41
+ # Resource Provider Base Class
42
+ @provider_base_name = "LKResourceProvider"
43
+ @provider_base_class_name = "LKResourceProvider"
44
+ @provider_base_file_name = "LKResourceProvider"
45
+
46
+ @provider_file_name = @provider_name
47
+ end
48
+
49
+ def source_paths
50
+ [@@template_folder]
51
+ end
52
+
53
+ def create_provider_folders
54
+ empty_directory @providers_folder
55
+ end
56
+
57
+ def create_provider_files
58
+ # 1) Create the base resource provider
59
+ # Create the .h file
60
+ source = "provider_base.h.erb"
61
+ target = File.join(@providers_folder, "#{@provider_base_file_name}.h")
62
+ template(source, target, @@template_opts)
63
+
64
+ # Create the .m file
65
+ source = "provider_base.m.erb"
66
+ target = File.join(@providers_folder, "#{@provider_base_file_name}.m")
67
+ template(source, target, @@template_opts)
68
+
69
+ # 2) Create the resource provider
70
+ # Create the .h file
71
+ source = "provider.h.erb"
72
+ target = File.join(@providers_folder, "#{@provider_file_name}.h")
73
+ template(source, target, @@template_opts)
74
+
75
+ # Create the .m file
76
+ source = "provider.m.erb"
77
+ target = File.join(@providers_folder, "#{@provider_file_name}.m")
78
+ template(source, target, @@template_opts)
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,24 @@
1
+ class LaneKit::Generate < Thor
2
+
3
+ @@lanekit_version = LaneKit::VERSION;
4
+ @@template_folder = File.expand_path('../../template', __FILE__)
5
+ @@generate_date = Date.today.to_s
6
+
7
+ no_tasks do
8
+ def update_xcode_project
9
+ xcworkspace_path = ""
10
+ Xcodeproj::Workspace.new_from_xcworkspace(xcworkspace_path)
11
+ end
12
+ end
13
+
14
+ @@template_opts = {
15
+ :command => LaneKit::CLI.command,
16
+ :generate_date => @@generate_date,
17
+ :lanekit_version => @@lanekit_version
18
+ }
19
+
20
+ require 'lanekit/generate/model'
21
+ require 'lanekit/generate/provider'
22
+
23
+ class_option :use_core_data, :type => :boolean, :default => false, :banner => "generate code compatible with Core Data (the default is false)", :aliases => "-c" # option --use_core_data=true
24
+ end
@@ -1,3 +1,3 @@
1
1
  module LaneKit
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
data/lib/lanekit.rb CHANGED
@@ -1,9 +1,9 @@
1
1
  require 'date'
2
2
  require 'thor'
3
3
  require 'xcodeproj'
4
- require 'lanekit/version'
5
4
  require 'active_support'
6
5
  require 'active_support/inflector'
6
+ require 'lanekit/version'
7
7
 
8
8
  module LaneKit
9
9
  @@objc_types = {
@@ -101,152 +101,35 @@ module LaneKit
101
101
  assert
102
102
  end
103
103
 
104
- module Generators
105
-
106
- class Generate < Thor
107
- include Thor::Actions
108
-
109
- desc "model NAME [attributes]", "Generates an Objective-C model for RestKit including unit tests"
110
- long_desc <<-LONGDESC
111
- Generates the Objective-C code for a model that is compatible with RestKit. It also generates test fixtures and unit tests.\n
112
- NAME: the name of the model\n
113
- [attributes] name:type:relationship, name:type:relationship, ...\n
114
- where type is [date|integer|string|<class_name>] and relationship (optional) is the name of another class.
115
- LONGDESC
116
-
117
- option :use_core_data, :type => :boolean, :default => false, :banner => "generate code compatible with Core Data", :aliases => :c # option --use_core_data=true
118
- def model(model_name, *attributes)
119
- @using_core_data = options[:use_core_data]
120
- puts " using Core Data: #{@using_core_data}"
121
-
122
- @model_name = LaneKit.derive_model_name(model_name)
123
-
124
- @model_file_name = LaneKit.derive_file_name(@model_name)
125
- @model_fixtures_file_name = "#{@model_file_name}Fixtures"
126
- @model_tests_file_name = "#{@model_file_name}Test"
104
+ end
127
105
 
128
- @class_name = LaneKit.derive_class_name(@model_name)
129
- @lanekit_version = VERSION;
130
-
131
- @attributes = []
132
- @any_relationships = false
133
-
134
- attributes.each {|attribute|
135
- name, type, relationship = attribute.split(":")
136
- objective_c_type = LaneKit.objective_c_type(type)
137
- @attributes << {
138
- :type => type,
139
- :name => name,
140
- :objective_c_type => objective_c_type,
141
- :relationship => relationship,
142
- :relationship_fixtures_file_name => "#{relationship}Fixtures",
143
- :fixture_json => LaneKit.objective_c_type_fixture_json(type),
144
- :fixture_value => LaneKit.objective_c_type_fixture_value(type),
145
- :unit_test_assert => LaneKit.objective_c_type_unit_test_assert(@model_name, name, type)
146
- }
147
- @any_relationships = relationship ? true : @any_relationships
148
- }
149
-
150
- script_name = File.basename($0)
151
- script_args = ARGV.join(' ')
106
+ module LaneKit
107
+ class CLI < Thor
152
108
 
153
- @command = "#{script_name} #{script_args}"
154
-
155
- self.initialize_stuff
156
- self.create_model_folders
157
- self.create_model_files @model_name
158
- self.update_xcode_project @model_name
159
- end
109
+ script_name = File.basename($0)
110
+ script_args = ARGV.join(' ')
111
+
112
+ @command = "#{script_name} #{script_args}"
160
113
 
161
- def self.source_root
162
- File.dirname('./')
114
+ no_commands do
115
+ def self.command
116
+ @command
163
117
  end
164
-
165
- no_commands {
166
- def initialize_stuff
167
- @model_date = Date.today.to_s
168
-
169
- @models_folder = "Classes/Models"
170
- @tests_fixtures_folder = "Classes/Tests/Fixtures"
171
- @tests_models_folder = "Classes/Tests/Models"
172
-
173
- @template_folder = File.expand_path('../template', __FILE__)
174
- end
175
-
176
- def source_paths
177
- [@template_folder]
178
- end
179
-
180
- def create_model_folders
181
- empty_directory @models_folder
182
- empty_directory @tests_fixtures_folder
183
- empty_directory @tests_models_folder
184
- end
185
-
186
- def create_model_files(model_name)
187
- # Files are created lowercase
188
- # Class names are camel case, videodata => VideoData
189
-
190
- # 1) Create the Models
191
- # Create the .h file
192
- source = "model.h.erb"
193
- target = File.join(@models_folder, "#{@model_file_name}.h")
194
- template(source,target)
195
-
196
- # Create the .m file
197
- source = "model.m.erb"
198
- target = File.join(@models_folder, "#{@model_file_name}.m")
199
- template(source,target)
200
-
201
- # 2) Create the Model Test Fixtures
202
- # Create the .h file
203
- source = "model_fixture.h.erb"
204
- target = File.join(@tests_fixtures_folder, "#{@model_fixtures_file_name}.h")
205
- template(source,target)
206
-
207
- # Create the .m file
208
- source = "model_fixture.m.erb"
209
- target = File.join(@tests_fixtures_folder, "#{@model_fixtures_file_name}.m")
210
- template(source,target)
211
-
212
- # Create the json file
213
- source = "model_fixture.json.erb"
214
- target = File.join(@tests_fixtures_folder, "#{@model_fixtures_file_name}.json")
215
- template(source,target)
216
-
217
- # 3) Create the Model Tests
218
- # Create the .h file
219
- source = "model_test.h.erb"
220
- target = File.join(@tests_models_folder, "#{@model_tests_file_name}.h")
221
- template(source,target)
222
-
223
- # Create the .m file
224
- source = "model_test.m.erb"
225
- target = File.join(@tests_models_folder, "#{@model_tests_file_name}.m")
226
- template(source,target)
227
- end
228
-
229
- def update_xcode_project(model_name)
230
- xcworkspace_path = ""
231
- Xcodeproj::Workspace.new_from_xcworkspace(xcworkspace_path)
232
- end
233
- }
234
118
  end
235
- end
236
- end
237
-
238
- module LaneKit
239
- class CLI < Thor
240
119
 
241
- desc "generate", "Invoke a code generator"
242
- long_desc "Invoke a code generator. There is only one generator so far: 'model' that generates Objective-C code compatible with RestKit that includes unit tests"
243
- subcommand "generate", LaneKit::Generators::Generate
120
+ map ["-v", "--version"] => :version
244
121
 
245
- # register(class_name, subcommand_alias, usage_list_string, description_string)
246
- #register(LaneKit::Generators::Generate, "generate", "generate", "Runs a code generator")
122
+ desc "generate", "Invoke a code generator"
123
+ long_desc <<-LONGDESC
124
+ Invoke a code generator:\n
125
+ -'model' that generates Objective-C code compatible with RestKit that includes unit tests\n
126
+ -'provider' that generates Objective-C code compatible with RestKit
127
+ LONGDESC
247
128
 
248
- desc "version", "Display the LaneKit version"
129
+ require 'lanekit/generate'
130
+ subcommand "generate", LaneKit::Generate
249
131
 
132
+ desc "version", "Display the LaneKit version"
250
133
  def version
251
134
  puts "LaneKit #{VERSION}"
252
135
  end
@@ -1,25 +1,16 @@
1
1
  //
2
2
  // <%=@model_file_name%>.h
3
3
  //
4
- // This model was created on <%=@model_date%> by LaneKit v<%=@lanekit_version%>.
4
+ // This model was created on <%=config[:generate_date]%> by LaneKit v<%=config[:lanekit_version]%>.
5
5
  //
6
- // The following LaneKit command was used to generate this model:
7
- // <%=@command%>
6
+ // The following LaneKit command was used to generate this file:
7
+ // <%=config[:command]%>
8
8
  //
9
9
 
10
- <% if @using_core_data %>#import <CoreData/CoreData.h><% else %>#import <Foundation/Foundation.h><% end %>
10
+ #import "<%=@model_base_file_name%>.h"
11
11
 
12
- @class RKObjectMapping;
13
-
14
- @interface <%=@class_name%> : <% if @using_core_data %>NSManagedObject<% else %>NSObject<% end %>
12
+ @interface <%=@class_name%> : <%=@model_base_class_name%>
15
13
  <% @attributes.each do |attribute| %>
16
14
  @property (nonatomic,strong) <%=attribute[:objective_c_type]%><%=attribute[:name]%>;<% if attribute[:relationship] %> // relates to: <%=attribute[:relationship]%><% end %><% end %>
17
- <% if @using_core_data %>
18
- + (NSString *)entityName;
19
- + (<%=@class_name%> *)create:(NSManagedObjectContext *)moc;<% end %>
20
- + (NSString *)keyPath; // Used by providers. The subset of the parsed response for which the mapping is to be used.
21
- + (NSString *)pathPattern; // Used by providers. The pattern that matches against URLs for which the mapping should be used.
22
- + (RKObjectMapping *)requestMapping; // Used by providers. Returns the request RKObjectMapping
23
- + (RKObjectMapping *)responseMapping; // Used by providers. Returns the response RKObjectMapping
24
15
 
25
16
  @end
@@ -1,11 +1,13 @@
1
1
  //
2
2
  // <%=@model_file_name%>.m
3
3
  //
4
- // This model was created on <%=@model_date%> by LaneKit v<%=@lanekit_version%>.
4
+ // This model was created on <%=config[:generate_date]%> by LaneKit v<%=config[:lanekit_version]%>.
5
+ //
6
+ // The following LaneKit command was used to generate this file:
7
+ // <%=config[:command]%>
5
8
  //
6
9
 
7
- #import "<%=@model_file_name%>.h"
8
- #import "RestKit.h"<% @attributes.each do |attribute| %><% if attribute[:relationship] %>
10
+ #import "<%=@model_file_name%>.h"<% @attributes.each do |attribute| %><% if attribute[:relationship] %>
9
11
  #import "<%=attribute[:relationship]%>.h"<%end%><%end%>
10
12
 
11
13
  @implementation <%=@class_name%><% if @using_core_data %>
@@ -13,62 +15,36 @@
13
15
  // All properties in this NSManagedObject need to be defined with @dynamic<% @attributes.each do |attribute| %>
14
16
  @dynamic <%=attribute[:name]%>;<% end %><% end %>
15
17
 
16
- + (void)initialize
17
- {
18
- if (self == [<%=@class_name%> class])
19
- {
20
- }
21
- }<% if @using_core_data %>
22
-
23
- + (NSString *)entityName
18
+ // Dictionary to convert self to JSON
19
+ + (NSDictionary *)dictionaryForRequestMappings
24
20
  {
25
- return NSStringFromClass([self class]);
21
+ return @{
22
+ // source key path : destination attribute name
23
+ <% @attributes.each_with_index do |attribute, index| %><% if !attribute[:relationship] %> @"<%=attribute[:name]%>": @"<%=attribute[:name]%>"<% if index != @attributes.size-1 %>,<% end %>
24
+ <% end %><% end %> };
26
25
  }
27
26
 
28
- + (<%=@class_name%> *)create:(NSManagedObjectContext *)moc
27
+ // Dictionary to convert JSON to self
28
+ + (NSDictionary *)dictionaryForResponseMappings
29
29
  {
30
- <%=@class_name%> *entity = nil;
31
- @try {
32
- entity = [NSEntityDescription insertNewObjectForEntityForName:self.entityName inManagedObjectContext:moc];
33
- }
34
- @catch (NSException *exception) {
35
- NSLog(@"[%@ %@] %@", [self description], NSStringFromSelector(_cmd), exception);
36
- @throw exception;
37
- }
38
- return entity;
39
- }<% end %>
40
-
41
- + (NSDictionary *)dictionaryForMappings
42
- {
43
- return @{
44
- <% @attributes.each_with_index do |attribute, index| %><% if !attribute[:relationship] %> @"<%=attribute[:name]%>": @"<%=attribute[:name]%>"<% if index != @attributes.size-1 %>,<% end %>
30
+ return @{
31
+ // source key path : destination attribute name
32
+ <% @attributes.each_with_index do |attribute, index| %><% if !attribute[:relationship] %> @"<%=attribute[:name]%>": @"<%=attribute[:name]%>"<% if index != @attributes.size-1 %>,<% end %>
45
33
  <% end %><% end %> };
46
34
  }
47
35
 
48
36
  + (NSString *)keyPath
49
37
  {
50
38
  return @"<%=@model_name%>";
51
- }
52
-
53
- + (NSString *)pathPattern
54
- {
55
- return nil;
56
- }
57
-
58
- + (RKObjectMapping *)requestMapping
59
- {
60
- RKObjectMapping *requestMapping = [RKObjectMapping requestMapping];
61
- [requestMapping addAttributeMappingsFromDictionary:[self dictionaryForMappings]];
62
- return requestMapping;
63
- }
39
+ }<% if @any_relationships %>
64
40
 
65
41
  + (RKObjectMapping *)responseMapping
66
42
  {
67
43
  RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[<%=@class_name%> class]];
68
- [mapping addAttributeMappingsFromDictionary:[self dictionaryForMappings]];
44
+ [mapping addAttributeMappingsFromDictionary:[self dictionaryForResponseMappings]];
69
45
  <% @attributes.each_with_index do |attribute, index| %><% if attribute[:relationship] %>
70
46
  [mapping addRelationshipMappingWithSourceKeyPath:@"<%=attribute[:name]%>" mapping:[<%=attribute[:relationship]%> responseMapping]];
71
47
  <% end %><% end %> return mapping;
72
- }
48
+ }<% end %>
73
49
 
74
50
  @end
@@ -0,0 +1,23 @@
1
+ //
2
+ // <%=@model_base_file_name%>.h
3
+ //
4
+ // This base model was created on <%=config[:generate_date]%> by LaneKit v<%=config[:lanekit_version]%>.
5
+ //
6
+ // The following LaneKit command was used to generate this file:
7
+ // <%=config[:command]%>
8
+ //
9
+
10
+ #import "RestKit.h"
11
+
12
+ @interface <%=@model_base_class_name%> : <% if @using_core_data %>NSManagedObject<% else %>NSObject<% end %>
13
+
14
+ + (NSDictionary *)dictionaryForRequestMappings; // Used by providers.
15
+ + (NSDictionary *)dictionaryForResponseMappings; // Used by providers.
16
+ + (NSString *)keyPath; // Used by providers. The subset of the parsed response for which the mapping is to be used.
17
+ + (NSString *)pathPattern; // Used by providers. The pattern that matches against URLs for which the mapping should be used.
18
+ + (RKObjectMapping *)requestMapping; // Used by providers. Returns the request RKObjectMapping
19
+ + (RKObjectMapping *)responseMapping; // Used by providers. Returns the response RKObjectMapping
20
+ <% if @using_core_data %>
21
+ + (NSString *)entityName;
22
+ + (<%=@class_name%> *)create:(NSManagedObjectContext *)moc;<% end %>
23
+ @end
@@ -0,0 +1,77 @@
1
+ //
2
+ // <%=@model_base_file_name%>.m
3
+ //
4
+ // This base model was created on <%=config[:generate_date]%> by LaneKit v<%=config[:lanekit_version]%>.
5
+ //
6
+ // The following LaneKit command was used to generate this file:
7
+ // <%=config[:command]%>
8
+ //
9
+
10
+ #import "<%=@model_base_file_name%>.h"
11
+
12
+ @implementation <%=@model_base_class_name%><% if @using_core_data %>
13
+
14
+ + (NSString *)entityName
15
+ {
16
+ return NSStringFromClass([self class]);
17
+ }
18
+
19
+ + (<%=@class_name%> *)create:(NSManagedObjectContext *)moc
20
+ {
21
+ <%=@class_name%> *entity = nil;
22
+ @try {
23
+ entity = [NSEntityDescription insertNewObjectForEntityForName:self.entityName inManagedObjectContext:moc];
24
+ }
25
+ @catch (NSException *exception) {
26
+ NSLog(@"[%@ %@] %@", [self description], NSStringFromSelector(_cmd), exception);
27
+ @throw exception;
28
+ }
29
+ return entity;
30
+ }<% end %>
31
+
32
+ // Dictionary to convert self to JSON
33
+ // Subclasses may need to override this method
34
+ + (NSDictionary *)dictionaryForRequestMappings
35
+ {
36
+ return @{
37
+ };
38
+ }
39
+
40
+ // Dictionary to convert JSON to self
41
+ // Subclasses may need to override this method
42
+ + (NSDictionary *)dictionaryForResponseMappings
43
+ {
44
+ return @{
45
+ };
46
+ }
47
+
48
+ // Subclasses should override this method
49
+ + (NSString *)keyPath
50
+ {
51
+ return nil;
52
+ }
53
+
54
+ // Subclasses may need to override this method
55
+ + (NSString *)pathPattern
56
+ {
57
+ return nil;
58
+ }
59
+
60
+ // Returns the request RKObjectMapping for this class
61
+ + (RKObjectMapping *)requestMapping
62
+ {
63
+ RKObjectMapping *mapping = [RKObjectMapping requestMapping];
64
+ [mapping addAttributeMappingsFromDictionary:[self dictionaryForRequestMappings]];
65
+ return mapping;
66
+ }
67
+
68
+ // Returns the response RKObjectMapping for this class
69
+ // Subclasses may need to override this method
70
+ + (RKObjectMapping *)responseMapping
71
+ {
72
+ RKObjectMapping *mapping = [RKObjectMapping mappingForClass:self.class];
73
+ [mapping addAttributeMappingsFromDictionary:[self dictionaryForResponseMappings]];
74
+ return mapping;
75
+ }
76
+
77
+ @end
@@ -1,7 +1,10 @@
1
1
  //
2
2
  // <%=@model_fixtures_file_name%>.h
3
3
  //
4
- // This model fixture was created on <%=@model_date%> by LaneKit v<%=@lanekit_version%>.
4
+ // This model fixture was created on <%=config[:generate_date]%> by LaneKit v<%=config[:lanekit_version]%>.
5
+ //
6
+ // The following LaneKit command was used to generate this file:
7
+ // <%=config[:command]%>
5
8
  //
6
9
 
7
10
  #import <Foundation/Foundation.h>
@@ -1,7 +1,10 @@
1
1
  //
2
2
  // <%=@model_fixtures_file_name%>.m
3
3
  //
4
- // This model fixture was created on <%=@model_date%> by LaneKit v<%=@lanekit_version%>.
4
+ // This model fixture was created on <%=config[:generate_date]%> by LaneKit v<%=config[:lanekit_version]%>.
5
+ //
6
+ // The following LaneKit command was used to generate this file:
7
+ // <%=config[:command]%>
5
8
  //
6
9
 
7
10
  #import "<%=@model_fixtures_file_name%>.h"<% @attributes.each do |attribute| %><% if attribute[:relationship] %>
@@ -1,7 +1,10 @@
1
1
  //
2
2
  // <%=@model_tests_file_name%>.h
3
3
  //
4
- // This model test was created on <%=@model_date%> by LaneKit v<%=@lanekit_version%>.
4
+ // This model test was created on <%=config[:generate_date]%> by LaneKit v<%=config[:lanekit_version]%>.
5
+ //
6
+ // The following LaneKit command was used to generate this file:
7
+ // <%=config[:command]%>
5
8
  //
6
9
 
7
10
  #import <SenTestingKit/SenTestingKit.h>
@@ -1,7 +1,10 @@
1
1
  //
2
2
  // <%=@model_tests_file_name%>.m
3
3
  //
4
- // This model test was created on <%=@model_date%> by LaneKit v<%=@lanekit_version%>.
4
+ // This model test was created on <%=config[:generate_date]%> by LaneKit v<%=config[:lanekit_version]%>.
5
+ //
6
+ // The following LaneKit command was used to generate this file:
7
+ // <%=config[:command]%>
5
8
  //
6
9
 
7
10
  #import "<%=@model_tests_file_name%>.h"
@@ -0,0 +1,15 @@
1
+ //
2
+ // <%=@provider_file_name%>.h
3
+ //
4
+ // This provider was created on <%=config[:generate_date]%> by LaneKit v<%=config[:lanekit_version]%>.
5
+ //
6
+ // The following LaneKit command was used to generate this file:
7
+ // <%=config[:command]%>
8
+ //
9
+
10
+ #import "<%=@provider_base_file_name%>.h"
11
+ #import "<%=@model_file_name%>.h"
12
+
13
+ @interface <%=@provider_name%> : <%=@provider_base_class_name%>
14
+
15
+ @end
@@ -0,0 +1,31 @@
1
+ //
2
+ // <%=@provider_file_name%>.m
3
+ //
4
+ // This provider was created on <%=config[:generate_date]%> by LaneKit v<%=config[:lanekit_version]%>.
5
+ //
6
+ // The following LaneKit command was used to generate this file:
7
+ // <%=config[:command]%>
8
+ //
9
+
10
+ #import "<%=@provider_file_name%>.h"
11
+
12
+ @implementation <%=@provider_name%>
13
+
14
+ - (NSString *)baseURL
15
+ {
16
+ return @"<%=@provider_url%>";
17
+ }
18
+
19
+ - (Class)modelClass
20
+ {
21
+ return [<%=@model_class_name%> class];
22
+ }
23
+
24
+ - (id)processResult:(RKMappingResult *)mappingResult withError:(NSError **)error
25
+ {
26
+ <%=@model_class_name%> *results = [mappingResult firstObject];
27
+ id result = results;
28
+ return result;
29
+ }
30
+
31
+ @end
@@ -0,0 +1,23 @@
1
+ //
2
+ // <%=@provider_base_file_name%>.h
3
+ //
4
+ // This base provider was created on <%=config[:generate_date]%> by LaneKit v<%=config[:lanekit_version]%>.
5
+ //
6
+ // The following LaneKit command was used to generate this file:
7
+ // <%=config[:command]%>
8
+ //
9
+
10
+ #import "RestKit.h"
11
+
12
+ typedef void(^<%=@provider_base_class_name%>CallbackBlock)(NSError *error, id result);
13
+
14
+ @interface <%=@provider_base_class_name%> : NSObject
15
+
16
+ @property (nonatomic,strong) NSString *baseURL;
17
+
18
+ - (void)downloadWithCompletionBlock:(LKResourceProviderCallbackBlock)completionBlock;
19
+ - (Class)modelClass;
20
+ - (id)processResult:(RKMappingResult *)mappingResult withError:(NSError **)error;
21
+ - (RKResponseDescriptor *)responseDescriptor;
22
+
23
+ @end
@@ -0,0 +1,55 @@
1
+ //
2
+ // <%=@provider_base_file_name%>.m
3
+ //
4
+ // This base provider was created on <%=config[:generate_date]%> by LaneKit v<%=config[:lanekit_version]%>.
5
+ //
6
+ // The following LaneKit command was used to generate this file:
7
+ // <%=config[:command]%>
8
+ //
9
+
10
+ #import "<%=@provider_base_file_name%>.h"
11
+ #import "LKModel.h"
12
+
13
+ @implementation <%=@provider_base_class_name%>
14
+
15
+ - (void)downloadWithCompletionBlock:(LKResourceProviderCallbackBlock)completionBlock
16
+ {
17
+ NSString *baseURL = self.baseURL;
18
+ NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:baseURL]];
19
+ RKResponseDescriptor *responseDescriptor = [self responseDescriptor];
20
+ RKObjectRequestOperation *operation = [[RKObjectRequestOperation alloc] initWithRequest:request responseDescriptors:@[responseDescriptor]];
21
+
22
+ [operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
23
+ NSError *error = nil;
24
+ id result = [self processResult:mappingResult withError:&error];
25
+ completionBlock(nil, result);
26
+ } failure:^(RKObjectRequestOperation *operation, NSError *error) {
27
+ completionBlock(error, nil);
28
+ }];
29
+ [operation start];
30
+ }
31
+
32
+ // Subclasses should override this method
33
+ - (Class)modelClass
34
+ {
35
+ return [LKModel class];
36
+ }
37
+
38
+ // Subclasses should override this method
39
+ - (id)processResult:(RKMappingResult *)mappingResult withError:(NSError **)error
40
+ {
41
+ return nil;
42
+ }
43
+
44
+ // Subclasses may need to override this method
45
+ - (RKResponseDescriptor *)responseDescriptor
46
+ {
47
+ NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful);
48
+ return [RKResponseDescriptor responseDescriptorWithMapping:[self.modelClass responseMapping]
49
+ method:RKRequestMethodGET
50
+ pathPattern:[self.modelClass pathPattern]
51
+ keyPath:[self.modelClass keyPath]
52
+ statusCodes:statusCodes];
53
+ }
54
+
55
+ @end
metadata CHANGED
@@ -1,18 +1,20 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lanekit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Larry Aasen
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2013-08-11 00:00:00.000000000 Z
12
+ date: 2013-10-13 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: thor
15
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
19
  - - ~>
18
20
  - !ruby/object:Gem::Version
@@ -20,6 +22,7 @@ dependencies:
20
22
  type: :runtime
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
23
26
  requirements:
24
27
  - - ~>
25
28
  - !ruby/object:Gem::Version
@@ -27,6 +30,7 @@ dependencies:
27
30
  - !ruby/object:Gem::Dependency
28
31
  name: xcodeproj
29
32
  requirement: !ruby/object:Gem::Requirement
33
+ none: false
30
34
  requirements:
31
35
  - - ~>
32
36
  - !ruby/object:Gem::Version
@@ -34,11 +38,13 @@ dependencies:
34
38
  type: :runtime
35
39
  prerelease: false
36
40
  version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
37
42
  requirements:
38
43
  - - ~>
39
44
  - !ruby/object:Gem::Version
40
45
  version: 0.5.5
41
- description: a code generator for iOS Objective-C models for integration with RestKit.
46
+ description: an iOS Objective-C code generator for models and resource providers for
47
+ integration with RestKit.
42
48
  email:
43
49
  - larryaasen@gmail.com
44
50
  executables:
@@ -46,41 +52,53 @@ executables:
46
52
  extensions: []
47
53
  extra_rdoc_files: []
48
54
  files:
55
+ - lib/lanekit/generate/model.rb
56
+ - lib/lanekit/generate/provider.rb
57
+ - lib/lanekit/generate.rb
49
58
  - lib/lanekit/version.rb
50
59
  - lib/lanekit.rb
51
60
  - lib/template/model.h.erb
52
61
  - lib/template/model.m.erb
62
+ - lib/template/model_base.h.erb
63
+ - lib/template/model_base.m.erb
53
64
  - lib/template/model_fixture.h.erb
54
65
  - lib/template/model_fixture.json.erb
55
66
  - lib/template/model_fixture.m.erb
56
67
  - lib/template/model_test.h.erb
57
68
  - lib/template/model_test.m.erb
69
+ - lib/template/provider.h.erb
70
+ - lib/template/provider.m.erb
71
+ - lib/template/provider_base.h.erb
72
+ - lib/template/provider_base.m.erb
58
73
  - bin/lanekit
59
74
  - README.md
60
75
  - LICENSE
61
76
  homepage: https://github.com/LarryAasen/LaneKit
62
77
  licenses:
63
78
  - MIT
64
- metadata: {}
65
79
  post_install_message:
66
80
  rdoc_options: []
67
81
  require_paths:
68
82
  - lib
69
83
  required_ruby_version: !ruby/object:Gem::Requirement
84
+ none: false
70
85
  requirements:
71
86
  - - ! '>='
72
87
  - !ruby/object:Gem::Version
73
88
  version: 1.8.7
74
89
  required_rubygems_version: !ruby/object:Gem::Requirement
90
+ none: false
75
91
  requirements:
76
92
  - - ! '>='
77
93
  - !ruby/object:Gem::Version
78
94
  version: '0'
79
95
  requirements: []
80
96
  rubyforge_project:
81
- rubygems_version: 2.0.3
97
+ rubygems_version: 1.8.23
82
98
  signing_key:
83
- specification_version: 4
84
- summary: LaneKit is a code generator for iOS Objective-C models for integration with
85
- RestKit.
99
+ specification_version: 3
100
+ summary: LaneKit is an iOS Objective-C code generator of models and resource providers
101
+ for integration with RestKit. It includes support for unit testing with SenTestingKit
102
+ including fixtures and tests. LaneKit is a command line app written in Ruby and
103
+ packaged as a Ruby Gem.
86
104
  test_files: []
checksums.yaml DELETED
@@ -1,15 +0,0 @@
1
- ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- M2ZkNjM1Yjk4OGNhNGQ2OWNhNTM1ZDY4Y2FhZGY1ZDE4ZThjMDA2YQ==
5
- data.tar.gz: !binary |-
6
- MDNhY2RiNDIwMzk5ZWY5NzBlMDM4ODgxNjlhMDAxM2MyYzg0NWZhZQ==
7
- !binary "U0hBNTEy":
8
- metadata.gz: !binary |-
9
- NGVhOWRlMjg2YTNiMTQ3NDZiYzU5NGE3MDUzNmIwNzRlMTMxYTViM2E3YjM1
10
- ZGUxOTA5YjRhNWMxMmY3ZjBlZWFiMDkyYmI0NjQ3YTk5ZmEzZGJhODAwMDcx
11
- ZDI0OWVlMmIwOGQzMzJkM2U2ZWYyMTAxODRiYTE2NWY0YmVhMmQ=
12
- data.tar.gz: !binary |-
13
- N2FkYmExMzRhZmQ4OTJhMjY4NmE0YTFkYzYxNmE2NGUwNmMyZGY2YWFkZGJh
14
- NjVhODE3YTc4Y2E3M2M1MmRlNmRkNTFhMmI1Y2RiMTZmZjM0OTkzMTliYWE4
15
- ZDk4YzJiOWY5NWQ0ZjUwZWQ3YmQ0MTMwOGM1OTdmNjRhMGVlNTE=