lanekit 0.1.7 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- YzI4ZDM1ZGM3MjhkYjRmYjU1NzkxZGM1ZDdmYzM2MjBjZTUyODgzOA==
4
+ M2ZkNjM1Yjk4OGNhNGQ2OWNhNTM1ZDY4Y2FhZGY1ZDE4ZThjMDA2YQ==
5
5
  data.tar.gz: !binary |-
6
- MDIxOTc1ZTM4NjdiOTk2NTZjYzk2NWFjMGE1YjY0M2RiZjgzNTU5Zg==
6
+ MDNhY2RiNDIwMzk5ZWY5NzBlMDM4ODgxNjlhMDAxM2MyYzg0NWZhZQ==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- OTY4N2M1NmQxYmIzOWEwODlhOTMzMmI4YWU2OTU2YzBlY2VmYzlhMzQ5OTBm
10
- Zjc5ZjkzODViMWY3MDJhZGMwYzFhYjI2MjRmMDE5MDFiNzkzNGRkMzc3YTMw
11
- MWE2NTAwOTJkMjE3ZjljOGE4ZWUzY2JlMTNiZWQ4YWI4MDdiYjQ=
9
+ NGVhOWRlMjg2YTNiMTQ3NDZiYzU5NGE3MDUzNmIwNzRlMTMxYTViM2E3YjM1
10
+ ZGUxOTA5YjRhNWMxMmY3ZjBlZWFiMDkyYmI0NjQ3YTk5ZmEzZGJhODAwMDcx
11
+ ZDI0OWVlMmIwOGQzMzJkM2U2ZWYyMTAxODRiYTE2NWY0YmVhMmQ=
12
12
  data.tar.gz: !binary |-
13
- YmFiZDM3NWQ4YzY3NGE0NjhjOWI3ZmQyNDkxZGIxODhjMDNhYzAyMTllZDRh
14
- NDU4ZGZhODkzMTU4N2JiNDE1MTY0OTMxNDJhMTMzYTg2ZjZjNTliYmRmNjBj
15
- MGYyYzBhNjU2OGJlNjcyMzE0YjYzN2E4NjYzMzBlNGRhYmMwY2Q=
13
+ N2FkYmExMzRhZmQ4OTJhMjY4NmE0YTFkYzYxNmE2NGUwNmMyZGY2YWFkZGJh
14
+ NjVhODE3YTc4Y2E3M2M1MmRlNmRkNTFhMmI1Y2RiMTZmZjM0OTkzMTliYWE4
15
+ ZDk4YzJiOWY5NWQ0ZjUwZWQ3YmQ0MTMwOGM1OTdmNjRhMGVlNTE=
data/README.md CHANGED
@@ -1,6 +1,5 @@
1
1
  ## LaneKit
2
2
 
3
-
4
3
  LaneKit is a code generator for iOS Objective-C models for integration with RestKit. It includes support
5
4
  for unit testing with SenTestingKit including fixtures and tests. LaneKit is a command line app written
6
5
  in Ruby and packaged as a Ruby Gem.
@@ -8,6 +7,17 @@ in Ruby and packaged as a Ruby Gem.
8
7
  - [Source code for LaneKit](https://github.com/LarryAasen/LaneKit/zipball/master) from [GitHub](http://github.com).
9
8
  - Questions? [Stack Overflow](http://stackoverflow.com/questions/tagged/lanekit) is the best place to find answers.
10
9
 
10
+ ## Benefits
11
+ * properly implemented models
12
+ * consistent Objective-C code
13
+ * unit tests
14
+ * test fixtures in JSON and Objective-C
15
+ * tested code
16
+ * rapid development
17
+ * easy integration with RestKit
18
+ * enhanced productivity of junior developers
19
+ * reduces dependency on senior developers
20
+
11
21
  ## How To Get Started
12
22
 
13
23
  1. Install the LaneKit Ruby Gem from RubyGems.org
@@ -1,3 +1,3 @@
1
1
  module LaneKit
2
- VERSION = "0.1.7"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/lanekit.rb CHANGED
@@ -50,6 +50,23 @@ module LaneKit
50
50
  type
51
51
  end
52
52
 
53
+ def self.objective_c_type_fixture_json(type_name)
54
+ if type_name == "array"
55
+ value = "[]"
56
+ elsif type_name == "date"
57
+ value = "03/01/2012"
58
+ elsif type_name == "integer"
59
+ value = "1"
60
+ elsif type_name == "string"
61
+ value = "MyString"
62
+ elsif type_name
63
+ value = ""
64
+ else
65
+ value = ""
66
+ end
67
+ value
68
+ end
69
+
53
70
  def self.objective_c_type_fixture_value(type_name)
54
71
  if type_name == "array"
55
72
  value = "@[]"
@@ -89,8 +106,19 @@ module LaneKit
89
106
  class Generate < Thor
90
107
  include Thor::Actions
91
108
 
92
- desc "model [name] [name:type:relationship, name:type:relationship, ...] where type is [date|integer|string|<class_name>] and relationship (optional) is []", "Generates an Objective-C model for RestKit including unit tests"
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
93
118
  def model(model_name, *attributes)
119
+ @using_core_data = options[:use_core_data]
120
+ puts " using Core Data: #{@using_core_data}"
121
+
94
122
  @model_name = LaneKit.derive_model_name(model_name)
95
123
 
96
124
  @model_file_name = LaneKit.derive_file_name(@model_name)
@@ -112,6 +140,7 @@ module LaneKit
112
140
  :objective_c_type => objective_c_type,
113
141
  :relationship => relationship,
114
142
  :relationship_fixtures_file_name => "#{relationship}Fixtures",
143
+ :fixture_json => LaneKit.objective_c_type_fixture_json(type),
115
144
  :fixture_value => LaneKit.objective_c_type_fixture_value(type),
116
145
  :unit_test_assert => LaneKit.objective_c_type_unit_test_assert(@model_name, name, type)
117
146
  }
@@ -142,7 +171,6 @@ module LaneKit
142
171
  @tests_models_folder = "Classes/Tests/Models"
143
172
 
144
173
  @template_folder = File.expand_path('../template', __FILE__)
145
- @using_core_data = false
146
174
  end
147
175
 
148
176
  def source_paths
@@ -181,6 +209,11 @@ module LaneKit
181
209
  target = File.join(@tests_fixtures_folder, "#{@model_fixtures_file_name}.m")
182
210
  template(source,target)
183
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
+
184
217
  # 3) Create the Model Tests
185
218
  # Create the .h file
186
219
  source = "model_test.h.erb"
@@ -204,9 +237,18 @@ end
204
237
 
205
238
  module LaneKit
206
239
  class CLI < Thor
207
- desc "generate", "Generate a model compatible with RestKit that includes unit tests"
240
+
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
208
244
 
209
245
  # register(class_name, subcommand_alias, usage_list_string, description_string)
210
- register(LaneKit::Generators::Generate, "generate", "generate", "Runs a generator")
246
+ #register(LaneKit::Generators::Generate, "generate", "generate", "Runs a code generator")
247
+
248
+ desc "version", "Display the LaneKit version"
249
+
250
+ def version
251
+ puts "LaneKit #{VERSION}"
252
+ end
211
253
  end
212
254
  end
@@ -7,16 +7,19 @@
7
7
  // <%=@command%>
8
8
  //
9
9
 
10
- #import <Foundation/Foundation.h><% if @using_core_data %>
11
- #import <CoreData/CoreData.h><% end %>
10
+ <% if @using_core_data %>#import <CoreData/CoreData.h><% else %>#import <Foundation/Foundation.h><% end %>
12
11
 
13
12
  @class RKObjectMapping;
14
13
 
15
- @interface <%=@class_name%> : NSObject
14
+ @interface <%=@class_name%> : <% if @using_core_data %>NSManagedObject<% else %>NSObject<% end %>
16
15
  <% @attributes.each do |attribute| %>
17
16
  @property (nonatomic,strong) <%=attribute[:objective_c_type]%><%=attribute[:name]%>;<% if attribute[:relationship] %> // relates to: <%=attribute[:relationship]%><% end %><% end %>
18
-
19
- + (RKObjectMapping *)requestMapping;
20
- + (RKObjectMapping *)responseMapping;
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
21
24
 
22
25
  @end
@@ -8,15 +8,36 @@
8
8
  #import "RestKit.h"<% @attributes.each do |attribute| %><% if attribute[:relationship] %>
9
9
  #import "<%=attribute[:relationship]%>.h"<%end%><%end%>
10
10
 
11
- @implementation <%=@class_name%>
11
+ @implementation <%=@class_name%><% if @using_core_data %>
12
+
13
+ // All properties in this NSManagedObject need to be defined with @dynamic<% @attributes.each do |attribute| %>
14
+ @dynamic <%=attribute[:name]%>;<% end %><% end %>
12
15
 
13
16
  + (void)initialize
14
17
  {
15
18
  if (self == [<%=@class_name%> class])
16
19
  {
17
20
  }
21
+ }<% if @using_core_data %>
22
+
23
+ + (NSString *)entityName
24
+ {
25
+ return NSStringFromClass([self class]);
18
26
  }
19
27
 
28
+ + (<%=@class_name%> *)create:(NSManagedObjectContext *)moc
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
+
20
41
  + (NSDictionary *)dictionaryForMappings
21
42
  {
22
43
  return @{
@@ -24,7 +45,16 @@
24
45
  <% end %><% end %> };
25
46
  }
26
47
 
27
- // Returns the request RKObjectMapping
48
+ + (NSString *)keyPath
49
+ {
50
+ return @"<%=@model_name%>";
51
+ }
52
+
53
+ + (NSString *)pathPattern
54
+ {
55
+ return nil;
56
+ }
57
+
28
58
  + (RKObjectMapping *)requestMapping
29
59
  {
30
60
  RKObjectMapping *requestMapping = [RKObjectMapping requestMapping];
@@ -32,13 +62,12 @@
32
62
  return requestMapping;
33
63
  }
34
64
 
35
- // Returns the response RKObjectMapping
36
65
  + (RKObjectMapping *)responseMapping
37
66
  {
38
67
  RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[<%=@class_name%> class]];
39
68
  [mapping addAttributeMappingsFromDictionary:[self dictionaryForMappings]];
40
69
  <% @attributes.each_with_index do |attribute, index| %><% if attribute[:relationship] %>
41
- [mapping addRelationshipMappingWithSourceKeyPath:@"<%=attribute[:name]%>" mapping:[<%=attribute[:relationship]%> modelMapping]];
70
+ [mapping addRelationshipMappingWithSourceKeyPath:@"<%=attribute[:name]%>" mapping:[<%=attribute[:relationship]%> responseMapping]];
42
71
  <% end %><% end %> return mapping;
43
72
  }
44
73
 
@@ -0,0 +1,5 @@
1
+ {
2
+ "<%=@model_name%>": {
3
+ <% @attributes.each_with_index do |attribute, index| %><% if attribute[:relationship] %> "<%=attribute[:relationship]%>": []<% else %> "<%=attribute[:name]%>": "<%=attribute[:fixture_json]%>"<% if index != @attributes.size-1 %>,<% end %><% end %>
4
+ <% end %> }
5
+ }
@@ -13,7 +13,7 @@
13
13
  {
14
14
  <%=@class_name%> *<%=@model_name%> = <%=@class_name%>.new;
15
15
 
16
- <% @attributes.each_with_index do |attribute, index| %><% if attribute[:relationship] %> <%=@model_name%>.<%=attribute[:name]%> = @[<%=attribute[:relationship]%>Fixtures.one];<% else %><%=@model_name%>.<%=attribute[:name]%> = <%=attribute[:fixture_value]%>;<% end %>
16
+ <% @attributes.each_with_index do |attribute, index| %><% if attribute[:relationship] %> <%=@model_name%>.<%=attribute[:name]%> = @[<%=attribute[:relationship]%>Fixtures.one];<% else %> <%=@model_name%>.<%=attribute[:name]%> = <%=attribute[:fixture_value]%>;<% end %>
17
17
  <% end %>
18
18
  return <%=@model_name%>;
19
19
  }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lanekit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Larry Aasen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-10 00:00:00.000000000 Z
11
+ date: 2013-08-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -51,6 +51,7 @@ files:
51
51
  - lib/template/model.h.erb
52
52
  - lib/template/model.m.erb
53
53
  - lib/template/model_fixture.h.erb
54
+ - lib/template/model_fixture.json.erb
54
55
  - lib/template/model_fixture.m.erb
55
56
  - lib/template/model_test.h.erb
56
57
  - lib/template/model_test.m.erb