xcres 0.4.0

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.
Files changed (299) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +33 -0
  3. data/.travis.yml +18 -0
  4. data/Gemfile +8 -0
  5. data/Gemfile.lock +85 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +181 -0
  8. data/Rakefile +58 -0
  9. data/bin/xcres +12 -0
  10. data/lib/xcres/analyzer/aggregate_analyzer.rb +48 -0
  11. data/lib/xcres/analyzer/analyzer.rb +141 -0
  12. data/lib/xcres/analyzer/resources_aggregate_analyzer.rb +27 -0
  13. data/lib/xcres/analyzer/resources_analyzer/base_resources_analyzer.rb +133 -0
  14. data/lib/xcres/analyzer/resources_analyzer/bundle_resources_analyzer.rb +68 -0
  15. data/lib/xcres/analyzer/resources_analyzer/loose_resources_analyzer.rb +39 -0
  16. data/lib/xcres/analyzer/resources_analyzer/xcassets_analyzer.rb +62 -0
  17. data/lib/xcres/analyzer/strings_analyzer.rb +255 -0
  18. data/lib/xcres/builder/file_builder.rb +61 -0
  19. data/lib/xcres/builder/resources_builder.rb +184 -0
  20. data/lib/xcres/builder/string_builder.rb +31 -0
  21. data/lib/xcres/command/build_command.rb +83 -0
  22. data/lib/xcres/command/command.rb +58 -0
  23. data/lib/xcres/command/install_command.rb +173 -0
  24. data/lib/xcres/command/main_command.rb +14 -0
  25. data/lib/xcres/command/project_command.rb +111 -0
  26. data/lib/xcres/command/version_command.rb +12 -0
  27. data/lib/xcres/helper/file_helper.rb +16 -0
  28. data/lib/xcres/logger.rb +148 -0
  29. data/lib/xcres/model/section.rb +43 -0
  30. data/lib/xcres/model/xcassets/bundle.rb +55 -0
  31. data/lib/xcres/model/xcassets/resource.rb +141 -0
  32. data/lib/xcres/model/xcassets/resource_image.rb +134 -0
  33. data/lib/xcres/version.rb +9 -0
  34. data/lib/xcres.rb +9 -0
  35. data/spec/fixtures/Example/Example/AppDelegate.h +15 -0
  36. data/spec/fixtures/Example/Example/AppDelegate.m +49 -0
  37. data/spec/fixtures/Example/Example/Example-Info.plist +38 -0
  38. data/spec/fixtures/Example/Example/Example-Prefix.pch +16 -0
  39. data/spec/fixtures/Example/Example/Images/doge.jpeg +0 -0
  40. data/spec/fixtures/Example/Example/Images/nyanCat.png +0 -0
  41. data/spec/fixtures/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
  42. data/spec/fixtures/Example/Example/Images.xcassets/Doge.imageset/Contents.json +18 -0
  43. data/spec/fixtures/Example/Example/Images.xcassets/Doge.imageset/doge.png +0 -0
  44. data/spec/fixtures/Example/Example/Images.xcassets/Doge.imageset/doge@2x.png +0 -0
  45. data/spec/fixtures/Example/Example/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
  46. data/spec/fixtures/Example/Example/de.lproj/Localizable.strings +12 -0
  47. data/spec/fixtures/Example/Example/en.lproj/InfoPlist.strings +2 -0
  48. data/spec/fixtures/Example/Example/en.lproj/Localizable.strings +15 -0
  49. data/spec/fixtures/Example/Example/main.m +18 -0
  50. data/spec/fixtures/Example/Example.xcodeproj/project.pbxproj +449 -0
  51. data/spec/fixtures/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  52. data/spec/fixtures/ExampleOSX/ExampleOSX/AppDelegate.h +15 -0
  53. data/spec/fixtures/ExampleOSX/ExampleOSX/AppDelegate.m +18 -0
  54. data/spec/fixtures/ExampleOSX/ExampleOSX/Base.lproj/MainMenu.xib +680 -0
  55. data/spec/fixtures/ExampleOSX/ExampleOSX/ExampleOSX-Info.plist +34 -0
  56. data/spec/fixtures/ExampleOSX/ExampleOSX/ExampleOSX-Prefix.pch +9 -0
  57. data/spec/fixtures/ExampleOSX/ExampleOSX/Images.xcassets/AppIcon.appiconset/Contents.json +58 -0
  58. data/spec/fixtures/ExampleOSX/ExampleOSX/en.lproj/Credits.rtf +29 -0
  59. data/spec/fixtures/ExampleOSX/ExampleOSX/en.lproj/InfoPlist.strings +2 -0
  60. data/spec/fixtures/ExampleOSX/ExampleOSX/main.m +14 -0
  61. data/spec/fixtures/ExampleOSX/ExampleOSX.xcodeproj/project.pbxproj +481 -0
  62. data/spec/fixtures/ExampleOSX/ExampleOSX.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  63. data/spec/fixtures/ExampleOSX/ExampleOSXTests/ExampleOSXTests-Info.plist +22 -0
  64. data/spec/fixtures/ExampleOSX/ExampleOSXTests/ExampleOSXTests.m +34 -0
  65. data/spec/fixtures/ExampleOSX/ExampleOSXTests/en.lproj/InfoPlist.strings +2 -0
  66. data/spec/integration/build/after/Example/Example/AppDelegate.h +15 -0
  67. data/spec/integration/build/after/Example/Example/AppDelegate.m +49 -0
  68. data/spec/integration/build/after/Example/Example/Example-Info.plist +38 -0
  69. data/spec/integration/build/after/Example/Example/Example-Prefix.pch +16 -0
  70. data/spec/integration/build/after/Example/Example/Icons.bundle/tab_bar/tabbar_list.png +0 -0
  71. data/spec/integration/build/after/Example/Example/Icons.bundle/tab_bar/tabbar_list@2x.png +0 -0
  72. data/spec/integration/build/after/Example/Example/Icons.bundle/tab_bar/tabbar_map.png +0 -0
  73. data/spec/integration/build/after/Example/Example/Icons.bundle/tab_bar/tabbar_map@2x.png +0 -0
  74. data/spec/integration/build/after/Example/Example/Images/doge.jpeg +0 -0
  75. data/spec/integration/build/after/Example/Example/Images/nyanCat.png +0 -0
  76. data/spec/integration/build/after/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
  77. data/spec/integration/build/after/Example/Example/Images.xcassets/Doge.imageset/Contents.json +18 -0
  78. data/spec/integration/build/after/Example/Example/Images.xcassets/Doge.imageset/doge.png +0 -0
  79. data/spec/integration/build/after/Example/Example/Images.xcassets/Doge.imageset/doge@2x.png +0 -0
  80. data/spec/integration/build/after/Example/Example/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
  81. data/spec/integration/build/after/Example/Example/de.lproj/Localizable.strings +12 -0
  82. data/spec/integration/build/after/Example/Example/en.lproj/InfoPlist.strings +2 -0
  83. data/spec/integration/build/after/Example/Example/en.lproj/Localizable.strings +15 -0
  84. data/spec/integration/build/after/Example/Example/main.m +18 -0
  85. data/spec/integration/build/after/Example/Example.xcodeproj.yaml +168 -0
  86. data/spec/integration/build/after/R.h +39 -0
  87. data/spec/integration/build/after/R.m +29 -0
  88. data/spec/integration/build/after/execution_output.txt +19 -0
  89. data/spec/integration/build/before/Example/Example/AppDelegate.h +15 -0
  90. data/spec/integration/build/before/Example/Example/AppDelegate.m +49 -0
  91. data/spec/integration/build/before/Example/Example/Example-Info.plist +38 -0
  92. data/spec/integration/build/before/Example/Example/Example-Prefix.pch +16 -0
  93. data/spec/integration/build/before/Example/Example/Icons.bundle/tab_bar/tabbar_list.png +0 -0
  94. data/spec/integration/build/before/Example/Example/Icons.bundle/tab_bar/tabbar_list@2x.png +0 -0
  95. data/spec/integration/build/before/Example/Example/Icons.bundle/tab_bar/tabbar_map.png +0 -0
  96. data/spec/integration/build/before/Example/Example/Icons.bundle/tab_bar/tabbar_map@2x.png +0 -0
  97. data/spec/integration/build/before/Example/Example/Images/doge.jpeg +0 -0
  98. data/spec/integration/build/before/Example/Example/Images/nyanCat.png +0 -0
  99. data/spec/integration/build/before/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
  100. data/spec/integration/build/before/Example/Example/Images.xcassets/Doge.imageset/Contents.json +18 -0
  101. data/spec/integration/build/before/Example/Example/Images.xcassets/Doge.imageset/doge.png +0 -0
  102. data/spec/integration/build/before/Example/Example/Images.xcassets/Doge.imageset/doge@2x.png +0 -0
  103. data/spec/integration/build/before/Example/Example/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
  104. data/spec/integration/build/before/Example/Example/de.lproj/Localizable.strings +12 -0
  105. data/spec/integration/build/before/Example/Example/en.lproj/InfoPlist.strings +2 -0
  106. data/spec/integration/build/before/Example/Example/en.lproj/Localizable.strings +15 -0
  107. data/spec/integration/build/before/Example/Example/main.m +18 -0
  108. data/spec/integration/build/before/Example/Example.xcodeproj/project.pbxproj +453 -0
  109. data/spec/integration/build/before/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  110. data/spec/integration/build-keyword-clash/after/Example/Example/AppDelegate.h +15 -0
  111. data/spec/integration/build-keyword-clash/after/Example/Example/AppDelegate.m +49 -0
  112. data/spec/integration/build-keyword-clash/after/Example/Example/Default-568h@2x.png +0 -0
  113. data/spec/integration/build-keyword-clash/after/Example/Example/Default.png +0 -0
  114. data/spec/integration/build-keyword-clash/after/Example/Example/Default@2x.png +0 -0
  115. data/spec/integration/build-keyword-clash/after/Example/Example/Example-Info.plist +38 -0
  116. data/spec/integration/build-keyword-clash/after/Example/Example/Example-Prefix.pch +16 -0
  117. data/spec/integration/build-keyword-clash/after/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
  118. data/spec/integration/build-keyword-clash/after/Example/Example/en.lproj/InfoPlist.strings +2 -0
  119. data/spec/integration/build-keyword-clash/after/Example/Example/main.m +18 -0
  120. data/spec/integration/build-keyword-clash/after/Example/Example.xcodeproj.yaml +160 -0
  121. data/spec/integration/build-keyword-clash/after/R.h +15 -0
  122. data/spec/integration/build-keyword-clash/after/R.m +15 -0
  123. data/spec/integration/build-keyword-clash/after/execution_output.txt +14 -0
  124. data/spec/integration/build-keyword-clash/before/Example/Example/AppDelegate.h +15 -0
  125. data/spec/integration/build-keyword-clash/before/Example/Example/AppDelegate.m +49 -0
  126. data/spec/integration/build-keyword-clash/before/Example/Example/Default-568h@2x.png +0 -0
  127. data/spec/integration/build-keyword-clash/before/Example/Example/Default.png +0 -0
  128. data/spec/integration/build-keyword-clash/before/Example/Example/Default@2x.png +0 -0
  129. data/spec/integration/build-keyword-clash/before/Example/Example/Example-Info.plist +38 -0
  130. data/spec/integration/build-keyword-clash/before/Example/Example/Example-Prefix.pch +16 -0
  131. data/spec/integration/build-keyword-clash/before/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
  132. data/spec/integration/build-keyword-clash/before/Example/Example/en.lproj/InfoPlist.strings +2 -0
  133. data/spec/integration/build-keyword-clash/before/Example/Example/main.m +18 -0
  134. data/spec/integration/build-keyword-clash/before/Example/Example.xcodeproj/project.pbxproj +427 -0
  135. data/spec/integration/build-keyword-clash/before/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  136. data/spec/integration/build-var-infoplist/after/Example/Example/AppDelegate.h +15 -0
  137. data/spec/integration/build-var-infoplist/after/Example/Example/AppDelegate.m +49 -0
  138. data/spec/integration/build-var-infoplist/after/Example/Example/Example-Info.plist +38 -0
  139. data/spec/integration/build-var-infoplist/after/Example/Example/Example-Prefix.pch +16 -0
  140. data/spec/integration/build-var-infoplist/after/Example/Example/Icons.bundle/tab_bar/tabbar_list.png +0 -0
  141. data/spec/integration/build-var-infoplist/after/Example/Example/Icons.bundle/tab_bar/tabbar_list@2x.png +0 -0
  142. data/spec/integration/build-var-infoplist/after/Example/Example/Icons.bundle/tab_bar/tabbar_map.png +0 -0
  143. data/spec/integration/build-var-infoplist/after/Example/Example/Icons.bundle/tab_bar/tabbar_map@2x.png +0 -0
  144. data/spec/integration/build-var-infoplist/after/Example/Example/Images/doge.jpeg +0 -0
  145. data/spec/integration/build-var-infoplist/after/Example/Example/Images/nyanCat.png +0 -0
  146. data/spec/integration/build-var-infoplist/after/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
  147. data/spec/integration/build-var-infoplist/after/Example/Example/Images.xcassets/Doge.imageset/Contents.json +18 -0
  148. data/spec/integration/build-var-infoplist/after/Example/Example/Images.xcassets/Doge.imageset/doge.png +0 -0
  149. data/spec/integration/build-var-infoplist/after/Example/Example/Images.xcassets/Doge.imageset/doge@2x.png +0 -0
  150. data/spec/integration/build-var-infoplist/after/Example/Example/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
  151. data/spec/integration/build-var-infoplist/after/Example/Example/de.lproj/Localizable.strings +12 -0
  152. data/spec/integration/build-var-infoplist/after/Example/Example/en.lproj/InfoPlist.strings +2 -0
  153. data/spec/integration/build-var-infoplist/after/Example/Example/en.lproj/Localizable.strings +15 -0
  154. data/spec/integration/build-var-infoplist/after/Example/Example/main.m +18 -0
  155. data/spec/integration/build-var-infoplist/after/Example/Example.xcodeproj.yaml +168 -0
  156. data/spec/integration/build-var-infoplist/after/R.h +39 -0
  157. data/spec/integration/build-var-infoplist/after/R.m +29 -0
  158. data/spec/integration/build-var-infoplist/after/execution_output.txt +19 -0
  159. data/spec/integration/build-var-infoplist/before/Example/Example/AppDelegate.h +15 -0
  160. data/spec/integration/build-var-infoplist/before/Example/Example/AppDelegate.m +49 -0
  161. data/spec/integration/build-var-infoplist/before/Example/Example/Example-Info.plist +38 -0
  162. data/spec/integration/build-var-infoplist/before/Example/Example/Example-Prefix.pch +16 -0
  163. data/spec/integration/build-var-infoplist/before/Example/Example/Icons.bundle/tab_bar/tabbar_list.png +0 -0
  164. data/spec/integration/build-var-infoplist/before/Example/Example/Icons.bundle/tab_bar/tabbar_list@2x.png +0 -0
  165. data/spec/integration/build-var-infoplist/before/Example/Example/Icons.bundle/tab_bar/tabbar_map.png +0 -0
  166. data/spec/integration/build-var-infoplist/before/Example/Example/Icons.bundle/tab_bar/tabbar_map@2x.png +0 -0
  167. data/spec/integration/build-var-infoplist/before/Example/Example/Images/doge.jpeg +0 -0
  168. data/spec/integration/build-var-infoplist/before/Example/Example/Images/nyanCat.png +0 -0
  169. data/spec/integration/build-var-infoplist/before/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
  170. data/spec/integration/build-var-infoplist/before/Example/Example/Images.xcassets/Doge.imageset/Contents.json +18 -0
  171. data/spec/integration/build-var-infoplist/before/Example/Example/Images.xcassets/Doge.imageset/doge.png +0 -0
  172. data/spec/integration/build-var-infoplist/before/Example/Example/Images.xcassets/Doge.imageset/doge@2x.png +0 -0
  173. data/spec/integration/build-var-infoplist/before/Example/Example/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
  174. data/spec/integration/build-var-infoplist/before/Example/Example/de.lproj/Localizable.strings +12 -0
  175. data/spec/integration/build-var-infoplist/before/Example/Example/en.lproj/InfoPlist.strings +2 -0
  176. data/spec/integration/build-var-infoplist/before/Example/Example/en.lproj/Localizable.strings +15 -0
  177. data/spec/integration/build-var-infoplist/before/Example/Example/main.m +18 -0
  178. data/spec/integration/build-var-infoplist/before/Example/Example.xcodeproj/project.pbxproj +453 -0
  179. data/spec/integration/build-var-infoplist/before/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  180. data/spec/integration/help/after/execution_output.txt +18 -0
  181. data/spec/integration/help/before/.gitkeep +0 -0
  182. data/spec/integration/install/after/Example/Example/AppDelegate.h +15 -0
  183. data/spec/integration/install/after/Example/Example/AppDelegate.m +49 -0
  184. data/spec/integration/install/after/Example/Example/Example-Info.plist +38 -0
  185. data/spec/integration/install/after/Example/Example/Example-Prefix.pch +18 -0
  186. data/spec/integration/install/after/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
  187. data/spec/integration/install/after/Example/Example/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
  188. data/spec/integration/install/after/Example/Example/Resources/R.h +19 -0
  189. data/spec/integration/install/after/Example/Example/Resources/R.m +17 -0
  190. data/spec/integration/install/after/Example/Example/en.lproj/InfoPlist.strings +2 -0
  191. data/spec/integration/install/after/Example/Example/main.m +18 -0
  192. data/spec/integration/install/after/Example/Example.xcodeproj/project.pbxproj +898 -0
  193. data/spec/integration/install/after/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  194. data/spec/integration/install/after/Example/Example.xcodeproj.yaml +172 -0
  195. data/spec/integration/install/after/execution_output.txt +22 -0
  196. data/spec/integration/install/before/Example/Example/AppDelegate.h +15 -0
  197. data/spec/integration/install/before/Example/Example/AppDelegate.m +49 -0
  198. data/spec/integration/install/before/Example/Example/Example-Info.plist +38 -0
  199. data/spec/integration/install/before/Example/Example/Example-Prefix.pch +16 -0
  200. data/spec/integration/install/before/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
  201. data/spec/integration/install/before/Example/Example/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
  202. data/spec/integration/install/before/Example/Example/en.lproj/InfoPlist.strings +2 -0
  203. data/spec/integration/install/before/Example/Example/main.m +18 -0
  204. data/spec/integration/install/before/Example/Example.xcodeproj/project.pbxproj +421 -0
  205. data/spec/integration/install/before/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  206. data/spec/integration/install-again/after/Example/Example/AppDelegate.h +15 -0
  207. data/spec/integration/install-again/after/Example/Example/AppDelegate.m +49 -0
  208. data/spec/integration/install-again/after/Example/Example/Example-Info.plist +38 -0
  209. data/spec/integration/install-again/after/Example/Example/Example-Prefix.pch +18 -0
  210. data/spec/integration/install-again/after/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
  211. data/spec/integration/install-again/after/Example/Example/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
  212. data/spec/integration/install-again/after/Example/Example/Resources/R.h +19 -0
  213. data/spec/integration/install-again/after/Example/Example/Resources/R.m +17 -0
  214. data/spec/integration/install-again/after/Example/Example/en.lproj/InfoPlist.strings +2 -0
  215. data/spec/integration/install-again/after/Example/Example/main.m +18 -0
  216. data/spec/integration/install-again/after/Example/Example.xcodeproj.yaml +172 -0
  217. data/spec/integration/install-again/after/execution_output.txt +23 -0
  218. data/spec/integration/install-again/before/Example/Example/AppDelegate.h +15 -0
  219. data/spec/integration/install-again/before/Example/Example/AppDelegate.m +49 -0
  220. data/spec/integration/install-again/before/Example/Example/Example-Info.plist +38 -0
  221. data/spec/integration/install-again/before/Example/Example/Example-Prefix.pch +18 -0
  222. data/spec/integration/install-again/before/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
  223. data/spec/integration/install-again/before/Example/Example/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
  224. data/spec/integration/install-again/before/Example/Example/Resources/R.h +19 -0
  225. data/spec/integration/install-again/before/Example/Example/Resources/R.m +17 -0
  226. data/spec/integration/install-again/before/Example/Example/en.lproj/InfoPlist.strings +2 -0
  227. data/spec/integration/install-again/before/Example/Example/main.m +18 -0
  228. data/spec/integration/install-again/before/Example/Example.xcodeproj/project.pbxproj +898 -0
  229. data/spec/integration/install-again/before/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  230. data/spec/integration/install-moved-supporting-files/after/Example/Example.xcodeproj.yaml +173 -0
  231. data/spec/integration/install-moved-supporting-files/after/Example/Supporting_Files/Example-Info.plist +38 -0
  232. data/spec/integration/install-moved-supporting-files/after/Example/Supporting_Files/Example-Prefix.pch +18 -0
  233. data/spec/integration/install-moved-supporting-files/after/Example/Supporting_Files/Resources/R.h +19 -0
  234. data/spec/integration/install-moved-supporting-files/after/Example/Supporting_Files/Resources/R.m +17 -0
  235. data/spec/integration/install-moved-supporting-files/after/Example/Supporting_Files/en.lproj/InfoPlist.strings +2 -0
  236. data/spec/integration/install-moved-supporting-files/after/Example/Supporting_Files/main.m +18 -0
  237. data/spec/integration/install-moved-supporting-files/after/Example/res/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
  238. data/spec/integration/install-moved-supporting-files/after/Example/res/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
  239. data/spec/integration/install-moved-supporting-files/after/Example/src/AppDelegate.h +15 -0
  240. data/spec/integration/install-moved-supporting-files/after/Example/src/AppDelegate.m +49 -0
  241. data/spec/integration/install-moved-supporting-files/after/execution_output.txt +22 -0
  242. data/spec/integration/install-moved-supporting-files/before/Example/Example.xcodeproj/project.pbxproj +431 -0
  243. data/spec/integration/install-moved-supporting-files/before/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  244. data/spec/integration/install-moved-supporting-files/before/Example/Supporting_Files/Example-Info.plist +38 -0
  245. data/spec/integration/install-moved-supporting-files/before/Example/Supporting_Files/Example-Prefix.pch +16 -0
  246. data/spec/integration/install-moved-supporting-files/before/Example/Supporting_Files/en.lproj/InfoPlist.strings +2 -0
  247. data/spec/integration/install-moved-supporting-files/before/Example/Supporting_Files/main.m +18 -0
  248. data/spec/integration/install-moved-supporting-files/before/Example/res/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
  249. data/spec/integration/install-moved-supporting-files/before/Example/res/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
  250. data/spec/integration/install-moved-supporting-files/before/Example/src/AppDelegate.h +15 -0
  251. data/spec/integration/install-moved-supporting-files/before/Example/src/AppDelegate.m +49 -0
  252. data/spec/integration/install-no-supporting-files/after/Example/Example.xcodeproj.yaml +173 -0
  253. data/spec/integration/install-no-supporting-files/after/Example/Resources/R.h +19 -0
  254. data/spec/integration/install-no-supporting-files/after/Example/Resources/R.m +17 -0
  255. data/spec/integration/install-no-supporting-files/after/Example/Supporting_Files/Example-Info.plist +38 -0
  256. data/spec/integration/install-no-supporting-files/after/Example/Supporting_Files/Example-Prefix.pch +18 -0
  257. data/spec/integration/install-no-supporting-files/after/Example/Supporting_Files/en.lproj/InfoPlist.strings +2 -0
  258. data/spec/integration/install-no-supporting-files/after/Example/Supporting_Files/main.m +18 -0
  259. data/spec/integration/install-no-supporting-files/after/Example/res/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
  260. data/spec/integration/install-no-supporting-files/after/Example/res/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
  261. data/spec/integration/install-no-supporting-files/after/Example/src/AppDelegate.h +15 -0
  262. data/spec/integration/install-no-supporting-files/after/Example/src/AppDelegate.m +49 -0
  263. data/spec/integration/install-no-supporting-files/after/execution_output.txt +23 -0
  264. data/spec/integration/install-no-supporting-files/before/Example/Example.xcodeproj/project.pbxproj +430 -0
  265. data/spec/integration/install-no-supporting-files/before/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  266. data/spec/integration/install-no-supporting-files/before/Example/Supporting_Files/Example-Info.plist +38 -0
  267. data/spec/integration/install-no-supporting-files/before/Example/Supporting_Files/Example-Prefix.pch +16 -0
  268. data/spec/integration/install-no-supporting-files/before/Example/Supporting_Files/en.lproj/InfoPlist.strings +2 -0
  269. data/spec/integration/install-no-supporting-files/before/Example/Supporting_Files/main.m +18 -0
  270. data/spec/integration/install-no-supporting-files/before/Example/res/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
  271. data/spec/integration/install-no-supporting-files/before/Example/res/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
  272. data/spec/integration/install-no-supporting-files/before/Example/src/AppDelegate.h +15 -0
  273. data/spec/integration/install-no-supporting-files/before/Example/src/AppDelegate.m +49 -0
  274. data/spec/integration/version/after/execution_output.txt +3 -0
  275. data/spec/integration/version/before/.gitkeep +0 -0
  276. data/spec/integration.rb +86 -0
  277. data/spec/spec_helper/xcodeproj_project_yaml.rb +26 -0
  278. data/spec/unit/analyzer/aggregate_analyzer_spec.rb +61 -0
  279. data/spec/unit/analyzer/analyzer_spec.rb +123 -0
  280. data/spec/unit/analyzer/resources_aggregate_analyzer_spec.rb +46 -0
  281. data/spec/unit/analyzer/resources_analyzer/base_resources_analyzer_spec.rb +126 -0
  282. data/spec/unit/analyzer/resources_analyzer/bundle_resources_analyzer_spec.rb +57 -0
  283. data/spec/unit/analyzer/resources_analyzer/loose_resources_analyzer_spec.rb +22 -0
  284. data/spec/unit/analyzer/strings_analyzer_spec.rb +99 -0
  285. data/spec/unit/builder/file_builder_spec.rb +46 -0
  286. data/spec/unit/builder/resources_builder_spec.rb +50 -0
  287. data/spec/unit/builder/string_builder_spec.rb +76 -0
  288. data/spec/unit/command/main_command_spec.rb +5 -0
  289. data/spec/unit/command/project_command_spec.rb +23 -0
  290. data/spec/unit/helper/file_helper_spec.rb +24 -0
  291. data/spec/unit/logger_spec.rb +142 -0
  292. data/spec/unit/model/section_spec.rb +47 -0
  293. data/spec/unit/model/xcassets/bundle_spec.rb +154 -0
  294. data/spec/unit/model/xcassets/resource_image_spec.rb +141 -0
  295. data/spec/unit/model/xcassets/resource_spec.rb +174 -0
  296. data/spec/unit/model/xcassets/spec_helper.rb +31 -0
  297. data/spec/unit/spec_helper.rb +17 -0
  298. data/xcres.gemspec +42 -0
  299. metadata +811 -0
@@ -0,0 +1,148 @@
1
+ #encoding: utf-8
2
+
3
+ require 'colored'
4
+
5
+ # A Logger utility help class
6
+ #
7
+ class XCRes::Logger
8
+
9
+ # @return [Bool]
10
+ # if set to false, calls to #log will be ignored
11
+ # otherwise they will be printed, false by default.
12
+ attr_accessor :verbose
13
+ alias :verbose? verbose
14
+
15
+ # @return [Bool]
16
+ # if set to true, all log calls of all kinds will be ignored
17
+ # otherwise they will be printed, false by default.
18
+ attr_accessor :silent
19
+ alias :silent? silent
20
+
21
+ # @return [Bool]
22
+ # if set to true, ANSI colors will be used to color the output
23
+ # otherwise it will output plain text, true by default.
24
+ attr_accessor :colored
25
+ alias :colored? colored
26
+
27
+ # @return [String]
28
+ # the indentation of the output, empty string by default.
29
+ attr_accessor :indentation
30
+
31
+ # Initialize a new logger
32
+ #
33
+ def initialize
34
+ self.silent = false
35
+ self.verbose = false
36
+ self.colored = true
37
+ self.indentation = ''
38
+ end
39
+
40
+ # Prints a formatted message
41
+ #
42
+ # @param [String] message
43
+ # the message, which can have format placeholders
44
+ #
45
+ # @param [#to_s...] format_args
46
+ # will be passed as right hand side to the percent operator,
47
+ # which will fill the format placeholders used in the message
48
+ #
49
+ def inform message, *format_args
50
+ puts indentation + message % format_args unless silent?
51
+ end
52
+
53
+ # Prints a formatted message in a given color, and prints its arguments
54
+ # with bold font weight
55
+ #
56
+ # @param [String] message
57
+ # the message, which can have format placeholders
58
+ #
59
+ # @param [Symbol] color
60
+ # the color, String has to #respond_to? this
61
+ #
62
+ # @param [#to_s...] format_args
63
+ # will be passed as right hand side to the percent operator,
64
+ # which will fill the format placeholders used in the message
65
+ #
66
+ def inform_colored message, color, *format_args
67
+ if colored?
68
+ parts = message
69
+ .gsub(/%[\ +#]?\d*\.?\d*[a-z]/, "\0"+'\0'+"\0")
70
+ .split("\0")
71
+ .reject(&:empty?)
72
+ message = parts.map do |part|
73
+ if part[0] == '%' && part[1] != '%'
74
+ (part % format_args.shift).bold.gsub('%', '%%')
75
+ else
76
+ part
77
+ end
78
+ end.map(&color).join('')
79
+ end
80
+ inform message, *format_args
81
+ end
82
+
83
+ # Print a log message of log level verbose
84
+ #
85
+ # @param [String] message
86
+ # the message, which can have format placeholders
87
+ #
88
+ # @param [#to_s...] format_args
89
+ # will be passed as right hand side to the percent operator,
90
+ # which will fill the format placeholders used in the message
91
+ #
92
+ def log message, *format_args
93
+ inform_colored 'Ⓥ' + ' ' + message, :magenta, *format_args if verbose?
94
+ end
95
+
96
+ # Print a log message to indicate success of an operation in green color
97
+ #
98
+ # @param [String] message
99
+ # the message, which can have format placeholders
100
+ #
101
+ # @param [#to_s...] format_args
102
+ # will be passed as right hand side to the percent operator,
103
+ # which will fill the format placeholders used in the message
104
+ #
105
+ def success message, *format_args
106
+ inform_colored '✓' + ' ' + message, :green, *format_args
107
+ end
108
+
109
+ # Print a warning log message in yellow color
110
+ #
111
+ # @param [String] message
112
+ # the message, which can have format placeholders
113
+ #
114
+ # @param [#to_s...] format_args
115
+ # will be passed as right hand side to the percent operator,
116
+ # which will fill the format placeholders used in the message
117
+ #
118
+ def warn message, *format_args
119
+ inform_colored '⚠' + ' ' + message, :yellow, *format_args
120
+ end
121
+
122
+ # Print a log message to indicate failure of an operation in red color
123
+ #
124
+ # @param [String|Exception] message
125
+ # The message, which can have format placeholders,
126
+ # can also be a kind of Exception, then its message would been
127
+ # used instead. The backtrace will be only printed, if the verbose
128
+ # mode is enabled.
129
+ #
130
+ # @param [#to_s...] format_args
131
+ # will be passed as right hand side to the percent operator,
132
+ # which will fill the format placeholders used in the message
133
+ #
134
+ def fail message, *format_args
135
+ exception = nil
136
+ if message.kind_of? Exception
137
+ exception = message
138
+ message = exception.message
139
+ end
140
+
141
+ inform_colored '✗' + ' ' + message, :red, *format_args
142
+
143
+ if verbose? && exception != nil
144
+ log "Backtrace:\n"+exception.backtrace.join("\n"), :red
145
+ end
146
+ end
147
+
148
+ end
@@ -0,0 +1,43 @@
1
+ module XCRes
2
+ class Section
3
+
4
+ # @return [String]
5
+ # the name / key of the section
6
+ attr_reader :name
7
+
8
+ # @return [Hash{String => String|Hash}]
9
+ # the items of the section
10
+ attr_reader :items
11
+
12
+ # @return [Hash]
13
+ # options of the section for serialization
14
+ attr_accessor :options
15
+
16
+ # Initialize a new section
17
+ #
18
+ # @param [String] name
19
+ # see #name
20
+ #
21
+ # @param [Hash] items
22
+ # see #items
23
+ #
24
+ # @param [Hash] options
25
+ # see #options
26
+ #
27
+ #
28
+ def initialize(name, items, options={})
29
+ @name = name
30
+ @items = items
31
+ @options = options
32
+ end
33
+
34
+ def ==(other)
35
+ self.name == other.name \
36
+ && self.items == other.items \
37
+ && self.options == other.options
38
+ end
39
+
40
+ alias eql? ==
41
+
42
+ end
43
+ end
@@ -0,0 +1,55 @@
1
+ require 'xcres/model/xcassets/resource'
2
+
3
+ module XCRes::XCAssets
4
+
5
+ # Represents the whole asset catalog
6
+ #
7
+ class Bundle
8
+
9
+ # @return [Pathname]
10
+ #
11
+ attr_accessor :path
12
+
13
+ # @return [Array<Pathname>]
14
+ # the paths of the resources contained, relative to the container
15
+ # given by #path.
16
+ attr_accessor :resource_paths
17
+
18
+ # @return [Array<Resource>]
19
+ # the parsed resources
20
+ attr_accessor :resources
21
+
22
+ # Open a XCAssets collection at a given path
23
+ #
24
+ # @return [XCAssets::Bundle]
25
+ #
26
+ def self.open(path)
27
+ self.new(path).read
28
+ end
29
+
30
+ # Initialize a new file with given path
31
+ #
32
+ # @param [Pathname] path
33
+ # the location of the container
34
+ #
35
+ def initialize(path = nil)
36
+ @path = Pathname(path) unless path.nil?
37
+ @resources = []
38
+ end
39
+
40
+ # Read the resources from disk
41
+ #
42
+ # @return [XCAssets::Bundle]
43
+ #
44
+ def read
45
+ @resource_paths = Dir.chdir(path) do
46
+ Dir['*'].map { |p| Pathname(p) }
47
+ end
48
+ @resources = @resource_paths.map do |path|
49
+ Resource.new(self, path)
50
+ end
51
+ self
52
+ end
53
+ end
54
+
55
+ end
@@ -0,0 +1,141 @@
1
+ require 'json'
2
+ require 'xcres/helper/file_helper'
3
+ require 'xcres/model/xcassets/resource_image'
4
+
5
+ module XCRes::XCAssets
6
+
7
+ # Represents a single resource of an asset catalog
8
+ #
9
+ class Resource
10
+ include XCRes::FileHelper
11
+
12
+ # @return [XCAssets::Bundle]
13
+ # the whole bundle
14
+ attr_accessor :bundle
15
+
16
+ # @return [Pathname]
17
+ # the directory name
18
+ attr_accessor :path
19
+
20
+ # @return [Hash]
21
+ # file meta info
22
+ attr_accessor :info
23
+
24
+ # @return [Array<ResourceImage>]
25
+ # the images contained in this resource
26
+ attr_accessor :images
27
+
28
+ # Initialize a new resource
29
+ #
30
+ # @param [XCAssets:Bundle]
31
+ # the containing bundle
32
+ #
33
+ # @param [Pathname]
34
+ # see #path.
35
+ #
36
+ def initialize(bundle, path)
37
+ self.bundle = bundle
38
+ self.path = path
39
+ end
40
+
41
+ # Return the name of the resource
42
+ #
43
+ # @return [String]
44
+ #
45
+ def name
46
+ @name ||= basename_without_ext path
47
+ end
48
+
49
+ # Return the type of the resource,
50
+ # e.g. 'appiconset', 'imageset', 'launchimage'
51
+ #
52
+ # @return [String]
53
+ #
54
+ def type
55
+ @type ||= File.extname(path).sub(/^./, '')
56
+ end
57
+
58
+ # Lazy read the info, if not initialized
59
+ #
60
+ # @return [Hash]
61
+ #
62
+ def info
63
+ @info ||= read_info
64
+ end
65
+
66
+ # Lazy read the images, if not initialized
67
+ #
68
+ # @return [Array<XCAssets::ResourceImage>]
69
+ #
70
+ def images
71
+ @images ||= read_images
72
+ end
73
+
74
+ # Serialize to hash
75
+ #
76
+ # @return [Hash]
77
+ #
78
+ def to_hash
79
+ {
80
+ 'images' => images.map(&:to_hash),
81
+ 'info' => info,
82
+ }
83
+ end
84
+
85
+ protected
86
+
87
+ # The path of the Contents.json file
88
+ #
89
+ # @return [Pathname]
90
+ #
91
+ def json_path
92
+ bundle.path + path + 'Contents.json'
93
+ end
94
+
95
+ # Parse the Content.json file
96
+ #
97
+ # @return [Hash]
98
+ #
99
+ def parsed_contents
100
+ @hash ||= JSON.parse File.read(json_path)
101
+ end
102
+
103
+ # Deserialize #contents.
104
+ #
105
+ # @return [XCAssets::Resource]
106
+ #
107
+ def read
108
+ @info = read_info
109
+ @images = read_images
110
+ self
111
+ end
112
+
113
+ # Deserialize the file info from the #contents.
114
+ #
115
+ # @return [Hash]
116
+ #
117
+ def read_info
118
+ parsed_contents['info'] || {}
119
+ end
120
+
121
+ # Deserialize the images from the #contents.
122
+ #
123
+ # @return [Array<XCAssets::ResourceImage>]
124
+ #
125
+ def read_images
126
+ return [] if parsed_contents['images'].nil?
127
+ parsed_contents['images'].map do |img_hash|
128
+ ResourceImage.read(img_hash)
129
+ end
130
+ end
131
+
132
+ def ==(other)
133
+ return false unless other.respond_to?(:to_hash)
134
+ self.to_hash == other.to_hash
135
+ end
136
+
137
+ alias eql? ==
138
+
139
+ end
140
+
141
+ end
@@ -0,0 +1,134 @@
1
+ require 'active_support/core_ext/string/inflections'
2
+
3
+ module XCRes::XCAssets
4
+
5
+ # Represents a single image of a resource in an asset catalog
6
+ #
7
+ class ResourceImage
8
+
9
+ # The known keys
10
+ KNOWN_KEYS = [
11
+ :filename,
12
+ :scale,
13
+ :orientation,
14
+ :size,
15
+ :idiom,
16
+ :subtype,
17
+ :extent,
18
+ :minimum_system_version
19
+ ].freeze
20
+
21
+ # @return [Pathname]
22
+ # file name
23
+ attr_accessor :filename
24
+
25
+ # @return [Integer]
26
+ # scale of the image
27
+ attr_accessor :scale
28
+
29
+ # @return [Symbol]
30
+ # the orientation, e.g. 'portrait'
31
+ attr_accessor :orientation
32
+
33
+ # @return [String]
34
+ # the size, e.g. '29x29', '40x40'
35
+ attr_accessor :size
36
+
37
+ # @return [Symbol]
38
+ # the idiom, e.g. 'iphone'
39
+ attr_accessor :idiom
40
+
41
+ # @return [Symbol]
42
+ # the subtype, e.g. 'retina4'
43
+ attr_accessor :subtype
44
+
45
+ # @return [Symbol]
46
+ # the extent, e.g. 'full-screen'
47
+ attr_accessor :extent
48
+
49
+ # @return [String]
50
+ # the minimum system version, e.g. '7.0'
51
+ attr_accessor :minimum_system_version
52
+
53
+ # @return [Hash{Symbol => String}]
54
+ # further attributes, not mapped to a specific attribute
55
+ attr_accessor :attributes
56
+
57
+ # Read from hash
58
+ #
59
+ # @param [Hash]
60
+ # the hash to deserialize
61
+ #
62
+ # @return [ResourceImage]
63
+ #
64
+ def self.read(hash)
65
+ self.new.read(hash)
66
+ end
67
+
68
+ # Initialize a new ResourceImage
69
+ #
70
+ # @param [Hash]
71
+ # the initial attribute values
72
+ #
73
+ def initialize(attributes={})
74
+ self.scale = attributes.delete('scale') unless attributes['scale'].nil?
75
+
76
+ KNOWN_KEYS.each do |key|
77
+ self.send "#{key}=".to_sym, attributes.delete(key)
78
+ end
79
+
80
+ self.attributes = attributes
81
+ end
82
+
83
+ # Read from hash
84
+ #
85
+ # @param [Hash]
86
+ # the hash to deserialize
87
+ #
88
+ # @return [ResourceImage]
89
+ #
90
+ def read(hash)
91
+ self.scale = hash.delete('scale').sub(/x$/, '').to_i unless hash['scale'].nil?
92
+
93
+ KNOWN_KEYS.each do |key|
94
+ value = hash.delete(key.to_s.dasherize)
95
+ next if value.nil?
96
+ self.send "#{key}=".to_sym, value
97
+ end
98
+
99
+ self.attributes = hash
100
+
101
+ return self
102
+ end
103
+
104
+ # Serialize to hash
105
+ #
106
+ # @return [Hash{String => String}]
107
+ #
108
+ def to_hash
109
+ hash = {}
110
+
111
+ hash['scale'] = "#{scale}x" unless scale.nil?
112
+
113
+ (KNOWN_KEYS - [:scale]).each do |key|
114
+ value = self.send(key)
115
+ hash[key.to_s.dasherize] = value.to_s unless value.nil?
116
+ end
117
+
118
+ attributes.each do |key, value|
119
+ hash[key.to_s] = value
120
+ end
121
+
122
+ hash
123
+ end
124
+
125
+ def ==(other)
126
+ return false unless other.respond_to?(:to_hash)
127
+ self.to_hash == other.to_hash
128
+ end
129
+
130
+ alias eql? ==
131
+
132
+ end
133
+
134
+ end
@@ -0,0 +1,9 @@
1
+ module XCRes
2
+
3
+ # @return [String]
4
+ #
5
+ # XCRes’s version, following [semver](http://semver.org).
6
+ #
7
+ VERSION = "0.4.0"
8
+
9
+ end
data/lib/xcres.rb ADDED
@@ -0,0 +1,9 @@
1
+ require 'pathname'
2
+ require 'active_support/core_ext/string/strip'
3
+ require 'active_support/core_ext/string/inflections'
4
+ require 'active_support/core_ext/array/conversions'
5
+
6
+ module XCRes
7
+ require 'xcres/version'
8
+ require 'xcres/command/main_command'
9
+ end
@@ -0,0 +1,15 @@
1
+ //
2
+ // AppDelegate.h
3
+ // Example
4
+ //
5
+ // Created by Marius Rackwitz on 01.05.14.
6
+ // Copyright (c) 2014 XCRes. All rights reserved.
7
+ //
8
+
9
+ #import <UIKit/UIKit.h>
10
+
11
+ @interface AppDelegate : UIResponder <UIApplicationDelegate>
12
+
13
+ @property (strong, nonatomic) UIWindow *window;
14
+
15
+ @end
@@ -0,0 +1,49 @@
1
+ //
2
+ // AppDelegate.m
3
+ // Example
4
+ //
5
+ // Created by Marius Rackwitz on 01.05.14.
6
+ // Copyright (c) 2014 XCRes. All rights reserved.
7
+ //
8
+
9
+ #import "AppDelegate.h"
10
+
11
+ @implementation AppDelegate
12
+
13
+ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
14
+ {
15
+ self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
16
+ // Override point for customization after application launch.
17
+ self.window.backgroundColor = [UIColor whiteColor];
18
+ [self.window makeKeyAndVisible];
19
+ return YES;
20
+ }
21
+
22
+ - (void)applicationWillResignActive:(UIApplication *)application
23
+ {
24
+ // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
25
+ // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
26
+ }
27
+
28
+ - (void)applicationDidEnterBackground:(UIApplication *)application
29
+ {
30
+ // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
31
+ // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
32
+ }
33
+
34
+ - (void)applicationWillEnterForeground:(UIApplication *)application
35
+ {
36
+ // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
37
+ }
38
+
39
+ - (void)applicationDidBecomeActive:(UIApplication *)application
40
+ {
41
+ // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
42
+ }
43
+
44
+ - (void)applicationWillTerminate:(UIApplication *)application
45
+ {
46
+ // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
47
+ }
48
+
49
+ @end
@@ -0,0 +1,38 @@
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>CFBundleDevelopmentRegion</key>
6
+ <string>en</string>
7
+ <key>CFBundleDisplayName</key>
8
+ <string>${PRODUCT_NAME}</string>
9
+ <key>CFBundleExecutable</key>
10
+ <string>${EXECUTABLE_NAME}</string>
11
+ <key>CFBundleIdentifier</key>
12
+ <string>io.github.xcres.${PRODUCT_NAME:rfc1034identifier}</string>
13
+ <key>CFBundleInfoDictionaryVersion</key>
14
+ <string>6.0</string>
15
+ <key>CFBundleName</key>
16
+ <string>${PRODUCT_NAME}</string>
17
+ <key>CFBundlePackageType</key>
18
+ <string>APPL</string>
19
+ <key>CFBundleShortVersionString</key>
20
+ <string>1.0</string>
21
+ <key>CFBundleSignature</key>
22
+ <string>????</string>
23
+ <key>CFBundleVersion</key>
24
+ <string>1.0</string>
25
+ <key>LSRequiresIPhoneOS</key>
26
+ <true/>
27
+ <key>UIRequiredDeviceCapabilities</key>
28
+ <array>
29
+ <string>armv7</string>
30
+ </array>
31
+ <key>UISupportedInterfaceOrientations</key>
32
+ <array>
33
+ <string>UIInterfaceOrientationPortrait</string>
34
+ <string>UIInterfaceOrientationLandscapeLeft</string>
35
+ <string>UIInterfaceOrientationLandscapeRight</string>
36
+ </array>
37
+ </dict>
38
+ </plist>
@@ -0,0 +1,16 @@
1
+ //
2
+ // Prefix header
3
+ //
4
+ // The contents of this file are implicitly included at the beginning of every source file.
5
+ //
6
+
7
+ #import <Availability.h>
8
+
9
+ #ifndef __IPHONE_3_0
10
+ #warning "This project uses features only available in iOS SDK 3.0 and later."
11
+ #endif
12
+
13
+ #ifdef __OBJC__
14
+ #import <UIKit/UIKit.h>
15
+ #import <Foundation/Foundation.h>
16
+ #endif
@@ -0,0 +1,23 @@
1
+ {
2
+ "images" : [
3
+ {
4
+ "idiom" : "iphone",
5
+ "size" : "29x29",
6
+ "scale" : "2x"
7
+ },
8
+ {
9
+ "idiom" : "iphone",
10
+ "size" : "40x40",
11
+ "scale" : "2x"
12
+ },
13
+ {
14
+ "idiom" : "iphone",
15
+ "size" : "60x60",
16
+ "scale" : "2x"
17
+ }
18
+ ],
19
+ "info" : {
20
+ "version" : 1,
21
+ "author" : "xcode"
22
+ }
23
+ }