lanekit 0.2.1 → 0.3.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 +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: []
|