lanekit 0.2.0 → 0.2.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.
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=