xcres 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
[![Twitter: @mrackwitz](https://img.shields.io/badge/contact-@mrackwitz-blue.svg?style=flat)](https://twitter.com/mrackwitz)
|
4
|
+
[![Gem](https://img.shields.io/gem/v/xcres.svg?style=flat)](http://rubygems.org/gems/xcres)
|
5
|
+
[![Build Status](https://img.shields.io/travis/mrackwitz/xcres/master.svg?style=flat)](https://travis-ci.org/mrackwitz/xcres)
|
6
|
+
[![Inline Docs](http://inch-ci.org/github/mrackwitz/xcres.svg?branch=master&style=flat)](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
|