lanekit 0.2.1 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +49 -50
- data/lib/lanekit/generate/model.rb +1 -1
- data/lib/lanekit/generate/provider.rb +1 -1
- data/lib/lanekit/generate.rb +0 -1
- data/lib/lanekit/new.rb +135 -0
- data/lib/lanekit/version.rb +1 -1
- data/lib/lanekit.rb +40 -3
- metadata +26 -10
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
## LaneKit
|
2
2
|
|
3
|
-
LaneKit is an iOS Objective-C code generator
|
4
|
-
|
5
|
-
in Ruby and packaged as a Ruby Gem.
|
3
|
+
LaneKit is an iOS Objective-C code generator for integration with RestKit. It generates
|
4
|
+
models, resource providers, and full iOS apps with mimimal effort. There is support for unit testing with SenTestingKit
|
5
|
+
including fixtures and tests. LaneKit is a command line app written in Ruby and packaged as a Ruby Gem.
|
6
6
|
|
7
7
|
- [Source code for LaneKit](https://github.com/LarryAasen/LaneKit/zipball/master) from [GitHub](http://github.com).
|
8
8
|
- Questions? [Stack Overflow](http://stackoverflow.com/questions/tagged/lanekit) is the best place to find answers.
|
@@ -13,6 +13,7 @@ in Ruby and packaged as a Ruby Gem.
|
|
13
13
|
* consistent Objective-C code
|
14
14
|
* unit tests
|
15
15
|
* test fixtures in JSON and Objective-C
|
16
|
+
* iOS app creation fully integrated with CocoaPods and RestKit
|
16
17
|
* tested code
|
17
18
|
* rapid development
|
18
19
|
* enhanced productivity of junior developers
|
@@ -33,19 +34,19 @@ in Ruby and packaged as a Ruby Gem.
|
|
33
34
|
|
34
35
|
$ lanekit generate model Video duration:string headline:string id:integer image:string location:string
|
35
36
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
37
|
+
create Classes/Models
|
38
|
+
create Classes/Tests/Fixtures
|
39
|
+
create Classes/Tests/Models
|
40
|
+
create Classes/Models/Video.h
|
41
|
+
create Classes/Models/Video.m
|
42
|
+
create Classes/Tests/Fixtures/VideoFixtures.h
|
43
|
+
create Classes/Tests/Fixtures/VideoFixtures.m
|
44
|
+
create Classes/Tests/Fixtures/VideoFixtures.one.json
|
45
|
+
create Classes/Tests/Fixtures/VideoFixtures.two.json
|
46
|
+
create Classes/Tests/Models/VideoTest.h
|
47
|
+
create Classes/Tests/Models/VideoTest.m
|
48
|
+
create Classes/Models/LKModel.h
|
49
|
+
create Classes/Models/LKModel.m
|
49
50
|
|
50
51
|
and here is the Objective-C header file that was generated by LaneKit:
|
51
52
|
|
@@ -53,17 +54,15 @@ and here is the Objective-C header file that was generated by LaneKit:
|
|
53
54
|
//
|
54
55
|
// Video.h
|
55
56
|
//
|
56
|
-
// This model was created on 2013-
|
57
|
+
// This model was created on 2013-10-20 by LaneKit v0.3.0.
|
57
58
|
//
|
58
|
-
// The following LaneKit command was used to generate this
|
59
|
+
// The following LaneKit command was used to generate this file:
|
59
60
|
// lanekit generate model Video duration:string headline:string id:integer image:string location:string
|
60
61
|
//
|
61
62
|
|
62
|
-
#import
|
63
|
+
#import "LKModel.h"
|
63
64
|
|
64
|
-
@
|
65
|
-
|
66
|
-
@interface Video : NSObject
|
65
|
+
@interface Video : LKModel
|
67
66
|
|
68
67
|
@property (nonatomic,strong) NSString *duration;
|
69
68
|
@property (nonatomic,strong) NSString *headline;
|
@@ -71,9 +70,6 @@ and here is the Objective-C header file that was generated by LaneKit:
|
|
71
70
|
@property (nonatomic,strong) NSString *image;
|
72
71
|
@property (nonatomic,strong) NSString *location;
|
73
72
|
|
74
|
-
+ (RKObjectMapping *)requestMapping;
|
75
|
-
+ (RKObjectMapping *)responseMapping;
|
76
|
-
|
77
73
|
@end
|
78
74
|
```
|
79
75
|
|
@@ -83,46 +79,45 @@ and here is the Objective-C .m file that was generated by LaneKit:
|
|
83
79
|
//
|
84
80
|
// Video.m
|
85
81
|
//
|
86
|
-
// This model was created on 2013-
|
82
|
+
// This model was created on 2013-10-20 by LaneKit v0.3.0.
|
83
|
+
//
|
84
|
+
// The following LaneKit command was used to generate this file:
|
85
|
+
// lanekit generate model Video duration:string headline:string id:integer image:string location:string
|
87
86
|
//
|
88
87
|
|
89
88
|
#import "Video.h"
|
90
|
-
#import "RestKit.h"
|
91
89
|
|
92
90
|
@implementation Video
|
93
91
|
|
94
|
-
|
95
|
-
|
96
|
-
if (self == [Video class])
|
97
|
-
{
|
98
|
-
}
|
99
|
-
}
|
100
|
-
|
101
|
-
+ (NSDictionary *)dictionaryForMappings
|
92
|
+
// Dictionary to convert self to JSON
|
93
|
+
+ (NSDictionary *)dictionaryForRequestMappings
|
102
94
|
{
|
103
95
|
return @{
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
96
|
+
// source key path : destination attribute name
|
97
|
+
@"duration": @"duration",
|
98
|
+
@"headline": @"headline",
|
99
|
+
@"id": @"id",
|
100
|
+
@"image": @"image",
|
101
|
+
@"location": @"location"
|
109
102
|
};
|
110
103
|
}
|
111
104
|
|
112
|
-
//
|
113
|
-
+ (
|
105
|
+
// Dictionary to convert JSON to self
|
106
|
+
+ (NSDictionary *)dictionaryForResponseMappings
|
114
107
|
{
|
115
|
-
|
116
|
-
|
117
|
-
|
108
|
+
return @{
|
109
|
+
// source key path : destination attribute name
|
110
|
+
@"duration": @"duration",
|
111
|
+
@"headline": @"headline",
|
112
|
+
@"id": @"id",
|
113
|
+
@"image": @"image",
|
114
|
+
@"location": @"location"
|
115
|
+
};
|
118
116
|
}
|
119
117
|
|
120
|
-
|
121
|
-
+ (RKObjectMapping *)responseMapping
|
118
|
+
+ (NSString *)keyPath
|
122
119
|
{
|
123
|
-
|
124
|
-
[mapping addAttributeMappingsFromDictionary:[self dictionaryForMappings]];
|
125
|
-
return mapping;
|
120
|
+
return @"video";
|
126
121
|
}
|
127
122
|
|
128
123
|
@end
|
@@ -218,6 +213,10 @@ and here is a unit test that was generated in Models/VideoTest.m by LaneKit:
|
|
218
213
|
create Classes/Controllers/LKResourceProvider.m
|
219
214
|
create Classes/Controllers/ContentsProvider.h
|
220
215
|
create Classes/Controllers/ContentsProvider.m
|
216
|
+
|
217
|
+
### Create a new iOS app fully integrated with CocoaPods and RestKit.
|
218
|
+
|
219
|
+
$ lanekit new SportsFrames
|
221
220
|
|
222
221
|
### Sample App
|
223
222
|
The SportsFrames app is a fully functional sample app using RestKit created to demonstrate the use of LaneKit in a real world app. It
|
data/lib/lanekit/generate.rb
CHANGED
data/lib/lanekit/new.rb
ADDED
@@ -0,0 +1,135 @@
|
|
1
|
+
require 'xcodeproj'
|
2
|
+
|
3
|
+
module LaneKit
|
4
|
+
class CLI < Thor
|
5
|
+
|
6
|
+
include Thor::Actions
|
7
|
+
|
8
|
+
desc "new APP_PATH [BUNDLE_ID]", "Create a new iOS app"
|
9
|
+
def new(app_path, bundle_id=nil)
|
10
|
+
app_path = app_path.strip
|
11
|
+
@app_path = app_path
|
12
|
+
@bundle_id = bundle_id
|
13
|
+
|
14
|
+
@app_name = LaneKit::derive_app_name(app_path)
|
15
|
+
validate_message = LaneKit.validate_app_name(@app_name)
|
16
|
+
if validate_message
|
17
|
+
puts "***error: #{validate_message}"
|
18
|
+
return
|
19
|
+
end
|
20
|
+
|
21
|
+
@app_path_full = File.expand_path app_path
|
22
|
+
if File.exists?(@app_path_full)
|
23
|
+
puts "Can't create a new LaneKit app in an existing folder: #{@app_path_full}"
|
24
|
+
return
|
25
|
+
end
|
26
|
+
|
27
|
+
if @bundle_id != nil
|
28
|
+
validate_message = LaneKit.validate_bundle_id(@bundle_id)
|
29
|
+
if validate_message
|
30
|
+
puts "***error: #{validate_message}"
|
31
|
+
return
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
if !LaneKit.gem_available?('cocoapods')
|
36
|
+
puts "The Ruby gem cocoapods is not installed. This gem is required by LaneKit.\nInstall command: gem install cocoapods"
|
37
|
+
return
|
38
|
+
end
|
39
|
+
|
40
|
+
@project_path = File.join @app_path_full, @app_name
|
41
|
+
@ios_template_name = "lanekit-ios-project"
|
42
|
+
@ios_version = '6.0'
|
43
|
+
@original_wd = Dir.pwd
|
44
|
+
|
45
|
+
self.create_project
|
46
|
+
self.change_filenames(@app_path_full, @app_name, @ios_template_name)
|
47
|
+
self.change_bundle_id(@bundle_id) if @bundle_id != nil
|
48
|
+
self.add_cocoapods
|
49
|
+
self.clean_workspace
|
50
|
+
end
|
51
|
+
|
52
|
+
no_tasks {
|
53
|
+
#def create_xcodeproj_project
|
54
|
+
# proj = Xcodeproj::Project.new(File.join(@app_path, "#{@app_name}.xcodeproj"))
|
55
|
+
# app_target = proj.new_target(:application, @app_name, :ios, proj.products_group)
|
56
|
+
# proj.save
|
57
|
+
#end
|
58
|
+
|
59
|
+
def clean_workspace
|
60
|
+
# Remove the extra project that CocoaPods added to the workspace
|
61
|
+
workspace_path = File.join(@app_path_full, "#{@app_name}.xcworkspace")
|
62
|
+
say_status :clean, workspace_path, :yellow
|
63
|
+
workspace = Xcodeproj::Workspace.new_from_xcworkspace(workspace_path)
|
64
|
+
container = "container:#{@app_name}/#{@app_name}.xcodeproj"
|
65
|
+
if workspace.include?(container)
|
66
|
+
workspace.projpaths.delete(container)
|
67
|
+
workspace.save_as(workspace_path)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def change_bundle_id(bundle_id)
|
72
|
+
plistbuddy_path = '/usr/libexec/PlistBuddy'
|
73
|
+
plist_file = "#{@app_name}-Info.plist"
|
74
|
+
info_plist_path = File.join(@project_path, File.join("#{@app_name}", plist_file))
|
75
|
+
system("#{plistbuddy_path} -c \"Set :CFBundleIdentifier #{bundle_id}\" #{info_plist_path}")
|
76
|
+
end
|
77
|
+
|
78
|
+
def add_cocoapods
|
79
|
+
Dir.chdir(@project_path) do
|
80
|
+
puts "Installing CocoaPods for RestKit"
|
81
|
+
system "pod install"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def create_project
|
86
|
+
source = @ios_template_name
|
87
|
+
destination = @app_path
|
88
|
+
directory(source, destination)
|
89
|
+
end
|
90
|
+
|
91
|
+
def source_paths
|
92
|
+
LaneKit.template_folders
|
93
|
+
end
|
94
|
+
|
95
|
+
def change_filenames path, app_name, template_name
|
96
|
+
|
97
|
+
Dir.foreach(path) do |file|
|
98
|
+
if file == '..' || file == '.'
|
99
|
+
next
|
100
|
+
end
|
101
|
+
|
102
|
+
old_path = File.join path, file
|
103
|
+
new_path = old_path
|
104
|
+
|
105
|
+
if file.start_with?(template_name)
|
106
|
+
new_name = file.sub template_name, app_name
|
107
|
+
|
108
|
+
new_path = File.join path, new_name
|
109
|
+
FileUtils.mv old_path, new_path
|
110
|
+
say_status :rename, new_path, :yellow
|
111
|
+
end
|
112
|
+
|
113
|
+
if File.directory?(new_path)
|
114
|
+
change_filenames new_path, app_name, template_name
|
115
|
+
else
|
116
|
+
|
117
|
+
begin
|
118
|
+
string = IO.read(new_path)
|
119
|
+
string = string.gsub!(template_name, app_name)
|
120
|
+
if string != nil
|
121
|
+
IO.write(new_path, string)
|
122
|
+
say_status :update, new_path, :yellow
|
123
|
+
end
|
124
|
+
|
125
|
+
rescue
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
|
133
|
+
}
|
134
|
+
end
|
135
|
+
end
|
data/lib/lanekit/version.rb
CHANGED
data/lib/lanekit.rb
CHANGED
@@ -9,6 +9,17 @@ module LaneKit
|
|
9
9
|
@@objc_types = {
|
10
10
|
"array" => "NSArray *"
|
11
11
|
}
|
12
|
+
@template_folder = File.expand_path('../template', __FILE__)
|
13
|
+
|
14
|
+
def self.template_folders
|
15
|
+
[@template_folder]
|
16
|
+
end
|
17
|
+
|
18
|
+
# Returns an app name from a folder path. App names are lower case
|
19
|
+
# "Tracker" => "tracker", "~/Projects/Runner" => "runner"
|
20
|
+
def self.derive_app_name(app_path)
|
21
|
+
app_name = File.basename(app_path).to_s.downcase
|
22
|
+
end
|
12
23
|
|
13
24
|
# Model names are lower case
|
14
25
|
# "Car" => "car", "Bigbird" => "bigbird"
|
@@ -100,12 +111,37 @@ module LaneKit
|
|
100
111
|
end
|
101
112
|
assert
|
102
113
|
end
|
114
|
+
|
115
|
+
def self.validate_app_name(app_name)
|
116
|
+
if app_name.length < 2
|
117
|
+
return "app name must be at least two characters long"
|
118
|
+
elsif app_name.include? " "
|
119
|
+
return "app name cannot include spaces"
|
120
|
+
end
|
121
|
+
return nil
|
122
|
+
end
|
123
|
+
|
124
|
+
def self.validate_bundle_id(bundle_id)
|
125
|
+
if bundle_id.length < 2
|
126
|
+
return "bundle id must be at least two characters long"
|
127
|
+
elsif bundle_id.include? " "
|
128
|
+
return "bundle id cannot include spaces"
|
129
|
+
end
|
130
|
+
return nil
|
131
|
+
end
|
132
|
+
|
133
|
+
def self.gem_available?(gemname)
|
134
|
+
if Gem::Specification.methods.include?(:find_all_by_name)
|
135
|
+
not Gem::Specification.find_all_by_name(gemname).empty?
|
136
|
+
else
|
137
|
+
Gem.available?(gemname)
|
138
|
+
end
|
139
|
+
end
|
103
140
|
|
104
141
|
end
|
105
142
|
|
106
143
|
module LaneKit
|
107
144
|
class CLI < Thor
|
108
|
-
|
109
145
|
script_name = File.basename($0)
|
110
146
|
script_args = ARGV.join(' ')
|
111
147
|
|
@@ -119,15 +155,16 @@ module LaneKit
|
|
119
155
|
|
120
156
|
map ["-v", "--version"] => :version
|
121
157
|
|
158
|
+
require 'lanekit/generate'
|
122
159
|
desc "generate", "Invoke a code generator"
|
123
160
|
long_desc <<-LONGDESC
|
124
161
|
Invoke a code generator:\n
|
125
162
|
-'model' that generates Objective-C code compatible with RestKit that includes unit tests\n
|
126
163
|
-'provider' that generates Objective-C code compatible with RestKit
|
127
164
|
LONGDESC
|
128
|
-
|
129
|
-
require 'lanekit/generate'
|
130
165
|
subcommand "generate", LaneKit::Generate
|
166
|
+
|
167
|
+
require 'lanekit/new'
|
131
168
|
|
132
169
|
desc "version", "Display the LaneKit version"
|
133
170
|
def version
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lanekit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,8 +9,24 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-10-
|
12
|
+
date: 2013-10-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: cocoapods
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.24.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.24.0
|
14
30
|
- !ruby/object:Gem::Dependency
|
15
31
|
name: thor
|
16
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -34,7 +50,7 @@ dependencies:
|
|
34
50
|
requirements:
|
35
51
|
- - ~>
|
36
52
|
- !ruby/object:Gem::Version
|
37
|
-
version: 0.
|
53
|
+
version: 0.10.0
|
38
54
|
type: :runtime
|
39
55
|
prerelease: false
|
40
56
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -42,9 +58,8 @@ dependencies:
|
|
42
58
|
requirements:
|
43
59
|
- - ~>
|
44
60
|
- !ruby/object:Gem::Version
|
45
|
-
version: 0.
|
46
|
-
description: an iOS Objective-C code generator for
|
47
|
-
integration with RestKit.
|
61
|
+
version: 0.10.0
|
62
|
+
description: an iOS Objective-C code generator for integration with RestKit.
|
48
63
|
email:
|
49
64
|
- larryaasen@gmail.com
|
50
65
|
executables:
|
@@ -55,6 +70,7 @@ files:
|
|
55
70
|
- lib/lanekit/generate/model.rb
|
56
71
|
- lib/lanekit/generate/provider.rb
|
57
72
|
- lib/lanekit/generate.rb
|
73
|
+
- lib/lanekit/new.rb
|
58
74
|
- lib/lanekit/version.rb
|
59
75
|
- lib/lanekit.rb
|
60
76
|
- lib/template/model.h.erb
|
@@ -97,8 +113,8 @@ rubyforge_project:
|
|
97
113
|
rubygems_version: 1.8.23
|
98
114
|
signing_key:
|
99
115
|
specification_version: 3
|
100
|
-
summary: LaneKit is an iOS Objective-C code generator
|
101
|
-
|
102
|
-
|
103
|
-
packaged as a Ruby Gem.
|
116
|
+
summary: LaneKit is an iOS Objective-C code generator for integration with RestKit.
|
117
|
+
It generates models, resource providers, and full iOS apps with mimimal effort.
|
118
|
+
There is support for unit testing with SenTestingKit including fixtures and tests.
|
119
|
+
LaneKit is a command line app written in Ruby and packaged as a Ruby Gem.
|
104
120
|
test_files: []
|