lanekit 0.6.0 → 0.7.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
- ZWVmYzA2ZTdlNmQ4ZmEzNzQxYTIxMTUwMjJmOTc2MTIwYjI5OTNiZA==
4
+ Zjk5ZTM1ZGRhNzMzYjRhYjVhMDRhMzQyOTQwNGQxMDUyMTliM2FkMg==
5
5
  data.tar.gz: !binary |-
6
- OGRlOTdmOTY3OGVmYTZlN2RmOWM4OTNjYTVkMmZiN2ExNWFjYzNmNg==
6
+ MzRiMTQzMDJkOGQ4NjQxOTFkZDY4NTU3ODY2MTA1NjAyMWIwZTA1ZA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MTEzYmVmZjM3ZWViN2RjNWJkYmQ1ZGYxYTk3YjdiZjFjNmQyMGI3OWVhOTcy
10
- NjE0ZWI0YjgyZTY0ODk5M2FlOGE5OWZhYzgzNjEwZTQxM2UyYzQ0Y2IzNzlk
11
- ZmMwZjM5M2RhYTkyM2M0YzE1YWY3ZTU2YjFhYjllYzhjMDEyZGM=
9
+ ZDA3YTFhZDZkMGRiY2I0ZWZlM2JmN2RkNTM3YjJiOWNiMmY2ZThkYzk5Mzg0
10
+ ZmVjMGZjZGE2YmEwOGFlNDU3NjNmMjAwZWU3OThkNjc3MzRhMzNiZDFmOGQ1
11
+ NWUzNDc4MDZkNWRkZjQ0MWIyNGQ1MTUxYzhjNDQwMWM2ZjU5OWQ=
12
12
  data.tar.gz: !binary |-
13
- YmE5NzYzYWQxNDM1YWM0YzQ1N2EyYjViMzcyMDc0NmZhNjNjODE2NjJkYjA1
14
- NzVkY2JmMDI0OGI1MzRmNDM0MGRjYTM3ODQwMGUxODMwNjY4NjM4YjVjY2My
15
- NDk4NWM5M2Q5NzdlMzdmOWQ1OGJlNjIyMzIxYTA3MzJjOWI0MzQ=
13
+ NzFhOTJlOTRmNTJkZGQ5OGRiY2M5MjAxNjQ1NDc5NjI2NDJlZGVmMDJkNzM5
14
+ YjIyZDkxZjNmNjkwNTI5MGQyNzA1OTIxNjZiOTMzMzk1MGMwN2E2ZDAyMzU1
15
+ OWZiMWE5ZjU0NjJlZGM1MGIxZjA1ZmNjMmU4ZWRmMTkyOWNmNzk=
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  [![Gem Version](https://badge.fury.io/rb/lanekit.png)](http://badge.fury.io/rb/lanekit)
4
4
 
5
5
  LaneKit is an iOS Objective-C code generator for integration with [RestKit](https://github.com/RestKit/RestKit). It generates
6
- models, resource providers, table views, and full iOS apps with mimimal effort. There is support for unit testing with SenTestingKit
6
+ models, resource providers, table views, and full iOS apps with mimimal effort. There is support for unit testing with XCTest
7
7
  including fixtures and tests. LaneKit is a command line app written in Ruby and packaged as a Ruby Gem.
8
8
 
9
9
  - [Source code for LaneKit](https://github.com/LarryAasen/LaneKit/zipball/master) from [GitHub](http://github.com).
@@ -13,7 +13,7 @@ including fixtures and tests. LaneKit is a command line app written in Ruby and
13
13
  * properly implemented models, resource providers, and table views
14
14
  * easy integration with RestKit
15
15
  * consistent Objective-C code
16
- * unit tests with OCUnit (SenTestingKit)
16
+ * unit tests with XCTest
17
17
  * test fixtures in JSON and Objective-C
18
18
  * iOS app creation fully integrated with [CocoaPods](https://github.com/CocoaPods/CocoaPods) and RestKit, and .gitignore file
19
19
  * tested code
@@ -19,6 +19,34 @@ class LaneKit::Generate < Thor
19
19
  LaneKit.add_pod_to_podfile(pod_name)
20
20
  end
21
21
 
22
+ desc "flurry", "Adds the Flurry pod to the Podfile and updates the LKAppDelegate"
23
+ def flurry()
24
+ lanefile = LaneKit::Lanefile.new
25
+ lanefile_error = LaneKit.validate_lanefile(lanefile)
26
+ if lanefile_error
27
+ say lanefile_error, :red
28
+ return
29
+ end
30
+ controllers_folder = LaneKit.controllers_folder(lanefile)
31
+ app_delegate_file = "#{controllers_folder}/LKAppDelegate.m"
32
+
33
+ update_file_add_line(app_delegate_file, 'imports', ['#import "Flurry.h"'])
34
+
35
+ text_lines = [
36
+ ' {',
37
+ ' // Load the Flurry SDK',
38
+ ' // TODO: replace your_flurry_key below with your Flurry Key',
39
+ ' [Flurry startSession:@"your_flurry_key"];',
40
+ ' [Flurry logEvent:@"applicationDidFinishLaunching"];',
41
+ ' }',
42
+ ''
43
+ ]
44
+ update_file_add_line(app_delegate_file, 'app-did-finish-loading', text_lines)
45
+
46
+ pod_name = 'FlurrySDK'
47
+ LaneKit.add_pod_to_podfile(pod_name)
48
+ end
49
+
22
50
  no_tasks do
23
51
  def source_paths
24
52
  LaneKit.template_folders
@@ -28,6 +56,44 @@ class LaneKit::Generate < Thor
28
56
  xcworkspace_path = ""
29
57
  Xcodeproj::Workspace.new_from_xcworkspace(xcworkspace_path)
30
58
  end
59
+
60
+ def update_file_add_line(filename, template_tag, text_lines)
61
+ added_lines = false
62
+
63
+ if File.exists?(filename)
64
+ template_tag = "{" + template_tag + "}\n"
65
+
66
+ insert_into_file filename, :after => template_tag do
67
+ text_lines.join("\n") + "\n"
68
+ end
69
+
70
+ added_lines = true
71
+ end
72
+
73
+ ## Open the file to be updated
74
+ #if File.exists?(filename)
75
+ # found = false
76
+ # File.readlines(filename).each do |line|
77
+ # found_template = line.grep(/#{template_tag}/)
78
+ # # If we found a tag
79
+ # if found_template.length > 0
80
+ # # If we are inside a tag
81
+ # if found
82
+ # # We are now finished with the tag
83
+ # break
84
+ # end
85
+ #
86
+ # found = true
87
+ # end
88
+ # end
89
+ # return added_lines
90
+ #else
91
+ # puts "The file '#{filename}' does not exist"
92
+ # return added_lines
93
+ #end
94
+
95
+ return added_lines
96
+ end
31
97
  end
32
98
 
33
99
  @@template_opts = {
data/lib/lanekit/new.rb CHANGED
@@ -89,20 +89,34 @@ module LaneKit
89
89
  end
90
90
 
91
91
  def add_gitignore
92
- # Download the .gitignore file from GitHub
93
92
  require 'net/https'
94
- ignore_file_uri = URI("http://raw.github.com/github/gitignore/master/Objective-C.gitignore")
93
+ # Create an empty .gitignore file
95
94
  ignore_file_path = File.join(@app_path, ".gitignore")
96
95
  say_status :create, ignore_file_path
97
-
96
+
97
+ # Download the Objective-C .gitignore file from GitHub
98
+ ignore_file_uri = URI("http://raw.githubusercontent.com/github/gitignore/master/Objective-C.gitignore")
98
99
  response = Net::HTTP.start(ignore_file_uri.host, use_ssl: true, verify_mode: OpenSSL::SSL::VERIFY_NONE) do |http|
99
100
  http.get ignore_file_uri.request_uri
100
101
  end
101
102
 
103
+ # Write the Objective-C .gitignore contents to local .gitignore file
102
104
  require_text = response.body
103
105
  open(ignore_file_path, "wb") do |file|
104
106
  file.write(require_text)
105
107
  end
108
+
109
+ # Download the OSX .gitignore file from GitHub
110
+ ignore_file_uri = URI("http://raw.githubusercontent.com/github/gitignore/master/Global/OSX.gitignore")
111
+ response = Net::HTTP.start(ignore_file_uri.host, use_ssl: true, verify_mode: OpenSSL::SSL::VERIFY_NONE) do |http|
112
+ http.get ignore_file_uri.request_uri
113
+ end
114
+
115
+ # Append the OSK .gitignore contents to local .gitignore file
116
+ require_text = response.body
117
+ open(ignore_file_path, "ab") do |file|
118
+ file.write(require_text)
119
+ end
106
120
 
107
121
  end
108
122
 
@@ -1,3 +1,3 @@
1
1
  module LaneKit
2
- VERSION = "0.6.0"
2
+ VERSION = "0.7.0"
3
3
  end
@@ -1,7 +1,14 @@
1
1
  xcodeproj 'lanekit-ios-project/lanekit-ios-project.xcodeproj'
2
2
 
3
3
  platform :ios, "6.0"
4
+ inhibit_all_warnings!
4
5
 
5
6
  link_with ['lanekit-ios-project', 'lanekit-ios-projectTests']
6
7
 
7
- pod 'RestKit', '0.20.3'
8
+ pod 'RestKit', '0.23.1'
9
+
10
+ post_install do | installer |
11
+ require 'fileutils'
12
+ FileUtils.cp_r('../Pods/Pods-acknowledgements.plist', 'lanekit-ios-project/Resources/Settings.bundle/Acknowledgements.plist', :remove_destination => true)
13
+ end
14
+
@@ -3,16 +3,18 @@
3
3
  //
4
4
 
5
5
  #import "LKAppDelegate.h"
6
+ // Used by LaneKit. Do not remove this: {imports}
6
7
 
7
8
  @implementation LKAppDelegate
8
9
 
9
10
  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
10
11
  {
11
- UIViewController *controller = UIViewController.new;
12
- [(UINavigationController *)self.window.rootViewController pushViewController:controller animated:NO];
13
- controller.navigationItem.title = @"lanekit-ios-project";
14
-
15
- return YES;
12
+ UIViewController *controller = UIViewController.new;
13
+ [(UINavigationController *)self.window.rootViewController pushViewController:controller animated:NO];
14
+ controller.navigationItem.title = @"lanekit-ios-project";
15
+
16
+ // Used by LaneKit. Do not remove this: {app-did-finish-loading}
17
+ return YES;
16
18
  }
17
19
 
18
20
  @end
@@ -0,0 +1,19 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>PreferenceSpecifiers</key>
6
+ <array>
7
+ <dict>
8
+ <key>Title</key>
9
+ <string>Acknowledgements</string>
10
+ <key>File</key>
11
+ <string>Acknowledgements</string>
12
+ <key>Type</key>
13
+ <string>PSChildPaneSpecifier</string>
14
+ </dict>
15
+ </array>
16
+ <key>StringsTable</key>
17
+ <string>Root</string>
18
+ </dict>
19
+ </plist>
@@ -16,6 +16,7 @@
16
16
  461263D5180B401300771CF8 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 461263D4180B401300771CF8 /* Images.xcassets */; };
17
17
  466CCC26181CA7CA0028AD47 /* Main_iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 466CCC22181CA7CA0028AD47 /* Main_iPad.storyboard */; };
18
18
  466CCC27181CA7CA0028AD47 /* Main_iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 466CCC24181CA7CA0028AD47 /* Main_iPhone.storyboard */; };
19
+ 468AB2E1190DE64100461303 /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 468AB2E0190DE64100461303 /* Settings.bundle */; };
19
20
  46B91530182595FA00DC8651 /* placeholder@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 46B9152F182595FA00DC8651 /* placeholder@2x.png */; };
20
21
  46C411911824966400B19AB2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 461263C2180B401300771CF8 /* Foundation.framework */; };
21
22
  46C411921824966400B19AB2 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 461263C6180B401300771CF8 /* UIKit.framework */; };
@@ -51,6 +52,7 @@
51
52
  461263E5180B401300771CF8 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
52
53
  466CCC23181CA7CA0028AD47 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Resources/Base.lproj/Main_iPad.storyboard; sourceTree = "<group>"; };
53
54
  466CCC25181CA7CA0028AD47 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Resources/Base.lproj/Main_iPhone.storyboard; sourceTree = "<group>"; };
55
+ 468AB2E0190DE64100461303 /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = Settings.bundle; path = Resources/Settings.bundle; sourceTree = "<group>"; };
54
56
  46B9152F182595FA00DC8651 /* placeholder@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "placeholder@2x.png"; path = "Resources/placeholder@2x.png"; sourceTree = "<group>"; };
55
57
  46C4118F1824966400B19AB2 /* lanekit-ios-projectTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "lanekit-ios-projectTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
56
58
  46C411A41824995C00B19AB2 /* lanekit-ios-projectTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "lanekit-ios-projectTests.m"; sourceTree = "<group>"; };
@@ -207,10 +209,11 @@
207
209
  466CCB7C18192CF30028AD47 /* Resources */ = {
208
210
  isa = PBXGroup;
209
211
  children = (
212
+ 461263D4180B401300771CF8 /* Images.xcassets */,
210
213
  466CCC22181CA7CA0028AD47 /* Main_iPad.storyboard */,
211
214
  466CCC24181CA7CA0028AD47 /* Main_iPhone.storyboard */,
212
- 461263D4180B401300771CF8 /* Images.xcassets */,
213
215
  46B9152F182595FA00DC8651 /* placeholder@2x.png */,
216
+ 468AB2E0190DE64100461303 /* Settings.bundle */,
214
217
  );
215
218
  name = Resources;
216
219
  sourceTree = "<group>";
@@ -306,6 +309,7 @@
306
309
  466CCC27181CA7CA0028AD47 /* Main_iPhone.storyboard in Resources */,
307
310
  466CCC26181CA7CA0028AD47 /* Main_iPad.storyboard in Resources */,
308
311
  461263CD180B401300771CF8 /* InfoPlist.strings in Resources */,
312
+ 468AB2E1190DE64100461303 /* Settings.bundle in Resources */,
309
313
  461263D5180B401300771CF8 /* Images.xcassets in Resources */,
310
314
  );
311
315
  runOnlyForDeploymentPostprocessing = 0;
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.6.0
4
+ version: 0.7.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: 2014-04-12 00:00:00.000000000 Z
11
+ date: 2014-07-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cocoapods
@@ -110,6 +110,8 @@ files:
110
110
  - lib/template/lanekit-ios-project/lanekit-ios-project/lanekit-ios-project/Resources/Images.xcassets/AppIcon.appiconset/Contents.json
111
111
  - lib/template/lanekit-ios-project/lanekit-ios-project/lanekit-ios-project/Resources/Images.xcassets/LaunchImage.launchimage/Contents.json
112
112
  - lib/template/lanekit-ios-project/lanekit-ios-project/lanekit-ios-project/Resources/placeholder@2x.png
113
+ - lib/template/lanekit-ios-project/lanekit-ios-project/lanekit-ios-project/Resources/Settings.bundle/en.lproj/Root.strings
114
+ - lib/template/lanekit-ios-project/lanekit-ios-project/lanekit-ios-project/Resources/Settings.bundle/Root.plist
113
115
  - lib/template/lanekit-ios-project/lanekit-ios-project/lanekit-ios-project/Supporting
114
116
  Files/lanekit-ios-project-Info.plist
115
117
  - lib/template/lanekit-ios-project/lanekit-ios-project/lanekit-ios-project/Supporting
@@ -118,9 +120,6 @@ files:
118
120
  Files/main.m
119
121
  - lib/template/lanekit-ios-project/lanekit-ios-project/lanekit-ios-project.xcodeproj/project.pbxproj
120
122
  - lib/template/lanekit-ios-project/lanekit-ios-project/lanekit-ios-project.xcodeproj/project.xcworkspace/contents.xcworkspacedata
121
- - lib/template/lanekit-ios-project/lanekit-ios-project/lanekit-ios-project.xcodeproj/project.xcworkspace/xcuserdata/larry.xcuserdatad/UserInterfaceState.xcuserstate
122
- - lib/template/lanekit-ios-project/lanekit-ios-project/lanekit-ios-project.xcodeproj/xcuserdata/larry.xcuserdatad/xcschemes/lanekit-ios-project.xcscheme
123
- - lib/template/lanekit-ios-project/lanekit-ios-project/lanekit-ios-project.xcodeproj/xcuserdata/larry.xcuserdatad/xcschemes/xcschememanagement.plist
124
123
  - lib/template/lanekit-ios-project/lanekit-ios-project/lanekit-ios-projectTests/en.lproj/InfoPlist.strings
125
124
  - lib/template/lanekit-ios-project/lanekit-ios-project/lanekit-ios-projectTests/lanekit-ios-projectTests-Info.plist
126
125
  - lib/template/lanekit-ios-project/lanekit-ios-project/lanekit-ios-projectTests/lanekit-ios-projectTests-Prefix.pch
@@ -1,96 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <Scheme
3
- LastUpgradeVersion = "0510"
4
- version = "1.3">
5
- <BuildAction
6
- parallelizeBuildables = "YES"
7
- buildImplicitDependencies = "YES">
8
- <BuildActionEntries>
9
- <BuildActionEntry
10
- buildForTesting = "YES"
11
- buildForRunning = "YES"
12
- buildForProfiling = "YES"
13
- buildForArchiving = "YES"
14
- buildForAnalyzing = "YES">
15
- <BuildableReference
16
- BuildableIdentifier = "primary"
17
- BlueprintIdentifier = "461263BE180B401300771CF8"
18
- BuildableName = "lanekit-ios-project.app"
19
- BlueprintName = "lanekit-ios-project"
20
- ReferencedContainer = "container:lanekit-ios-project.xcodeproj">
21
- </BuildableReference>
22
- </BuildActionEntry>
23
- </BuildActionEntries>
24
- </BuildAction>
25
- <TestAction
26
- selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
27
- selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
28
- shouldUseLaunchSchemeArgsEnv = "YES"
29
- buildConfiguration = "Debug">
30
- <Testables>
31
- <TestableReference
32
- skipped = "NO">
33
- <BuildableReference
34
- BuildableIdentifier = "primary"
35
- BlueprintIdentifier = "46C4118E1824966400B19AB2"
36
- BuildableName = "lanekit-ios-projectTests.octest"
37
- BlueprintName = "lanekit-ios-projectTests"
38
- ReferencedContainer = "container:lanekit-ios-project.xcodeproj">
39
- </BuildableReference>
40
- </TestableReference>
41
- </Testables>
42
- <MacroExpansion>
43
- <BuildableReference
44
- BuildableIdentifier = "primary"
45
- BlueprintIdentifier = "461263BE180B401300771CF8"
46
- BuildableName = "lanekit-ios-project.app"
47
- BlueprintName = "lanekit-ios-project"
48
- ReferencedContainer = "container:lanekit-ios-project.xcodeproj">
49
- </BuildableReference>
50
- </MacroExpansion>
51
- </TestAction>
52
- <LaunchAction
53
- selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
54
- selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
55
- launchStyle = "0"
56
- useCustomWorkingDirectory = "NO"
57
- buildConfiguration = "Debug"
58
- ignoresPersistentStateOnLaunch = "NO"
59
- debugDocumentVersioning = "YES"
60
- allowLocationSimulation = "YES">
61
- <BuildableProductRunnable>
62
- <BuildableReference
63
- BuildableIdentifier = "primary"
64
- BlueprintIdentifier = "461263BE180B401300771CF8"
65
- BuildableName = "lanekit-ios-project.app"
66
- BlueprintName = "lanekit-ios-project"
67
- ReferencedContainer = "container:lanekit-ios-project.xcodeproj">
68
- </BuildableReference>
69
- </BuildableProductRunnable>
70
- <AdditionalOptions>
71
- </AdditionalOptions>
72
- </LaunchAction>
73
- <ProfileAction
74
- shouldUseLaunchSchemeArgsEnv = "YES"
75
- savedToolIdentifier = ""
76
- useCustomWorkingDirectory = "NO"
77
- buildConfiguration = "Release"
78
- debugDocumentVersioning = "YES">
79
- <BuildableProductRunnable>
80
- <BuildableReference
81
- BuildableIdentifier = "primary"
82
- BlueprintIdentifier = "461263BE180B401300771CF8"
83
- BuildableName = "lanekit-ios-project.app"
84
- BlueprintName = "lanekit-ios-project"
85
- ReferencedContainer = "container:lanekit-ios-project.xcodeproj">
86
- </BuildableReference>
87
- </BuildableProductRunnable>
88
- </ProfileAction>
89
- <AnalyzeAction
90
- buildConfiguration = "Debug">
91
- </AnalyzeAction>
92
- <ArchiveAction
93
- buildConfiguration = "Release"
94
- revealArchiveInOrganizer = "YES">
95
- </ArchiveAction>
96
- </Scheme>
@@ -1,27 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
- <plist version="1.0">
4
- <dict>
5
- <key>SchemeUserState</key>
6
- <dict>
7
- <key>lanekit-ios-project.xcscheme</key>
8
- <dict>
9
- <key>orderHint</key>
10
- <integer>0</integer>
11
- </dict>
12
- </dict>
13
- <key>SuppressBuildableAutocreation</key>
14
- <dict>
15
- <key>461263BE180B401300771CF8</key>
16
- <dict>
17
- <key>primary</key>
18
- <true/>
19
- </dict>
20
- <key>46C4118E1824966400B19AB2</key>
21
- <dict>
22
- <key>primary</key>
23
- <true/>
24
- </dict>
25
- </dict>
26
- </dict>
27
- </plist>