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.
- checksums.yaml +7 -0
- data/.gitignore +33 -0
- data/.travis.yml +18 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +85 -0
- data/LICENSE.txt +22 -0
- data/README.md +181 -0
- data/Rakefile +58 -0
- data/bin/xcres +12 -0
- data/lib/xcres/analyzer/aggregate_analyzer.rb +48 -0
- data/lib/xcres/analyzer/analyzer.rb +141 -0
- data/lib/xcres/analyzer/resources_aggregate_analyzer.rb +27 -0
- data/lib/xcres/analyzer/resources_analyzer/base_resources_analyzer.rb +133 -0
- data/lib/xcres/analyzer/resources_analyzer/bundle_resources_analyzer.rb +68 -0
- data/lib/xcres/analyzer/resources_analyzer/loose_resources_analyzer.rb +39 -0
- data/lib/xcres/analyzer/resources_analyzer/xcassets_analyzer.rb +62 -0
- data/lib/xcres/analyzer/strings_analyzer.rb +255 -0
- data/lib/xcres/builder/file_builder.rb +61 -0
- data/lib/xcres/builder/resources_builder.rb +184 -0
- data/lib/xcres/builder/string_builder.rb +31 -0
- data/lib/xcres/command/build_command.rb +83 -0
- data/lib/xcres/command/command.rb +58 -0
- data/lib/xcres/command/install_command.rb +173 -0
- data/lib/xcres/command/main_command.rb +14 -0
- data/lib/xcres/command/project_command.rb +111 -0
- data/lib/xcres/command/version_command.rb +12 -0
- data/lib/xcres/helper/file_helper.rb +16 -0
- data/lib/xcres/logger.rb +148 -0
- data/lib/xcres/model/section.rb +43 -0
- data/lib/xcres/model/xcassets/bundle.rb +55 -0
- data/lib/xcres/model/xcassets/resource.rb +141 -0
- data/lib/xcres/model/xcassets/resource_image.rb +134 -0
- data/lib/xcres/version.rb +9 -0
- data/lib/xcres.rb +9 -0
- data/spec/fixtures/Example/Example/AppDelegate.h +15 -0
- data/spec/fixtures/Example/Example/AppDelegate.m +49 -0
- data/spec/fixtures/Example/Example/Example-Info.plist +38 -0
- data/spec/fixtures/Example/Example/Example-Prefix.pch +16 -0
- data/spec/fixtures/Example/Example/Images/doge.jpeg +0 -0
- data/spec/fixtures/Example/Example/Images/nyanCat.png +0 -0
- data/spec/fixtures/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
- data/spec/fixtures/Example/Example/Images.xcassets/Doge.imageset/Contents.json +18 -0
- data/spec/fixtures/Example/Example/Images.xcassets/Doge.imageset/doge.png +0 -0
- data/spec/fixtures/Example/Example/Images.xcassets/Doge.imageset/doge@2x.png +0 -0
- data/spec/fixtures/Example/Example/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
- data/spec/fixtures/Example/Example/de.lproj/Localizable.strings +12 -0
- data/spec/fixtures/Example/Example/en.lproj/InfoPlist.strings +2 -0
- data/spec/fixtures/Example/Example/en.lproj/Localizable.strings +15 -0
- data/spec/fixtures/Example/Example/main.m +18 -0
- data/spec/fixtures/Example/Example.xcodeproj/project.pbxproj +449 -0
- data/spec/fixtures/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- data/spec/fixtures/ExampleOSX/ExampleOSX/AppDelegate.h +15 -0
- data/spec/fixtures/ExampleOSX/ExampleOSX/AppDelegate.m +18 -0
- data/spec/fixtures/ExampleOSX/ExampleOSX/Base.lproj/MainMenu.xib +680 -0
- data/spec/fixtures/ExampleOSX/ExampleOSX/ExampleOSX-Info.plist +34 -0
- data/spec/fixtures/ExampleOSX/ExampleOSX/ExampleOSX-Prefix.pch +9 -0
- data/spec/fixtures/ExampleOSX/ExampleOSX/Images.xcassets/AppIcon.appiconset/Contents.json +58 -0
- data/spec/fixtures/ExampleOSX/ExampleOSX/en.lproj/Credits.rtf +29 -0
- data/spec/fixtures/ExampleOSX/ExampleOSX/en.lproj/InfoPlist.strings +2 -0
- data/spec/fixtures/ExampleOSX/ExampleOSX/main.m +14 -0
- data/spec/fixtures/ExampleOSX/ExampleOSX.xcodeproj/project.pbxproj +481 -0
- data/spec/fixtures/ExampleOSX/ExampleOSX.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- data/spec/fixtures/ExampleOSX/ExampleOSXTests/ExampleOSXTests-Info.plist +22 -0
- data/spec/fixtures/ExampleOSX/ExampleOSXTests/ExampleOSXTests.m +34 -0
- data/spec/fixtures/ExampleOSX/ExampleOSXTests/en.lproj/InfoPlist.strings +2 -0
- data/spec/integration/build/after/Example/Example/AppDelegate.h +15 -0
- data/spec/integration/build/after/Example/Example/AppDelegate.m +49 -0
- data/spec/integration/build/after/Example/Example/Example-Info.plist +38 -0
- data/spec/integration/build/after/Example/Example/Example-Prefix.pch +16 -0
- data/spec/integration/build/after/Example/Example/Icons.bundle/tab_bar/tabbar_list.png +0 -0
- data/spec/integration/build/after/Example/Example/Icons.bundle/tab_bar/tabbar_list@2x.png +0 -0
- data/spec/integration/build/after/Example/Example/Icons.bundle/tab_bar/tabbar_map.png +0 -0
- data/spec/integration/build/after/Example/Example/Icons.bundle/tab_bar/tabbar_map@2x.png +0 -0
- data/spec/integration/build/after/Example/Example/Images/doge.jpeg +0 -0
- data/spec/integration/build/after/Example/Example/Images/nyanCat.png +0 -0
- data/spec/integration/build/after/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
- data/spec/integration/build/after/Example/Example/Images.xcassets/Doge.imageset/Contents.json +18 -0
- data/spec/integration/build/after/Example/Example/Images.xcassets/Doge.imageset/doge.png +0 -0
- data/spec/integration/build/after/Example/Example/Images.xcassets/Doge.imageset/doge@2x.png +0 -0
- data/spec/integration/build/after/Example/Example/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
- data/spec/integration/build/after/Example/Example/de.lproj/Localizable.strings +12 -0
- data/spec/integration/build/after/Example/Example/en.lproj/InfoPlist.strings +2 -0
- data/spec/integration/build/after/Example/Example/en.lproj/Localizable.strings +15 -0
- data/spec/integration/build/after/Example/Example/main.m +18 -0
- data/spec/integration/build/after/Example/Example.xcodeproj.yaml +168 -0
- data/spec/integration/build/after/R.h +39 -0
- data/spec/integration/build/after/R.m +29 -0
- data/spec/integration/build/after/execution_output.txt +19 -0
- data/spec/integration/build/before/Example/Example/AppDelegate.h +15 -0
- data/spec/integration/build/before/Example/Example/AppDelegate.m +49 -0
- data/spec/integration/build/before/Example/Example/Example-Info.plist +38 -0
- data/spec/integration/build/before/Example/Example/Example-Prefix.pch +16 -0
- data/spec/integration/build/before/Example/Example/Icons.bundle/tab_bar/tabbar_list.png +0 -0
- data/spec/integration/build/before/Example/Example/Icons.bundle/tab_bar/tabbar_list@2x.png +0 -0
- data/spec/integration/build/before/Example/Example/Icons.bundle/tab_bar/tabbar_map.png +0 -0
- data/spec/integration/build/before/Example/Example/Icons.bundle/tab_bar/tabbar_map@2x.png +0 -0
- data/spec/integration/build/before/Example/Example/Images/doge.jpeg +0 -0
- data/spec/integration/build/before/Example/Example/Images/nyanCat.png +0 -0
- data/spec/integration/build/before/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
- data/spec/integration/build/before/Example/Example/Images.xcassets/Doge.imageset/Contents.json +18 -0
- data/spec/integration/build/before/Example/Example/Images.xcassets/Doge.imageset/doge.png +0 -0
- data/spec/integration/build/before/Example/Example/Images.xcassets/Doge.imageset/doge@2x.png +0 -0
- data/spec/integration/build/before/Example/Example/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
- data/spec/integration/build/before/Example/Example/de.lproj/Localizable.strings +12 -0
- data/spec/integration/build/before/Example/Example/en.lproj/InfoPlist.strings +2 -0
- data/spec/integration/build/before/Example/Example/en.lproj/Localizable.strings +15 -0
- data/spec/integration/build/before/Example/Example/main.m +18 -0
- data/spec/integration/build/before/Example/Example.xcodeproj/project.pbxproj +453 -0
- data/spec/integration/build/before/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- data/spec/integration/build-keyword-clash/after/Example/Example/AppDelegate.h +15 -0
- data/spec/integration/build-keyword-clash/after/Example/Example/AppDelegate.m +49 -0
- data/spec/integration/build-keyword-clash/after/Example/Example/Default-568h@2x.png +0 -0
- data/spec/integration/build-keyword-clash/after/Example/Example/Default.png +0 -0
- data/spec/integration/build-keyword-clash/after/Example/Example/Default@2x.png +0 -0
- data/spec/integration/build-keyword-clash/after/Example/Example/Example-Info.plist +38 -0
- data/spec/integration/build-keyword-clash/after/Example/Example/Example-Prefix.pch +16 -0
- data/spec/integration/build-keyword-clash/after/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
- data/spec/integration/build-keyword-clash/after/Example/Example/en.lproj/InfoPlist.strings +2 -0
- data/spec/integration/build-keyword-clash/after/Example/Example/main.m +18 -0
- data/spec/integration/build-keyword-clash/after/Example/Example.xcodeproj.yaml +160 -0
- data/spec/integration/build-keyword-clash/after/R.h +15 -0
- data/spec/integration/build-keyword-clash/after/R.m +15 -0
- data/spec/integration/build-keyword-clash/after/execution_output.txt +14 -0
- data/spec/integration/build-keyword-clash/before/Example/Example/AppDelegate.h +15 -0
- data/spec/integration/build-keyword-clash/before/Example/Example/AppDelegate.m +49 -0
- data/spec/integration/build-keyword-clash/before/Example/Example/Default-568h@2x.png +0 -0
- data/spec/integration/build-keyword-clash/before/Example/Example/Default.png +0 -0
- data/spec/integration/build-keyword-clash/before/Example/Example/Default@2x.png +0 -0
- data/spec/integration/build-keyword-clash/before/Example/Example/Example-Info.plist +38 -0
- data/spec/integration/build-keyword-clash/before/Example/Example/Example-Prefix.pch +16 -0
- data/spec/integration/build-keyword-clash/before/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
- data/spec/integration/build-keyword-clash/before/Example/Example/en.lproj/InfoPlist.strings +2 -0
- data/spec/integration/build-keyword-clash/before/Example/Example/main.m +18 -0
- data/spec/integration/build-keyword-clash/before/Example/Example.xcodeproj/project.pbxproj +427 -0
- data/spec/integration/build-keyword-clash/before/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- data/spec/integration/build-var-infoplist/after/Example/Example/AppDelegate.h +15 -0
- data/spec/integration/build-var-infoplist/after/Example/Example/AppDelegate.m +49 -0
- data/spec/integration/build-var-infoplist/after/Example/Example/Example-Info.plist +38 -0
- data/spec/integration/build-var-infoplist/after/Example/Example/Example-Prefix.pch +16 -0
- data/spec/integration/build-var-infoplist/after/Example/Example/Icons.bundle/tab_bar/tabbar_list.png +0 -0
- data/spec/integration/build-var-infoplist/after/Example/Example/Icons.bundle/tab_bar/tabbar_list@2x.png +0 -0
- data/spec/integration/build-var-infoplist/after/Example/Example/Icons.bundle/tab_bar/tabbar_map.png +0 -0
- data/spec/integration/build-var-infoplist/after/Example/Example/Icons.bundle/tab_bar/tabbar_map@2x.png +0 -0
- data/spec/integration/build-var-infoplist/after/Example/Example/Images/doge.jpeg +0 -0
- data/spec/integration/build-var-infoplist/after/Example/Example/Images/nyanCat.png +0 -0
- data/spec/integration/build-var-infoplist/after/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
- data/spec/integration/build-var-infoplist/after/Example/Example/Images.xcassets/Doge.imageset/Contents.json +18 -0
- data/spec/integration/build-var-infoplist/after/Example/Example/Images.xcassets/Doge.imageset/doge.png +0 -0
- data/spec/integration/build-var-infoplist/after/Example/Example/Images.xcassets/Doge.imageset/doge@2x.png +0 -0
- data/spec/integration/build-var-infoplist/after/Example/Example/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
- data/spec/integration/build-var-infoplist/after/Example/Example/de.lproj/Localizable.strings +12 -0
- data/spec/integration/build-var-infoplist/after/Example/Example/en.lproj/InfoPlist.strings +2 -0
- data/spec/integration/build-var-infoplist/after/Example/Example/en.lproj/Localizable.strings +15 -0
- data/spec/integration/build-var-infoplist/after/Example/Example/main.m +18 -0
- data/spec/integration/build-var-infoplist/after/Example/Example.xcodeproj.yaml +168 -0
- data/spec/integration/build-var-infoplist/after/R.h +39 -0
- data/spec/integration/build-var-infoplist/after/R.m +29 -0
- data/spec/integration/build-var-infoplist/after/execution_output.txt +19 -0
- data/spec/integration/build-var-infoplist/before/Example/Example/AppDelegate.h +15 -0
- data/spec/integration/build-var-infoplist/before/Example/Example/AppDelegate.m +49 -0
- data/spec/integration/build-var-infoplist/before/Example/Example/Example-Info.plist +38 -0
- data/spec/integration/build-var-infoplist/before/Example/Example/Example-Prefix.pch +16 -0
- data/spec/integration/build-var-infoplist/before/Example/Example/Icons.bundle/tab_bar/tabbar_list.png +0 -0
- data/spec/integration/build-var-infoplist/before/Example/Example/Icons.bundle/tab_bar/tabbar_list@2x.png +0 -0
- data/spec/integration/build-var-infoplist/before/Example/Example/Icons.bundle/tab_bar/tabbar_map.png +0 -0
- data/spec/integration/build-var-infoplist/before/Example/Example/Icons.bundle/tab_bar/tabbar_map@2x.png +0 -0
- data/spec/integration/build-var-infoplist/before/Example/Example/Images/doge.jpeg +0 -0
- data/spec/integration/build-var-infoplist/before/Example/Example/Images/nyanCat.png +0 -0
- data/spec/integration/build-var-infoplist/before/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
- data/spec/integration/build-var-infoplist/before/Example/Example/Images.xcassets/Doge.imageset/Contents.json +18 -0
- data/spec/integration/build-var-infoplist/before/Example/Example/Images.xcassets/Doge.imageset/doge.png +0 -0
- data/spec/integration/build-var-infoplist/before/Example/Example/Images.xcassets/Doge.imageset/doge@2x.png +0 -0
- data/spec/integration/build-var-infoplist/before/Example/Example/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
- data/spec/integration/build-var-infoplist/before/Example/Example/de.lproj/Localizable.strings +12 -0
- data/spec/integration/build-var-infoplist/before/Example/Example/en.lproj/InfoPlist.strings +2 -0
- data/spec/integration/build-var-infoplist/before/Example/Example/en.lproj/Localizable.strings +15 -0
- data/spec/integration/build-var-infoplist/before/Example/Example/main.m +18 -0
- data/spec/integration/build-var-infoplist/before/Example/Example.xcodeproj/project.pbxproj +453 -0
- data/spec/integration/build-var-infoplist/before/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- data/spec/integration/help/after/execution_output.txt +18 -0
- data/spec/integration/help/before/.gitkeep +0 -0
- data/spec/integration/install/after/Example/Example/AppDelegate.h +15 -0
- data/spec/integration/install/after/Example/Example/AppDelegate.m +49 -0
- data/spec/integration/install/after/Example/Example/Example-Info.plist +38 -0
- data/spec/integration/install/after/Example/Example/Example-Prefix.pch +18 -0
- data/spec/integration/install/after/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
- data/spec/integration/install/after/Example/Example/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
- data/spec/integration/install/after/Example/Example/Resources/R.h +19 -0
- data/spec/integration/install/after/Example/Example/Resources/R.m +17 -0
- data/spec/integration/install/after/Example/Example/en.lproj/InfoPlist.strings +2 -0
- data/spec/integration/install/after/Example/Example/main.m +18 -0
- data/spec/integration/install/after/Example/Example.xcodeproj/project.pbxproj +898 -0
- data/spec/integration/install/after/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- data/spec/integration/install/after/Example/Example.xcodeproj.yaml +172 -0
- data/spec/integration/install/after/execution_output.txt +22 -0
- data/spec/integration/install/before/Example/Example/AppDelegate.h +15 -0
- data/spec/integration/install/before/Example/Example/AppDelegate.m +49 -0
- data/spec/integration/install/before/Example/Example/Example-Info.plist +38 -0
- data/spec/integration/install/before/Example/Example/Example-Prefix.pch +16 -0
- data/spec/integration/install/before/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
- data/spec/integration/install/before/Example/Example/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
- data/spec/integration/install/before/Example/Example/en.lproj/InfoPlist.strings +2 -0
- data/spec/integration/install/before/Example/Example/main.m +18 -0
- data/spec/integration/install/before/Example/Example.xcodeproj/project.pbxproj +421 -0
- data/spec/integration/install/before/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- data/spec/integration/install-again/after/Example/Example/AppDelegate.h +15 -0
- data/spec/integration/install-again/after/Example/Example/AppDelegate.m +49 -0
- data/spec/integration/install-again/after/Example/Example/Example-Info.plist +38 -0
- data/spec/integration/install-again/after/Example/Example/Example-Prefix.pch +18 -0
- data/spec/integration/install-again/after/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
- data/spec/integration/install-again/after/Example/Example/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
- data/spec/integration/install-again/after/Example/Example/Resources/R.h +19 -0
- data/spec/integration/install-again/after/Example/Example/Resources/R.m +17 -0
- data/spec/integration/install-again/after/Example/Example/en.lproj/InfoPlist.strings +2 -0
- data/spec/integration/install-again/after/Example/Example/main.m +18 -0
- data/spec/integration/install-again/after/Example/Example.xcodeproj.yaml +172 -0
- data/spec/integration/install-again/after/execution_output.txt +23 -0
- data/spec/integration/install-again/before/Example/Example/AppDelegate.h +15 -0
- data/spec/integration/install-again/before/Example/Example/AppDelegate.m +49 -0
- data/spec/integration/install-again/before/Example/Example/Example-Info.plist +38 -0
- data/spec/integration/install-again/before/Example/Example/Example-Prefix.pch +18 -0
- data/spec/integration/install-again/before/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
- data/spec/integration/install-again/before/Example/Example/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
- data/spec/integration/install-again/before/Example/Example/Resources/R.h +19 -0
- data/spec/integration/install-again/before/Example/Example/Resources/R.m +17 -0
- data/spec/integration/install-again/before/Example/Example/en.lproj/InfoPlist.strings +2 -0
- data/spec/integration/install-again/before/Example/Example/main.m +18 -0
- data/spec/integration/install-again/before/Example/Example.xcodeproj/project.pbxproj +898 -0
- data/spec/integration/install-again/before/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- data/spec/integration/install-moved-supporting-files/after/Example/Example.xcodeproj.yaml +173 -0
- data/spec/integration/install-moved-supporting-files/after/Example/Supporting_Files/Example-Info.plist +38 -0
- data/spec/integration/install-moved-supporting-files/after/Example/Supporting_Files/Example-Prefix.pch +18 -0
- data/spec/integration/install-moved-supporting-files/after/Example/Supporting_Files/Resources/R.h +19 -0
- data/spec/integration/install-moved-supporting-files/after/Example/Supporting_Files/Resources/R.m +17 -0
- data/spec/integration/install-moved-supporting-files/after/Example/Supporting_Files/en.lproj/InfoPlist.strings +2 -0
- data/spec/integration/install-moved-supporting-files/after/Example/Supporting_Files/main.m +18 -0
- data/spec/integration/install-moved-supporting-files/after/Example/res/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
- data/spec/integration/install-moved-supporting-files/after/Example/res/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
- data/spec/integration/install-moved-supporting-files/after/Example/src/AppDelegate.h +15 -0
- data/spec/integration/install-moved-supporting-files/after/Example/src/AppDelegate.m +49 -0
- data/spec/integration/install-moved-supporting-files/after/execution_output.txt +22 -0
- data/spec/integration/install-moved-supporting-files/before/Example/Example.xcodeproj/project.pbxproj +431 -0
- data/spec/integration/install-moved-supporting-files/before/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- data/spec/integration/install-moved-supporting-files/before/Example/Supporting_Files/Example-Info.plist +38 -0
- data/spec/integration/install-moved-supporting-files/before/Example/Supporting_Files/Example-Prefix.pch +16 -0
- data/spec/integration/install-moved-supporting-files/before/Example/Supporting_Files/en.lproj/InfoPlist.strings +2 -0
- data/spec/integration/install-moved-supporting-files/before/Example/Supporting_Files/main.m +18 -0
- data/spec/integration/install-moved-supporting-files/before/Example/res/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
- data/spec/integration/install-moved-supporting-files/before/Example/res/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
- data/spec/integration/install-moved-supporting-files/before/Example/src/AppDelegate.h +15 -0
- data/spec/integration/install-moved-supporting-files/before/Example/src/AppDelegate.m +49 -0
- data/spec/integration/install-no-supporting-files/after/Example/Example.xcodeproj.yaml +173 -0
- data/spec/integration/install-no-supporting-files/after/Example/Resources/R.h +19 -0
- data/spec/integration/install-no-supporting-files/after/Example/Resources/R.m +17 -0
- data/spec/integration/install-no-supporting-files/after/Example/Supporting_Files/Example-Info.plist +38 -0
- data/spec/integration/install-no-supporting-files/after/Example/Supporting_Files/Example-Prefix.pch +18 -0
- data/spec/integration/install-no-supporting-files/after/Example/Supporting_Files/en.lproj/InfoPlist.strings +2 -0
- data/spec/integration/install-no-supporting-files/after/Example/Supporting_Files/main.m +18 -0
- data/spec/integration/install-no-supporting-files/after/Example/res/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
- data/spec/integration/install-no-supporting-files/after/Example/res/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
- data/spec/integration/install-no-supporting-files/after/Example/src/AppDelegate.h +15 -0
- data/spec/integration/install-no-supporting-files/after/Example/src/AppDelegate.m +49 -0
- data/spec/integration/install-no-supporting-files/after/execution_output.txt +23 -0
- data/spec/integration/install-no-supporting-files/before/Example/Example.xcodeproj/project.pbxproj +430 -0
- data/spec/integration/install-no-supporting-files/before/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- data/spec/integration/install-no-supporting-files/before/Example/Supporting_Files/Example-Info.plist +38 -0
- data/spec/integration/install-no-supporting-files/before/Example/Supporting_Files/Example-Prefix.pch +16 -0
- data/spec/integration/install-no-supporting-files/before/Example/Supporting_Files/en.lproj/InfoPlist.strings +2 -0
- data/spec/integration/install-no-supporting-files/before/Example/Supporting_Files/main.m +18 -0
- data/spec/integration/install-no-supporting-files/before/Example/res/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
- data/spec/integration/install-no-supporting-files/before/Example/res/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
- data/spec/integration/install-no-supporting-files/before/Example/src/AppDelegate.h +15 -0
- data/spec/integration/install-no-supporting-files/before/Example/src/AppDelegate.m +49 -0
- data/spec/integration/version/after/execution_output.txt +3 -0
- data/spec/integration/version/before/.gitkeep +0 -0
- data/spec/integration.rb +86 -0
- data/spec/spec_helper/xcodeproj_project_yaml.rb +26 -0
- data/spec/unit/analyzer/aggregate_analyzer_spec.rb +61 -0
- data/spec/unit/analyzer/analyzer_spec.rb +123 -0
- data/spec/unit/analyzer/resources_aggregate_analyzer_spec.rb +46 -0
- data/spec/unit/analyzer/resources_analyzer/base_resources_analyzer_spec.rb +126 -0
- data/spec/unit/analyzer/resources_analyzer/bundle_resources_analyzer_spec.rb +57 -0
- data/spec/unit/analyzer/resources_analyzer/loose_resources_analyzer_spec.rb +22 -0
- data/spec/unit/analyzer/strings_analyzer_spec.rb +99 -0
- data/spec/unit/builder/file_builder_spec.rb +46 -0
- data/spec/unit/builder/resources_builder_spec.rb +50 -0
- data/spec/unit/builder/string_builder_spec.rb +76 -0
- data/spec/unit/command/main_command_spec.rb +5 -0
- data/spec/unit/command/project_command_spec.rb +23 -0
- data/spec/unit/helper/file_helper_spec.rb +24 -0
- data/spec/unit/logger_spec.rb +142 -0
- data/spec/unit/model/section_spec.rb +47 -0
- data/spec/unit/model/xcassets/bundle_spec.rb +154 -0
- data/spec/unit/model/xcassets/resource_image_spec.rb +141 -0
- data/spec/unit/model/xcassets/resource_spec.rb +174 -0
- data/spec/unit/model/xcassets/spec_helper.rb +31 -0
- data/spec/unit/spec_helper.rb +17 -0
- data/xcres.gemspec +42 -0
- metadata +811 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: a076ffc4975feacb4afd297104c8814613c542eb
|
|
4
|
+
data.tar.gz: 211c8641f12dd550e4e43d8f39e2b8c24efa938c
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 3bd3346d7bbcd259fa698bba2dfad0c2081db342ba9d3fc7f85ced88717fa1d0775b3090f9d98800d705294cad8b44b1692cd2d7ffb586382b82a055eff6c52f
|
|
7
|
+
data.tar.gz: aa0d427e7b7d5f86174728b84e4f987a8bf635b80be0a5a98a28a114d347e348754312c47eb762d185096ab9fa2a52b3a1e08fd9e06528687edc750c12703865
|
data/.gitignore
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# General
|
|
2
|
+
*.rbc
|
|
3
|
+
*.gem
|
|
4
|
+
.DS_Store
|
|
5
|
+
|
|
6
|
+
# Yardoc
|
|
7
|
+
.yardoc
|
|
8
|
+
/doc
|
|
9
|
+
|
|
10
|
+
# Specs
|
|
11
|
+
tmp
|
|
12
|
+
spec/reports
|
|
13
|
+
test/tmp
|
|
14
|
+
test/version_tmp
|
|
15
|
+
|
|
16
|
+
# Examples
|
|
17
|
+
DerivedData
|
|
18
|
+
|
|
19
|
+
# IDEs
|
|
20
|
+
xcuserdata
|
|
21
|
+
*.xccheckout
|
|
22
|
+
.idea/
|
|
23
|
+
|
|
24
|
+
# RVM files
|
|
25
|
+
/.rvmrc
|
|
26
|
+
/.ruby-version
|
|
27
|
+
/.ruby-gemset
|
|
28
|
+
|
|
29
|
+
# RBENV files
|
|
30
|
+
/.rbenv-version
|
|
31
|
+
|
|
32
|
+
# Bundler files
|
|
33
|
+
/.bundle
|
data/.travis.yml
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Sets Travis to run the Ruby specs on OS X machines which are required to
|
|
2
|
+
# use the native tools to read plists.
|
|
3
|
+
#
|
|
4
|
+
language: objective-c
|
|
5
|
+
|
|
6
|
+
env:
|
|
7
|
+
- RVM_RUBY_VERSION=system
|
|
8
|
+
|
|
9
|
+
before_install:
|
|
10
|
+
- source ~/.rvm/scripts/rvm
|
|
11
|
+
- if [[ $RVM_RUBY_VERSION != 'system' ]]; then rvm install $RVM_RUBY_VERSION; fi
|
|
12
|
+
- rvm use $RVM_RUBY_VERSION
|
|
13
|
+
- if [[ $RVM_RUBY_VERSION == 'system' ]]; then sudo gem install bundler --no-ri --no-rdoc; else gem install bundler --no-ri --no-rdoc; fi
|
|
14
|
+
|
|
15
|
+
install:
|
|
16
|
+
- bundle install --without=documentation
|
|
17
|
+
|
|
18
|
+
script: rake spec
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
PATH
|
|
2
|
+
remote: .
|
|
3
|
+
specs:
|
|
4
|
+
xcres (0.4.0)
|
|
5
|
+
activesupport (>= 3.2.15, < 4)
|
|
6
|
+
clamp (~> 0.6.3)
|
|
7
|
+
colored (~> 1.2)
|
|
8
|
+
libxml-ruby
|
|
9
|
+
xcodeproj (~> 0.18)
|
|
10
|
+
|
|
11
|
+
GEM
|
|
12
|
+
remote: https://rubygems.org/
|
|
13
|
+
specs:
|
|
14
|
+
CFPropertyList (2.2.8)
|
|
15
|
+
activesupport (3.2.19)
|
|
16
|
+
i18n (~> 0.6, >= 0.6.4)
|
|
17
|
+
multi_json (~> 1.0)
|
|
18
|
+
ast (2.0.0)
|
|
19
|
+
bacon (1.2.0)
|
|
20
|
+
clamp (0.6.3)
|
|
21
|
+
clintegracon (0.5.2)
|
|
22
|
+
colored (~> 1.2)
|
|
23
|
+
diffy
|
|
24
|
+
coderay (1.1.0)
|
|
25
|
+
colored (1.2)
|
|
26
|
+
diffy (3.0.6)
|
|
27
|
+
i18n (0.6.11)
|
|
28
|
+
inch (0.4.10)
|
|
29
|
+
pry
|
|
30
|
+
sparkr (>= 0.2.0)
|
|
31
|
+
term-ansicolor
|
|
32
|
+
yard (~> 0.8.7)
|
|
33
|
+
libxml-ruby (2.7.0)
|
|
34
|
+
metaclass (0.0.4)
|
|
35
|
+
method_source (0.8.2)
|
|
36
|
+
mocha (1.1.0)
|
|
37
|
+
metaclass (~> 0.0.1)
|
|
38
|
+
mocha-on-bacon (0.2.2)
|
|
39
|
+
mocha (>= 0.13.0)
|
|
40
|
+
multi_json (1.10.1)
|
|
41
|
+
parser (2.2.0.pre.4)
|
|
42
|
+
ast (>= 1.1, < 3.0)
|
|
43
|
+
slop (~> 3.4, >= 3.4.5)
|
|
44
|
+
powerpack (0.0.9)
|
|
45
|
+
prettybacon (0.0.2)
|
|
46
|
+
bacon (~> 1.2)
|
|
47
|
+
pry (0.10.1)
|
|
48
|
+
coderay (~> 1.1.0)
|
|
49
|
+
method_source (~> 0.8.1)
|
|
50
|
+
slop (~> 3.4)
|
|
51
|
+
psych (2.0.5)
|
|
52
|
+
rainbow (2.0.0)
|
|
53
|
+
rake (10.3.2)
|
|
54
|
+
rubocop (0.25.0)
|
|
55
|
+
parser (>= 2.2.0.pre.4, < 3.0)
|
|
56
|
+
powerpack (~> 0.0.6)
|
|
57
|
+
rainbow (>= 1.99.1, < 3.0)
|
|
58
|
+
ruby-progressbar (~> 1.4)
|
|
59
|
+
ruby-progressbar (1.5.1)
|
|
60
|
+
slop (3.6.0)
|
|
61
|
+
sparkr (0.4.1)
|
|
62
|
+
term-ansicolor (1.3.0)
|
|
63
|
+
tins (~> 1.0)
|
|
64
|
+
tins (1.3.2)
|
|
65
|
+
xcodeproj (0.18.0)
|
|
66
|
+
CFPropertyList (~> 2.2)
|
|
67
|
+
activesupport (~> 3.0)
|
|
68
|
+
colored (~> 1.2)
|
|
69
|
+
yard (0.8.7.4)
|
|
70
|
+
|
|
71
|
+
PLATFORMS
|
|
72
|
+
ruby
|
|
73
|
+
|
|
74
|
+
DEPENDENCIES
|
|
75
|
+
bacon (~> 1.1)
|
|
76
|
+
bundler (~> 1.3)
|
|
77
|
+
clintegracon
|
|
78
|
+
inch
|
|
79
|
+
mocha
|
|
80
|
+
mocha-on-bacon
|
|
81
|
+
prettybacon
|
|
82
|
+
psych
|
|
83
|
+
rake
|
|
84
|
+
rubocop
|
|
85
|
+
xcres!
|
data/LICENSE.txt
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
Copyright (c) 2014 Marius Rackwitz
|
|
2
|
+
|
|
3
|
+
MIT License
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
6
|
+
a copy of this software and associated documentation files (the
|
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
11
|
+
the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be
|
|
14
|
+
included in all copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
# xcres
|
|
2
|
+
|
|
3
|
+
[](https://twitter.com/mrackwitz)
|
|
4
|
+
[](http://rubygems.org/gems/xcres)
|
|
5
|
+
[](https://travis-ci.org/mrackwitz/xcres)
|
|
6
|
+
[](http://inch-ci.org/github/mrackwitz/xcres)
|
|
7
|
+
|
|
8
|
+
`xcres` searches your Xcode project for resources and generates an index
|
|
9
|
+
as struct constants. So you will never have to reference a resource, without
|
|
10
|
+
knowing already at compile time if it exists or not.
|
|
11
|
+
|
|
12
|
+
It includes **loose images**, **.bundles**, **asset catalogs** (.xcasset)
|
|
13
|
+
and even **.strings** in the index.
|
|
14
|
+
|
|
15
|
+
It gives you **code autocompletion** for resources and localized string keys,
|
|
16
|
+
without the need of an Xcode plugin.
|
|
17
|
+
|
|
18
|
+
Especially if your app is a bit more complex, this will greatly improve your
|
|
19
|
+
workflow. It ensures a better quality and gives you more safety.
|
|
20
|
+
You will see directly when a resource is missing, when you renamed it,
|
|
21
|
+
or you moved it around.
|
|
22
|
+
|
|
23
|
+
Furthermore it won't even bother you for trivial name changes like change
|
|
24
|
+
capitalization or converting name scheme from *train-case* or *snake_case* to
|
|
25
|
+
*camelCase* and vice versa.
|
|
26
|
+
|
|
27
|
+
It will warn you in Xcode on build, if certain resources or string keys can't be
|
|
28
|
+
references, because their name contain invalid chars, duplicates in the
|
|
29
|
+
*camelCase* variant with another key, or would be equal to a protected compiler
|
|
30
|
+
keyword.
|
|
31
|
+
|
|
32
|
+
The generated index could look like below.
|
|
33
|
+
|
|
34
|
+
While this is still **Objective-C**, `xcres` is compatible with **Swift**.
|
|
35
|
+
All you need to do is to add an import to the generated header to your
|
|
36
|
+
project's bridging header.
|
|
37
|
+
|
|
38
|
+
```objc
|
|
39
|
+
const struct R {
|
|
40
|
+
struct Images {
|
|
41
|
+
/// doge.jpeg
|
|
42
|
+
__unsafe_unretained NSString *doge;
|
|
43
|
+
} Images;
|
|
44
|
+
struct ImagesAssets {
|
|
45
|
+
/// AppIcon
|
|
46
|
+
__unsafe_unretained NSString *app;
|
|
47
|
+
/// LaunchImage
|
|
48
|
+
__unsafe_unretained NSString *launch;
|
|
49
|
+
/// DefaultAvatar
|
|
50
|
+
__unsafe_unretained NSString *defaultAvatar;
|
|
51
|
+
} ImagesAssets;
|
|
52
|
+
struct Strings {
|
|
53
|
+
/// Password wrong!
|
|
54
|
+
__unsafe_unretained NSString *errorTitleWrongPassword;
|
|
55
|
+
/// Please enter the correct password.
|
|
56
|
+
__unsafe_unretained NSString *errorMessageWrongPassword;
|
|
57
|
+
} Strings;
|
|
58
|
+
} R;
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
## Installation
|
|
63
|
+
|
|
64
|
+
`xcres` is built with Ruby and it will be installable with the default
|
|
65
|
+
Ruby available on OS X. You can use a Ruby Version manager, if you know
|
|
66
|
+
what you're doing.
|
|
67
|
+
Using the default Ruby install will require you to use sudo when
|
|
68
|
+
installing gems. (This is only an issue for the duration of the gem
|
|
69
|
+
installation, though.)
|
|
70
|
+
|
|
71
|
+
Install the gem on your machine:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
$ [sudo] gem install xcres
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Use the automatic integration to add a build phase to your project,
|
|
78
|
+
by executing the following command:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
$ xcres install
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
## Usage
|
|
86
|
+
|
|
87
|
+
Reference your resources safely with the generated constants.
|
|
88
|
+
|
|
89
|
+
### Asset Catalogs
|
|
90
|
+
|
|
91
|
+
Assuming your asset catalog is named `Images.xcassets`.
|
|
92
|
+
`xcres` supports multiple bundles in one project.
|
|
93
|
+
|
|
94
|
+
Instead of:
|
|
95
|
+
|
|
96
|
+
```objc
|
|
97
|
+
[UIImage imageNamed:@"PersonDefaultAvatar"]
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Just write:
|
|
101
|
+
|
|
102
|
+
```objc
|
|
103
|
+
[UIImage imageNamed:R.ImagesAssets.personDefaultAvatar]
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
##### How to Add a New Resource
|
|
107
|
+
|
|
108
|
+
1. Add it to your asset catalog.
|
|
109
|
+
- Trigger a build. (**⌘ + B**)
|
|
110
|
+
- The new key will be available under
|
|
111
|
+
`R.${catalogName}Assets.${keyName:camelCase}`
|
|
112
|
+
and is ready for use in your code now.
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
### Loose Images
|
|
116
|
+
|
|
117
|
+
Instead of:
|
|
118
|
+
|
|
119
|
+
```objc
|
|
120
|
+
[UIImage imageNamed:@"table_header_background_image"]
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Just write:
|
|
124
|
+
|
|
125
|
+
```objc
|
|
126
|
+
[UIImage imageNamed:R.Images.tableHeaderBackgroundImage]
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
##### How to Add a New Loose Image
|
|
130
|
+
|
|
131
|
+
1. Drop the image in your project.
|
|
132
|
+
- Trigger a build. (**⌘ + B**)
|
|
133
|
+
- The new key will be available under `R.Images.${keyName:camelCase}`
|
|
134
|
+
and is ready for use in your code now.
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
### Strings
|
|
138
|
+
|
|
139
|
+
Instead of:
|
|
140
|
+
|
|
141
|
+
```objc
|
|
142
|
+
NSLocalizedString(@"error_message_wrong_password", @"Message shown if a wrong password was entered.")
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Just write:
|
|
146
|
+
|
|
147
|
+
```objc
|
|
148
|
+
NSLocalizedString(R.Strings.errorMessageWrongPassword, @"Message shown if a wrong password was entered.")
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
##### How to Add a New String
|
|
153
|
+
|
|
154
|
+
With xcres your workflow for adding new strings will change slightly.
|
|
155
|
+
|
|
156
|
+
1. Create a new string (at least) in your project's native development
|
|
157
|
+
language in one of the strings files included in your target.
|
|
158
|
+
(By default this will be `en.lproj/Localizable.strings`)
|
|
159
|
+
- Trigger a build. (**⌘ + B**)
|
|
160
|
+
- The new key will be available under `R.Strings.${keyName:camelCase}`
|
|
161
|
+
and is ready for use in your code now.
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
## Known Issues & Tips
|
|
165
|
+
|
|
166
|
+
One minor drawback is that `genstrings` will not be helpful anymore.
|
|
167
|
+
But this tool is mostly useful in the first step, when bootstrapping
|
|
168
|
+
your project, until you care about internationalization and want to
|
|
169
|
+
provide translations.
|
|
170
|
+
|
|
171
|
+
xcres generally assumes that you don't use natural language for keys,
|
|
172
|
+
as this will led very fast to ambiguities. It will filter out unwanted
|
|
173
|
+
chars when transforming your keys to camel case notation, but it will
|
|
174
|
+
also warn you about those. It can be a help, if you want to migrate
|
|
175
|
+
your project to non-natural language keys.
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
## License
|
|
179
|
+
|
|
180
|
+
xcres is available under MIT License.
|
|
181
|
+
See the LICENSE file for more info.
|
data/Rakefile
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#encoding: utf-8
|
|
2
|
+
|
|
3
|
+
begin
|
|
4
|
+
require 'bundler/gem_tasks'
|
|
5
|
+
require 'rubocop/rake_task'
|
|
6
|
+
|
|
7
|
+
namespace :install do
|
|
8
|
+
desc 'Install the gem as current user (NOT RECOMMENDED)'
|
|
9
|
+
task :user => ['build'] do
|
|
10
|
+
sh "gem install #{Dir['pkg/*.gem'].sort.last} --user-install"
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
namespace :lint do
|
|
15
|
+
RuboCop::RakeTask.new do |task|
|
|
16
|
+
task.patterns = ['lib/**/*.rb']
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
desc 'Run inch to see documentation coverage'
|
|
20
|
+
task :doc do
|
|
21
|
+
sh 'bundle exec inch'
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
namespace :spec do
|
|
26
|
+
|
|
27
|
+
task :prepare do
|
|
28
|
+
verbose false
|
|
29
|
+
puts 'Prepare …'
|
|
30
|
+
sh 'mkdir -p tmp'
|
|
31
|
+
rm_rf 'tmp/*'
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
desc 'Run all integration specs'
|
|
35
|
+
task :integration => [:prepare] do
|
|
36
|
+
sh 'bundle exec bacon spec/integration.rb'
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
desc 'Run all unit specs'
|
|
40
|
+
task :unit, [:spec] do |t, args|
|
|
41
|
+
sh "bundle exec bacon #{specs(args[:spec] || '**/*')}"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def specs(dir)
|
|
45
|
+
FileList["spec/unit/#{dir}_spec.rb"].shuffle.join(' ')
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
desc 'Run all specs'
|
|
49
|
+
task :all => [
|
|
50
|
+
:unit,
|
|
51
|
+
:integration
|
|
52
|
+
]
|
|
53
|
+
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
desc 'Run all specs'
|
|
57
|
+
task :spec => 'spec:all'
|
|
58
|
+
end
|
data/bin/xcres
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
if $PROGRAM_NAME == __FILE__
|
|
4
|
+
ENV['BUNDLE_GEMFILE'] = File.expand_path('../../Gemfile', __FILE__)
|
|
5
|
+
require 'rubygems'
|
|
6
|
+
require 'bundler/setup'
|
|
7
|
+
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
require 'xcres'
|
|
11
|
+
|
|
12
|
+
XCRes::MainCommand.run
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
require 'xcres/analyzer/analyzer'
|
|
2
|
+
|
|
3
|
+
module XCRes
|
|
4
|
+
|
|
5
|
+
# A +AggregateAnalyzer+ runs multiple +Analyzer+.
|
|
6
|
+
#
|
|
7
|
+
class AggregateAnalyzer < Analyzer
|
|
8
|
+
|
|
9
|
+
# @return [Array<Analyzer>]
|
|
10
|
+
# an array of +Analyzer+.
|
|
11
|
+
attr_accessor :analyzers
|
|
12
|
+
|
|
13
|
+
def initialize(project=nil, options={})
|
|
14
|
+
super
|
|
15
|
+
self.analyzers = []
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Run all aggregated analyzers
|
|
19
|
+
#
|
|
20
|
+
# @return [Array<Hash>]
|
|
21
|
+
# the built sections
|
|
22
|
+
#
|
|
23
|
+
def analyze
|
|
24
|
+
@sections = analyzers.map(&:analyze).flatten.compact
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Instantiate and add an analyzer by its class.
|
|
28
|
+
# All properties will be copied to the child analyzer.
|
|
29
|
+
#
|
|
30
|
+
# @param [Class] analyzer_class
|
|
31
|
+
# the class of the analyzer to instantiate and add
|
|
32
|
+
#
|
|
33
|
+
# @param [Hash] options
|
|
34
|
+
# options which will be passed on initialization
|
|
35
|
+
#
|
|
36
|
+
# @return [Analyzer]
|
|
37
|
+
#
|
|
38
|
+
def add_with_class(analyzer_class, options={})
|
|
39
|
+
analyzer = analyzer_class.new(target, self.options.merge(options))
|
|
40
|
+
analyzer.exclude_file_patterns = exclude_file_patterns
|
|
41
|
+
analyzer.logger = logger
|
|
42
|
+
self.analyzers << analyzer
|
|
43
|
+
analyzer
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
require 'xcodeproj'
|
|
2
|
+
require 'xcres/helper/file_helper'
|
|
3
|
+
require 'xcres/model/section'
|
|
4
|
+
|
|
5
|
+
module XCRes
|
|
6
|
+
|
|
7
|
+
# An +Analyzer+ scans the project for references,
|
|
8
|
+
# which should be included in the output file.
|
|
9
|
+
#
|
|
10
|
+
class Analyzer
|
|
11
|
+
include XCRes::FileHelper
|
|
12
|
+
|
|
13
|
+
# @return [PBXNativeTarget]
|
|
14
|
+
# the application target of the #project to analyze.
|
|
15
|
+
attr_reader :target
|
|
16
|
+
|
|
17
|
+
# @return [Array<Section>]
|
|
18
|
+
# the built sections
|
|
19
|
+
attr_reader :sections
|
|
20
|
+
|
|
21
|
+
# @return [Hash]
|
|
22
|
+
# the options passed to the sections
|
|
23
|
+
attr_accessor :options
|
|
24
|
+
|
|
25
|
+
# @return [Array<String>]
|
|
26
|
+
# the exclude file patterns
|
|
27
|
+
attr_accessor :exclude_file_patterns
|
|
28
|
+
|
|
29
|
+
# @return [Logger]
|
|
30
|
+
# the logger
|
|
31
|
+
attr_accessor :logger
|
|
32
|
+
|
|
33
|
+
delegate :inform, :log, :success, :warn, :fail, to: :logger
|
|
34
|
+
|
|
35
|
+
# Initialize a new analyzer
|
|
36
|
+
#
|
|
37
|
+
# @param [PBXNativeTarget] target
|
|
38
|
+
# see +target+.
|
|
39
|
+
#
|
|
40
|
+
# @param [Hash] options
|
|
41
|
+
# see subclasses.
|
|
42
|
+
#
|
|
43
|
+
def initialize(target=nil, options={})
|
|
44
|
+
@target = target
|
|
45
|
+
@sections = []
|
|
46
|
+
@exclude_file_patterns = []
|
|
47
|
+
@options = options
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Analyze the project
|
|
51
|
+
#
|
|
52
|
+
# @return [Array<Section>]
|
|
53
|
+
# the built sections
|
|
54
|
+
#
|
|
55
|
+
def analyze
|
|
56
|
+
# Empty stub implementation
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Return the Xcode project to analyze
|
|
60
|
+
#
|
|
61
|
+
# @return [Xcodeproj::Project]
|
|
62
|
+
#
|
|
63
|
+
def project
|
|
64
|
+
target.project
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Create a new +Section+.
|
|
68
|
+
#
|
|
69
|
+
# @param [String] name
|
|
70
|
+
# see Section#name
|
|
71
|
+
#
|
|
72
|
+
# @param [Hash] items
|
|
73
|
+
# see Section#items
|
|
74
|
+
#
|
|
75
|
+
# @param [Hash] options
|
|
76
|
+
# see Section#options
|
|
77
|
+
#
|
|
78
|
+
# @return [XCRes::Section]
|
|
79
|
+
#
|
|
80
|
+
def new_section(name, data, options={})
|
|
81
|
+
XCRes::Section.new(name, data, self.options.merge(options))
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Apply the configured exclude file patterns to a list of files
|
|
85
|
+
#
|
|
86
|
+
# @param [Array<Pathname>] file_paths
|
|
87
|
+
# the list of files to filter
|
|
88
|
+
#
|
|
89
|
+
# @param [Array<Pathname>]
|
|
90
|
+
# the filtered list of files
|
|
91
|
+
#
|
|
92
|
+
def filter_exclusions file_paths
|
|
93
|
+
file_paths.reject do |path|
|
|
94
|
+
exclude_file_patterns.any? { |pattern| File.fnmatch("#{pattern}", path) || File.fnmatch("**/#{pattern}", path) }
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Discover all references to files with a specific extension in project,
|
|
99
|
+
# which belong to a resources build phase of an application target.
|
|
100
|
+
#
|
|
101
|
+
# @param [String] extname
|
|
102
|
+
# the extname, which contains a leading dot
|
|
103
|
+
# e.g.: '.bundle', '.strings'
|
|
104
|
+
#
|
|
105
|
+
# @return [Array<PBXFileReference>]
|
|
106
|
+
#
|
|
107
|
+
def find_file_refs_by_extname(extname)
|
|
108
|
+
project.files.select do |file_ref|
|
|
109
|
+
File.extname(file_ref.path) == extname \
|
|
110
|
+
&& is_file_ref_included_in_application_target?(file_ref)
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Checks if a file ref is included in any resources build phase of any
|
|
115
|
+
# of the application targets of the #project.
|
|
116
|
+
#
|
|
117
|
+
# @param [PBXFileReference] file_ref
|
|
118
|
+
# the file to search for
|
|
119
|
+
#
|
|
120
|
+
# @return [Bool]
|
|
121
|
+
#
|
|
122
|
+
def is_file_ref_included_in_application_target?(file_ref)
|
|
123
|
+
resources_files.include?(file_ref)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# Find files in resources build phases of application targets
|
|
127
|
+
#
|
|
128
|
+
# @return [Array<PBXFileReference>]
|
|
129
|
+
#
|
|
130
|
+
def resources_files
|
|
131
|
+
target.resources_build_phase.files.map do |build_file|
|
|
132
|
+
if build_file.file_ref.is_a?(Xcodeproj::Project::Object::PBXGroup)
|
|
133
|
+
build_file.file_ref.recursive_children
|
|
134
|
+
else
|
|
135
|
+
[build_file.file_ref]
|
|
136
|
+
end
|
|
137
|
+
end.flatten.compact
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
end
|
|
141
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
require 'xcres/analyzer/aggregate_analyzer'
|
|
2
|
+
require 'xcres/analyzer/resources_analyzer/bundle_resources_analyzer'
|
|
3
|
+
require 'xcres/analyzer/resources_analyzer/loose_resources_analyzer'
|
|
4
|
+
require 'xcres/analyzer/resources_analyzer/xcassets_analyzer'
|
|
5
|
+
|
|
6
|
+
module XCRes
|
|
7
|
+
|
|
8
|
+
# A +ResourcesAnalyzer+ scans the project for resources,
|
|
9
|
+
# which should be included in the output file.
|
|
10
|
+
#
|
|
11
|
+
# It is a +AggregateAnalyzer+, which uses the following child analyzers:
|
|
12
|
+
# * +XCRes::ResourcesAnalyzer::BundleResourcesAnalyzer+
|
|
13
|
+
# * +XCRes::ResourcesAnalyzer::LooseResourcesAnalyzer+
|
|
14
|
+
#
|
|
15
|
+
class ResourcesAggregateAnalyzer < AggregateAnalyzer
|
|
16
|
+
|
|
17
|
+
def analyze
|
|
18
|
+
self.analyzers = []
|
|
19
|
+
add_with_class ResourcesAnalyzer::BundleResourcesAnalyzer
|
|
20
|
+
add_with_class ResourcesAnalyzer::LooseResourcesAnalyzer
|
|
21
|
+
add_with_class ResourcesAnalyzer::XCAssetsAnalyzer
|
|
22
|
+
super
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|