fastlane_hotfix 2.165.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/.yardopts +1 -0
- data/LICENSE +21 -0
- data/README.md +208 -0
- data/bin/bin-proxy +19 -0
- data/bin/fastlane +23 -0
- data/cert/README.md +17 -0
- data/cert/lib/cert.rb +4 -0
- data/cert/lib/cert/commands_generator.rb +60 -0
- data/cert/lib/cert/module.rb +16 -0
- data/cert/lib/cert/options.rb +132 -0
- data/cert/lib/cert/runner.rb +239 -0
- data/credentials_manager/README.md +64 -0
- data/credentials_manager/lib/credentials_manager.rb +7 -0
- data/credentials_manager/lib/credentials_manager/account_manager.rb +157 -0
- data/credentials_manager/lib/credentials_manager/appfile_config.rb +196 -0
- data/credentials_manager/lib/credentials_manager/cli.rb +69 -0
- data/deliver/README.md +17 -0
- data/deliver/lib/assets/DeliverfileDefault +3 -0
- data/deliver/lib/assets/DeliverfileDefault.swift +13 -0
- data/deliver/lib/assets/ScreenshotsHelp +7 -0
- data/deliver/lib/assets/summary.html.erb +299 -0
- data/deliver/lib/deliver.rb +15 -0
- data/deliver/lib/deliver/app_screenshot.rb +354 -0
- data/deliver/lib/deliver/app_screenshot_iterator.rb +95 -0
- data/deliver/lib/deliver/commands_generator.rb +190 -0
- data/deliver/lib/deliver/detect_values.rb +102 -0
- data/deliver/lib/deliver/download_screenshots.rb +76 -0
- data/deliver/lib/deliver/generate_summary.rb +13 -0
- data/deliver/lib/deliver/html_generator.rb +78 -0
- data/deliver/lib/deliver/languages.rb +7 -0
- data/deliver/lib/deliver/loader.rb +55 -0
- data/deliver/lib/deliver/module.rb +18 -0
- data/deliver/lib/deliver/options.rb +465 -0
- data/deliver/lib/deliver/queue_worker.rb +49 -0
- data/deliver/lib/deliver/runner.rb +233 -0
- data/deliver/lib/deliver/setup.rb +199 -0
- data/deliver/lib/deliver/submit_for_review.rb +214 -0
- data/deliver/lib/deliver/upload_metadata.rb +688 -0
- data/deliver/lib/deliver/upload_price_tier.rb +40 -0
- data/deliver/lib/deliver/upload_screenshots.rb +333 -0
- data/fastlane/README.md +11 -0
- data/fastlane/lib/assets/ActionDetails.md.erb +106 -0
- data/fastlane/lib/assets/Actions.md.erb +43 -0
- data/fastlane/lib/assets/AppfileTemplate +6 -0
- data/fastlane/lib/assets/AppfileTemplate.swift +7 -0
- data/fastlane/lib/assets/AppfileTemplateAndroid +2 -0
- data/fastlane/lib/assets/DefaultFastfileTemplate +20 -0
- data/fastlane/lib/assets/DefaultFastfileTemplate.swift +13 -0
- data/fastlane/lib/assets/completions/completion.bash +23 -0
- data/fastlane/lib/assets/completions/completion.fish +39 -0
- data/fastlane/lib/assets/completions/completion.sh +12 -0
- data/fastlane/lib/assets/completions/completion.zsh +23 -0
- data/fastlane/lib/assets/custom_action_template.rb +82 -0
- data/fastlane/lib/assets/mailgun_html_template.erb +142 -0
- data/fastlane/lib/assets/report_template.xml.erb +15 -0
- data/fastlane/lib/assets/s3_html_template.erb +105 -0
- data/fastlane/lib/assets/s3_plist_template.erb +31 -0
- data/fastlane/lib/assets/s3_version_template.erb +4 -0
- data/fastlane/lib/fastlane.rb +53 -0
- data/fastlane/lib/fastlane/action.rb +198 -0
- data/fastlane/lib/fastlane/action_collector.rb +35 -0
- data/fastlane/lib/fastlane/actions/README.md +5 -0
- data/fastlane/lib/fastlane/actions/actions_helper.rb +185 -0
- data/fastlane/lib/fastlane/actions/adb.rb +78 -0
- data/fastlane/lib/fastlane/actions/adb_devices.rb +71 -0
- data/fastlane/lib/fastlane/actions/add_extra_platforms.rb +45 -0
- data/fastlane/lib/fastlane/actions/add_git_tag.rb +122 -0
- data/fastlane/lib/fastlane/actions/app_store_build_number.rb +249 -0
- data/fastlane/lib/fastlane/actions/app_store_connect_api_key.rb +134 -0
- data/fastlane/lib/fastlane/actions/appaloosa.rb +266 -0
- data/fastlane/lib/fastlane/actions/appetize.rb +188 -0
- data/fastlane/lib/fastlane/actions/appetize_viewing_url_generator.rb +146 -0
- data/fastlane/lib/fastlane/actions/appium.rb +206 -0
- data/fastlane/lib/fastlane/actions/appledoc.rb +226 -0
- data/fastlane/lib/fastlane/actions/appstore.rb +14 -0
- data/fastlane/lib/fastlane/actions/apteligent.rb +105 -0
- data/fastlane/lib/fastlane/actions/artifactory.rb +157 -0
- data/fastlane/lib/fastlane/actions/automatic_code_signing.rb +226 -0
- data/fastlane/lib/fastlane/actions/backup_file.rb +41 -0
- data/fastlane/lib/fastlane/actions/backup_xcarchive.rb +135 -0
- data/fastlane/lib/fastlane/actions/badge.rb +155 -0
- data/fastlane/lib/fastlane/actions/build_and_upload_to_appetize.rb +107 -0
- data/fastlane/lib/fastlane/actions/build_android_app.rb +14 -0
- data/fastlane/lib/fastlane/actions/build_app.rb +165 -0
- data/fastlane/lib/fastlane/actions/build_ios_app.rb +47 -0
- data/fastlane/lib/fastlane/actions/build_mac_app.rb +46 -0
- data/fastlane/lib/fastlane/actions/bundle_install.rb +156 -0
- data/fastlane/lib/fastlane/actions/capture_android_screenshots.rb +63 -0
- data/fastlane/lib/fastlane/actions/capture_ios_screenshots.rb +61 -0
- data/fastlane/lib/fastlane/actions/capture_screenshots.rb +14 -0
- data/fastlane/lib/fastlane/actions/carthage.rb +230 -0
- data/fastlane/lib/fastlane/actions/cert.rb +14 -0
- data/fastlane/lib/fastlane/actions/changelog_from_git_commits.rb +197 -0
- data/fastlane/lib/fastlane/actions/chatwork.rb +94 -0
- data/fastlane/lib/fastlane/actions/check_app_store_metadata.rb +54 -0
- data/fastlane/lib/fastlane/actions/clean_build_artifacts.rb +72 -0
- data/fastlane/lib/fastlane/actions/clean_cocoapods_cache.rb +52 -0
- data/fastlane/lib/fastlane/actions/clear_derived_data.rb +70 -0
- data/fastlane/lib/fastlane/actions/clipboard.rb +52 -0
- data/fastlane/lib/fastlane/actions/cloc.rb +89 -0
- data/fastlane/lib/fastlane/actions/cocoapods.rb +170 -0
- data/fastlane/lib/fastlane/actions/commit_github_file.rb +186 -0
- data/fastlane/lib/fastlane/actions/commit_version_bump.rb +301 -0
- data/fastlane/lib/fastlane/actions/copy_artifacts.rb +114 -0
- data/fastlane/lib/fastlane/actions/crashlytics.rb +211 -0
- data/fastlane/lib/fastlane/actions/create_app_on_managed_play_store.rb +174 -0
- data/fastlane/lib/fastlane/actions/create_app_online.rb +75 -0
- data/fastlane/lib/fastlane/actions/create_keychain.rb +177 -0
- data/fastlane/lib/fastlane/actions/create_pull_request.rb +265 -0
- data/fastlane/lib/fastlane/actions/danger.rb +131 -0
- data/fastlane/lib/fastlane/actions/debug.rb +32 -0
- data/fastlane/lib/fastlane/actions/default_platform.rb +47 -0
- data/fastlane/lib/fastlane/actions/delete_keychain.rb +68 -0
- data/fastlane/lib/fastlane/actions/deliver.rb +14 -0
- data/fastlane/lib/fastlane/actions/deploygate.rb +210 -0
- data/fastlane/lib/fastlane/actions/device_grid/README.md +157 -0
- data/fastlane/lib/fastlane/actions/docs/build_app.md +245 -0
- data/fastlane/lib/fastlane/actions/docs/capture_android_screenshots.md +333 -0
- data/fastlane/lib/fastlane/actions/docs/capture_ios_screenshots.md +371 -0
- data/fastlane/lib/fastlane/actions/docs/check_app_store_metadata.md +103 -0
- data/fastlane/lib/fastlane/actions/docs/create_app_online.md +282 -0
- data/fastlane/lib/fastlane/actions/docs/frame_screenshots.md +349 -0
- data/fastlane/lib/fastlane/actions/docs/get_certificates.md +86 -0
- data/fastlane/lib/fastlane/actions/docs/get_provisioning_profile.md +223 -0
- data/fastlane/lib/fastlane/actions/docs/get_push_certificate.md +134 -0
- data/fastlane/lib/fastlane/actions/docs/run_tests.md +151 -0
- data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +573 -0
- data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +725 -0
- data/fastlane/lib/fastlane/actions/docs/upload_to_play_store.md +203 -0
- data/fastlane/lib/fastlane/actions/docs/upload_to_testflight.md +250 -0
- data/fastlane/lib/fastlane/actions/dotgpg_environment.rb +57 -0
- data/fastlane/lib/fastlane/actions/download.rb +76 -0
- data/fastlane/lib/fastlane/actions/download_dsyms.rb +369 -0
- data/fastlane/lib/fastlane/actions/download_from_play_store.rb +61 -0
- data/fastlane/lib/fastlane/actions/dsym_zip.rb +93 -0
- data/fastlane/lib/fastlane/actions/echo.rb +14 -0
- data/fastlane/lib/fastlane/actions/ensure_bundle_exec.rb +59 -0
- data/fastlane/lib/fastlane/actions/ensure_env_vars.rb +58 -0
- data/fastlane/lib/fastlane/actions/ensure_git_branch.rb +69 -0
- data/fastlane/lib/fastlane/actions/ensure_git_status_clean.rb +92 -0
- data/fastlane/lib/fastlane/actions/ensure_no_debug_code.rb +135 -0
- data/fastlane/lib/fastlane/actions/ensure_xcode_version.rb +125 -0
- data/fastlane/lib/fastlane/actions/environment_variable.rb +77 -0
- data/fastlane/lib/fastlane/actions/erb.rb +96 -0
- data/fastlane/lib/fastlane/actions/fastlane_version.rb +15 -0
- data/fastlane/lib/fastlane/actions/flock.rb +82 -0
- data/fastlane/lib/fastlane/actions/frame_screenshots.rb +64 -0
- data/fastlane/lib/fastlane/actions/frameit.rb +14 -0
- data/fastlane/lib/fastlane/actions/gcovr.rb +163 -0
- data/fastlane/lib/fastlane/actions/get_build_number.rb +106 -0
- data/fastlane/lib/fastlane/actions/get_build_number_repository.rb +120 -0
- data/fastlane/lib/fastlane/actions/get_certificates.rb +77 -0
- data/fastlane/lib/fastlane/actions/get_github_release.rb +166 -0
- data/fastlane/lib/fastlane/actions/get_info_plist_value.rb +78 -0
- data/fastlane/lib/fastlane/actions/get_ipa_info_plist_value.rb +82 -0
- data/fastlane/lib/fastlane/actions/get_managed_play_store_publishing_rights.rb +120 -0
- data/fastlane/lib/fastlane/actions/get_provisioning_profile.rb +101 -0
- data/fastlane/lib/fastlane/actions/get_push_certificate.rb +87 -0
- data/fastlane/lib/fastlane/actions/get_version_number.rb +200 -0
- data/fastlane/lib/fastlane/actions/git_add.rb +93 -0
- data/fastlane/lib/fastlane/actions/git_branch.rb +61 -0
- data/fastlane/lib/fastlane/actions/git_commit.rb +80 -0
- data/fastlane/lib/fastlane/actions/git_pull.rb +64 -0
- data/fastlane/lib/fastlane/actions/git_submodule_update.rb +52 -0
- data/fastlane/lib/fastlane/actions/git_tag_exists.rb +74 -0
- data/fastlane/lib/fastlane/actions/github_api.rb +262 -0
- data/fastlane/lib/fastlane/actions/google_play_track_release_names.rb +74 -0
- data/fastlane/lib/fastlane/actions/google_play_track_version_codes.rb +77 -0
- data/fastlane/lib/fastlane/actions/gradle.rb +329 -0
- data/fastlane/lib/fastlane/actions/gym.rb +10 -0
- data/fastlane/lib/fastlane/actions/hg_add_tag.rb +48 -0
- data/fastlane/lib/fastlane/actions/hg_commit_version_bump.rb +183 -0
- data/fastlane/lib/fastlane/actions/hg_ensure_clean_status.rb +53 -0
- data/fastlane/lib/fastlane/actions/hg_push.rb +64 -0
- data/fastlane/lib/fastlane/actions/hipchat.rb +200 -0
- data/fastlane/lib/fastlane/actions/hockey.rb +406 -0
- data/fastlane/lib/fastlane/actions/ifttt.rb +96 -0
- data/fastlane/lib/fastlane/actions/import.rb +49 -0
- data/fastlane/lib/fastlane/actions/import_certificate.rb +77 -0
- data/fastlane/lib/fastlane/actions/import_from_git.rb +83 -0
- data/fastlane/lib/fastlane/actions/increment_build_number.rb +117 -0
- data/fastlane/lib/fastlane/actions/increment_version_number.rb +180 -0
- data/fastlane/lib/fastlane/actions/install_on_device.rb +95 -0
- data/fastlane/lib/fastlane/actions/install_provisioning_profile.rb +58 -0
- data/fastlane/lib/fastlane/actions/install_xcode_plugin.rb +91 -0
- data/fastlane/lib/fastlane/actions/installr.rb +132 -0
- data/fastlane/lib/fastlane/actions/ipa.rb +246 -0
- data/fastlane/lib/fastlane/actions/is_ci.rb +51 -0
- data/fastlane/lib/fastlane/actions/jazzy.rb +56 -0
- data/fastlane/lib/fastlane/actions/jira.rb +115 -0
- data/fastlane/lib/fastlane/actions/lane_context.rb +60 -0
- data/fastlane/lib/fastlane/actions/last_git_commit.rb +58 -0
- data/fastlane/lib/fastlane/actions/last_git_tag.rb +60 -0
- data/fastlane/lib/fastlane/actions/latest_testflight_build_number.rb +155 -0
- data/fastlane/lib/fastlane/actions/lcov.rb +102 -0
- data/fastlane/lib/fastlane/actions/mailgun.rb +197 -0
- data/fastlane/lib/fastlane/actions/make_changelog_from_jenkins.rb +81 -0
- data/fastlane/lib/fastlane/actions/match.rb +14 -0
- data/fastlane/lib/fastlane/actions/min_fastlane_version.rb +57 -0
- data/fastlane/lib/fastlane/actions/modify_services.rb +173 -0
- data/fastlane/lib/fastlane/actions/nexus_upload.rb +230 -0
- data/fastlane/lib/fastlane/actions/notarize.rb +193 -0
- data/fastlane/lib/fastlane/actions/notification.rb +75 -0
- data/fastlane/lib/fastlane/actions/notify.rb +40 -0
- data/fastlane/lib/fastlane/actions/number_of_commits.rb +75 -0
- data/fastlane/lib/fastlane/actions/oclint.rb +269 -0
- data/fastlane/lib/fastlane/actions/onesignal.rb +186 -0
- data/fastlane/lib/fastlane/actions/opt_out_crash_reporting.rb +33 -0
- data/fastlane/lib/fastlane/actions/opt_out_usage.rb +40 -0
- data/fastlane/lib/fastlane/actions/pem.rb +14 -0
- data/fastlane/lib/fastlane/actions/pilot.rb +14 -0
- data/fastlane/lib/fastlane/actions/pod_lib_lint.rb +189 -0
- data/fastlane/lib/fastlane/actions/pod_push.rb +173 -0
- data/fastlane/lib/fastlane/actions/podio_item.rb +217 -0
- data/fastlane/lib/fastlane/actions/precheck.rb +14 -0
- data/fastlane/lib/fastlane/actions/println.rb +14 -0
- data/fastlane/lib/fastlane/actions/produce.rb +14 -0
- data/fastlane/lib/fastlane/actions/prompt.rb +119 -0
- data/fastlane/lib/fastlane/actions/push_git_tags.rb +76 -0
- data/fastlane/lib/fastlane/actions/push_to_git_remote.rb +127 -0
- data/fastlane/lib/fastlane/actions/puts.rb +68 -0
- data/fastlane/lib/fastlane/actions/read_podspec.rb +90 -0
- data/fastlane/lib/fastlane/actions/recreate_schemes.rb +46 -0
- data/fastlane/lib/fastlane/actions/register_device.rb +151 -0
- data/fastlane/lib/fastlane/actions/register_devices.rb +214 -0
- data/fastlane/lib/fastlane/actions/reset_git_repo.rb +121 -0
- data/fastlane/lib/fastlane/actions/reset_simulator_contents.rb +92 -0
- data/fastlane/lib/fastlane/actions/resign.rb +132 -0
- data/fastlane/lib/fastlane/actions/restore_file.rb +44 -0
- data/fastlane/lib/fastlane/actions/rocket.rb +83 -0
- data/fastlane/lib/fastlane/actions/rsync.rb +74 -0
- data/fastlane/lib/fastlane/actions/ruby_version.rb +56 -0
- data/fastlane/lib/fastlane/actions/run_tests.rb +114 -0
- data/fastlane/lib/fastlane/actions/s3.rb +174 -0
- data/fastlane/lib/fastlane/actions/say.rb +56 -0
- data/fastlane/lib/fastlane/actions/scan.rb +14 -0
- data/fastlane/lib/fastlane/actions/scp.rb +114 -0
- data/fastlane/lib/fastlane/actions/screengrab.rb +14 -0
- data/fastlane/lib/fastlane/actions/set_build_number_repository.rb +76 -0
- data/fastlane/lib/fastlane/actions/set_changelog.rb +204 -0
- data/fastlane/lib/fastlane/actions/set_github_release.rb +274 -0
- data/fastlane/lib/fastlane/actions/set_info_plist_value.rb +92 -0
- data/fastlane/lib/fastlane/actions/set_pod_key.rb +78 -0
- data/fastlane/lib/fastlane/actions/setup_ci.rb +132 -0
- data/fastlane/lib/fastlane/actions/setup_circle_ci.rb +58 -0
- data/fastlane/lib/fastlane/actions/setup_jenkins.rb +202 -0
- data/fastlane/lib/fastlane/actions/setup_travis.rb +57 -0
- data/fastlane/lib/fastlane/actions/sh.rb +71 -0
- data/fastlane/lib/fastlane/actions/sigh.rb +14 -0
- data/fastlane/lib/fastlane/actions/skip_docs.rb +52 -0
- data/fastlane/lib/fastlane/actions/slack.rb +288 -0
- data/fastlane/lib/fastlane/actions/slather.rb +329 -0
- data/fastlane/lib/fastlane/actions/snapshot.rb +14 -0
- data/fastlane/lib/fastlane/actions/sonar.rb +177 -0
- data/fastlane/lib/fastlane/actions/spaceship_logs.rb +135 -0
- data/fastlane/lib/fastlane/actions/spaceship_stats.rb +73 -0
- data/fastlane/lib/fastlane/actions/splunkmint.rb +156 -0
- data/fastlane/lib/fastlane/actions/spm.rb +138 -0
- data/fastlane/lib/fastlane/actions/ssh.rb +162 -0
- data/fastlane/lib/fastlane/actions/supply.rb +14 -0
- data/fastlane/lib/fastlane/actions/swiftlint.rb +240 -0
- data/fastlane/lib/fastlane/actions/sync_code_signing.rb +109 -0
- data/fastlane/lib/fastlane/actions/team_id.rb +42 -0
- data/fastlane/lib/fastlane/actions/team_name.rb +42 -0
- data/fastlane/lib/fastlane/actions/testfairy.rb +285 -0
- data/fastlane/lib/fastlane/actions/testflight.rb +14 -0
- data/fastlane/lib/fastlane/actions/tryouts.rb +149 -0
- data/fastlane/lib/fastlane/actions/twitter.rb +89 -0
- data/fastlane/lib/fastlane/actions/typetalk.rb +93 -0
- data/fastlane/lib/fastlane/actions/unlock_keychain.rb +132 -0
- data/fastlane/lib/fastlane/actions/update_app_group_identifiers.rb +91 -0
- data/fastlane/lib/fastlane/actions/update_app_identifier.rb +124 -0
- data/fastlane/lib/fastlane/actions/update_code_signing_settings.rb +203 -0
- data/fastlane/lib/fastlane/actions/update_fastlane.rb +137 -0
- data/fastlane/lib/fastlane/actions/update_icloud_container_identifiers.rb +99 -0
- data/fastlane/lib/fastlane/actions/update_info_plist.rb +143 -0
- data/fastlane/lib/fastlane/actions/update_keychain_access_groups.rb +94 -0
- data/fastlane/lib/fastlane/actions/update_plist.rb +115 -0
- data/fastlane/lib/fastlane/actions/update_project_code_signing.rb +76 -0
- data/fastlane/lib/fastlane/actions/update_project_provisioning.rb +173 -0
- data/fastlane/lib/fastlane/actions/update_project_team.rb +95 -0
- data/fastlane/lib/fastlane/actions/update_urban_airship_configuration.rb +91 -0
- data/fastlane/lib/fastlane/actions/update_url_schemes.rb +123 -0
- data/fastlane/lib/fastlane/actions/upload_symbols_to_crashlytics.rb +231 -0
- data/fastlane/lib/fastlane/actions/upload_symbols_to_sentry.rb +165 -0
- data/fastlane/lib/fastlane/actions/upload_to_app_store.rb +67 -0
- data/fastlane/lib/fastlane/actions/upload_to_play_store.rb +80 -0
- data/fastlane/lib/fastlane/actions/upload_to_play_store_internal_app_sharing.rb +78 -0
- data/fastlane/lib/fastlane/actions/upload_to_testflight.rb +119 -0
- data/fastlane/lib/fastlane/actions/validate_play_store_json_key.rb +104 -0
- data/fastlane/lib/fastlane/actions/verify_build.rb +199 -0
- data/fastlane/lib/fastlane/actions/verify_pod_keys.rb +67 -0
- data/fastlane/lib/fastlane/actions/verify_xcode.rb +159 -0
- data/fastlane/lib/fastlane/actions/version_bump_podspec.rb +105 -0
- data/fastlane/lib/fastlane/actions/version_get_podspec.rb +71 -0
- data/fastlane/lib/fastlane/actions/xcode_install.rb +105 -0
- data/fastlane/lib/fastlane/actions/xcode_select.rb +68 -0
- data/fastlane/lib/fastlane/actions/xcode_server_get_assets.rb +312 -0
- data/fastlane/lib/fastlane/actions/xcodebuild.rb +641 -0
- data/fastlane/lib/fastlane/actions/xcov.rb +66 -0
- data/fastlane/lib/fastlane/actions/xctool.rb +55 -0
- data/fastlane/lib/fastlane/actions/xcversion.rb +55 -0
- data/fastlane/lib/fastlane/actions/zip.rb +120 -0
- data/fastlane/lib/fastlane/auto_complete.rb +82 -0
- data/fastlane/lib/fastlane/boolean.rb +5 -0
- data/fastlane/lib/fastlane/cli_tools_distributor.rb +207 -0
- data/fastlane/lib/fastlane/command_line_handler.rb +49 -0
- data/fastlane/lib/fastlane/commands_generator.rb +369 -0
- data/fastlane/lib/fastlane/configuration_helper.rb +26 -0
- data/fastlane/lib/fastlane/core_ext/bundler_monkey_patch.rb +14 -0
- data/fastlane/lib/fastlane/documentation/actions_list.rb +214 -0
- data/fastlane/lib/fastlane/documentation/docs_generator.rb +89 -0
- data/fastlane/lib/fastlane/documentation/markdown_docs_generator.rb +228 -0
- data/fastlane/lib/fastlane/environment_printer.rb +303 -0
- data/fastlane/lib/fastlane/erb_template_helper.rb +30 -0
- data/fastlane/lib/fastlane/fast_file.rb +439 -0
- data/fastlane/lib/fastlane/fastlane_require.rb +75 -0
- data/fastlane/lib/fastlane/features.rb +4 -0
- data/fastlane/lib/fastlane/helper/README.md +29 -0
- data/fastlane/lib/fastlane/helper/adb_helper.rb +66 -0
- data/fastlane/lib/fastlane/helper/crashlytics_helper.rb +157 -0
- data/fastlane/lib/fastlane/helper/dotenv_helper.rb +50 -0
- data/fastlane/lib/fastlane/helper/gem_helper.rb +26 -0
- data/fastlane/lib/fastlane/helper/git_helper.rb +137 -0
- data/fastlane/lib/fastlane/helper/gradle_helper.rb +62 -0
- data/fastlane/lib/fastlane/helper/lane_helper.rb +13 -0
- data/fastlane/lib/fastlane/helper/podspec_helper.rb +75 -0
- data/fastlane/lib/fastlane/helper/s3_client_helper.rb +78 -0
- data/fastlane/lib/fastlane/helper/sh_helper.rb +134 -0
- data/fastlane/lib/fastlane/helper/xcodeproj_helper.rb +12 -0
- data/fastlane/lib/fastlane/helper/xcversion_helper.rb +25 -0
- data/fastlane/lib/fastlane/junit_generator.rb +27 -0
- data/fastlane/lib/fastlane/lane.rb +97 -0
- data/fastlane/lib/fastlane/lane_list.rb +137 -0
- data/fastlane/lib/fastlane/lane_manager.rb +130 -0
- data/fastlane/lib/fastlane/lane_manager_base.rb +92 -0
- data/fastlane/lib/fastlane/markdown_table_formatter.rb +62 -0
- data/fastlane/lib/fastlane/new_action.rb +47 -0
- data/fastlane/lib/fastlane/one_off.rb +45 -0
- data/fastlane/lib/fastlane/other_action.rb +29 -0
- data/fastlane/lib/fastlane/plugins/plugin_fetcher.rb +55 -0
- data/fastlane/lib/fastlane/plugins/plugin_generator.rb +86 -0
- data/fastlane/lib/fastlane/plugins/plugin_generator_ui.rb +19 -0
- data/fastlane/lib/fastlane/plugins/plugin_info.rb +49 -0
- data/fastlane/lib/fastlane/plugins/plugin_info_collector.rb +159 -0
- data/fastlane/lib/fastlane/plugins/plugin_manager.rb +399 -0
- data/fastlane/lib/fastlane/plugins/plugin_search.rb +46 -0
- data/fastlane/lib/fastlane/plugins/plugin_update_manager.rb +70 -0
- data/fastlane/lib/fastlane/plugins/plugins.rb +12 -0
- data/fastlane/lib/fastlane/plugins/template/%gem_name%.gemspec.erb +35 -0
- data/fastlane/lib/fastlane/plugins/template/.circleci/config.yml +43 -0
- data/fastlane/lib/fastlane/plugins/template/.github/workflows/test.yml +29 -0
- data/fastlane/lib/fastlane/plugins/template/.gitignore +12 -0
- data/fastlane/lib/fastlane/plugins/template/.rspec +5 -0
- data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +188 -0
- data/fastlane/lib/fastlane/plugins/template/.travis.yml +4 -0
- data/fastlane/lib/fastlane/plugins/template/Gemfile +6 -0
- data/fastlane/lib/fastlane/plugins/template/LICENSE.erb +21 -0
- data/fastlane/lib/fastlane/plugins/template/README.md.erb +52 -0
- data/fastlane/lib/fastlane/plugins/template/Rakefile +9 -0
- data/fastlane/lib/fastlane/plugins/template/fastlane/Fastfile.erb +3 -0
- data/fastlane/lib/fastlane/plugins/template/fastlane/Pluginfile.erb +1 -0
- data/fastlane/lib/fastlane/plugins/template/lib/fastlane/plugin/%plugin_name%.rb.erb +16 -0
- data/fastlane/lib/fastlane/plugins/template/lib/fastlane/plugin/%plugin_name%/actions/%plugin_name%_action.rb.erb +47 -0
- data/fastlane/lib/fastlane/plugins/template/lib/fastlane/plugin/%plugin_name%/helper/%plugin_name%_helper.rb.erb +16 -0
- data/fastlane/lib/fastlane/plugins/template/lib/fastlane/plugin/%plugin_name%/version.rb.erb +5 -0
- data/fastlane/lib/fastlane/plugins/template/spec/%plugin_name%_action_spec.rb.erb +9 -0
- data/fastlane/lib/fastlane/plugins/template/spec/spec_helper.rb.erb +15 -0
- data/fastlane/lib/fastlane/runner.rb +378 -0
- data/fastlane/lib/fastlane/server/action_command.rb +61 -0
- data/fastlane/lib/fastlane/server/action_command_return.rb +14 -0
- data/fastlane/lib/fastlane/server/command_executor.rb +7 -0
- data/fastlane/lib/fastlane/server/command_parser.rb +44 -0
- data/fastlane/lib/fastlane/server/control_command.rb +23 -0
- data/fastlane/lib/fastlane/server/json_return_value_processor.rb +72 -0
- data/fastlane/lib/fastlane/server/socket_server.rb +238 -0
- data/fastlane/lib/fastlane/server/socket_server_action_command_executor.rb +101 -0
- data/fastlane/lib/fastlane/setup/setup.rb +355 -0
- data/fastlane/lib/fastlane/setup/setup_android.rb +97 -0
- data/fastlane/lib/fastlane/setup/setup_ios.rb +504 -0
- data/fastlane/lib/fastlane/shells.rb +6 -0
- data/fastlane/lib/fastlane/supported_platforms.rb +28 -0
- data/fastlane/lib/fastlane/swift_fastlane_api_generator.rb +477 -0
- data/fastlane/lib/fastlane/swift_fastlane_function.rb +419 -0
- data/fastlane/lib/fastlane/swift_lane_manager.rb +296 -0
- data/fastlane/lib/fastlane/swift_runner_upgrader.rb +210 -0
- data/fastlane/lib/fastlane/tools.rb +33 -0
- data/fastlane/lib/fastlane/version.rb +6 -0
- data/fastlane/swift/Actions.swift +16 -0
- data/fastlane/swift/Appfile.swift +15 -0
- data/fastlane/swift/ArgumentProcessor.swift +89 -0
- data/fastlane/swift/ControlCommand.swift +74 -0
- data/fastlane/swift/Deliverfile.swift +20 -0
- data/fastlane/swift/DeliverfileProtocol.swift +259 -0
- data/fastlane/swift/Fastfile.swift +16 -0
- data/fastlane/swift/Fastlane.swift +9402 -0
- data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.pbxproj +434 -0
- data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/xcshareddata/xcschemes/FastlaneRunner.xcscheme +97 -0
- data/fastlane/swift/FastlaneSwiftRunner/README.txt +10 -0
- data/fastlane/swift/Gymfile.swift +20 -0
- data/fastlane/swift/GymfileProtocol.swift +187 -0
- data/fastlane/swift/LaneFileProtocol.swift +149 -0
- data/fastlane/swift/MainProcess.swift +77 -0
- data/fastlane/swift/Matchfile.swift +20 -0
- data/fastlane/swift/MatchfileProtocol.swift +187 -0
- data/fastlane/swift/Plugins.swift +16 -0
- data/fastlane/swift/Precheckfile.swift +20 -0
- data/fastlane/swift/PrecheckfileProtocol.swift +51 -0
- data/fastlane/swift/RubyCommand.swift +157 -0
- data/fastlane/swift/RubyCommandable.swift +43 -0
- data/fastlane/swift/Runner.swift +275 -0
- data/fastlane/swift/RunnerArgument.swift +20 -0
- data/fastlane/swift/Scanfile.swift +20 -0
- data/fastlane/swift/ScanfileProtocol.swift +263 -0
- data/fastlane/swift/Screengrabfile.swift +20 -0
- data/fastlane/swift/ScreengrabfileProtocol.swift +99 -0
- data/fastlane/swift/Snapshotfile.swift +20 -0
- data/fastlane/swift/SnapshotfileProtocol.swift +187 -0
- data/fastlane/swift/SocketClient.swift +327 -0
- data/fastlane/swift/SocketClientDelegateProtocol.swift +21 -0
- data/fastlane/swift/SocketResponse.swift +82 -0
- data/fastlane/swift/formatting/Brewfile +1 -0
- data/fastlane/swift/formatting/Brewfile.lock.json +47 -0
- data/fastlane/swift/formatting/Rakefile +18 -0
- data/fastlane/swift/main.swift +47 -0
- data/fastlane/swift/upgrade_manifest.json +1 -0
- data/fastlane_core/README.md +79 -0
- data/fastlane_core/lib/assets/XMLTemplate.xml.erb +12 -0
- data/fastlane_core/lib/fastlane_core.rb +46 -0
- data/fastlane_core/lib/fastlane_core/analytics/action_completion_context.rb +34 -0
- data/fastlane_core/lib/fastlane_core/analytics/action_launch_context.rb +38 -0
- data/fastlane_core/lib/fastlane_core/analytics/analytics_event_builder.rb +23 -0
- data/fastlane_core/lib/fastlane_core/analytics/analytics_ingester_client.rb +54 -0
- data/fastlane_core/lib/fastlane_core/analytics/analytics_session.rb +70 -0
- data/fastlane_core/lib/fastlane_core/analytics/app_identifier_guesser.rb +64 -0
- data/fastlane_core/lib/fastlane_core/android_package_name_guesser.rb +79 -0
- data/fastlane_core/lib/fastlane_core/build_watcher.rb +96 -0
- data/fastlane_core/lib/fastlane_core/cert_checker.rb +144 -0
- data/fastlane_core/lib/fastlane_core/command_executor.rb +100 -0
- data/fastlane_core/lib/fastlane_core/configuration/commander_generator.rb +103 -0
- data/fastlane_core/lib/fastlane_core/configuration/config_item.rb +321 -0
- data/fastlane_core/lib/fastlane_core/configuration/configuration.rb +332 -0
- data/fastlane_core/lib/fastlane_core/configuration/configuration_file.rb +182 -0
- data/fastlane_core/lib/fastlane_core/core_ext/cfpropertylist.rb +23 -0
- data/fastlane_core/lib/fastlane_core/core_ext/shellwords.rb +63 -0
- data/fastlane_core/lib/fastlane_core/core_ext/string.rb +17 -0
- data/fastlane_core/lib/fastlane_core/device_manager.rb +374 -0
- data/fastlane_core/lib/fastlane_core/env.rb +9 -0
- data/fastlane_core/lib/fastlane_core/fastlane_folder.rb +72 -0
- data/fastlane_core/lib/fastlane_core/fastlane_pty.rb +57 -0
- data/fastlane_core/lib/fastlane_core/feature/feature.rb +51 -0
- data/fastlane_core/lib/fastlane_core/features.rb +4 -0
- data/fastlane_core/lib/fastlane_core/globals.rb +27 -0
- data/fastlane_core/lib/fastlane_core/helper.rb +437 -0
- data/fastlane_core/lib/fastlane_core/ios_app_identifier_guesser.rb +112 -0
- data/fastlane_core/lib/fastlane_core/ipa_file_analyser.rb +63 -0
- data/fastlane_core/lib/fastlane_core/ipa_upload_package_builder.rb +52 -0
- data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +595 -0
- data/fastlane_core/lib/fastlane_core/keychain_importer.rb +120 -0
- data/fastlane_core/lib/fastlane_core/languages.rb +16 -0
- data/fastlane_core/lib/fastlane_core/module.rb +31 -0
- data/fastlane_core/lib/fastlane_core/pkg_file_analyser.rb +51 -0
- data/fastlane_core/lib/fastlane_core/pkg_upload_package_builder.rb +48 -0
- data/fastlane_core/lib/fastlane_core/print_table.rb +131 -0
- data/fastlane_core/lib/fastlane_core/project.rb +509 -0
- data/fastlane_core/lib/fastlane_core/provisioning_profile.rb +124 -0
- data/fastlane_core/lib/fastlane_core/string_filters.rb +51 -0
- data/fastlane_core/lib/fastlane_core/swag.rb +85 -0
- data/fastlane_core/lib/fastlane_core/tag_version.rb +31 -0
- data/fastlane_core/lib/fastlane_core/test_parser.rb +107 -0
- data/fastlane_core/lib/fastlane_core/ui/disable_colors.rb +17 -0
- data/fastlane_core/lib/fastlane_core/ui/errors.rb +1 -0
- data/fastlane_core/lib/fastlane_core/ui/errors/fastlane_common_error.rb +19 -0
- data/fastlane_core/lib/fastlane_core/ui/errors/fastlane_crash.rb +11 -0
- data/fastlane_core/lib/fastlane_core/ui/errors/fastlane_error.rb +25 -0
- data/fastlane_core/lib/fastlane_core/ui/errors/fastlane_exception.rb +19 -0
- data/fastlane_core/lib/fastlane_core/ui/errors/fastlane_shell_error.rb +11 -0
- data/fastlane_core/lib/fastlane_core/ui/fastlane_runner.rb +294 -0
- data/fastlane_core/lib/fastlane_core/ui/github_issue_inspector_reporter.rb +62 -0
- data/fastlane_core/lib/fastlane_core/ui/implementations/shell.rb +159 -0
- data/fastlane_core/lib/fastlane_core/ui/interface.rb +205 -0
- data/fastlane_core/lib/fastlane_core/ui/ui.rb +26 -0
- data/fastlane_core/lib/fastlane_core/update_checker/changelog.rb +37 -0
- data/fastlane_core/lib/fastlane_core/update_checker/update_checker.rb +109 -0
- data/frameit/README.md +17 -0
- data/frameit/lib/assets/empty.png +0 -0
- data/frameit/lib/frameit.rb +13 -0
- data/frameit/lib/frameit/commands_generator.rb +140 -0
- data/frameit/lib/frameit/config_parser.rb +136 -0
- data/frameit/lib/frameit/dependency_checker.rb +22 -0
- data/frameit/lib/frameit/device.rb +90 -0
- data/frameit/lib/frameit/device_types.rb +144 -0
- data/frameit/lib/frameit/editor.rb +560 -0
- data/frameit/lib/frameit/frame_downloader.rb +85 -0
- data/frameit/lib/frameit/mac_editor.rb +35 -0
- data/frameit/lib/frameit/module.rb +42 -0
- data/frameit/lib/frameit/offsets.rb +28 -0
- data/frameit/lib/frameit/options.rb +112 -0
- data/frameit/lib/frameit/runner.rb +97 -0
- data/frameit/lib/frameit/screenshot.rb +134 -0
- data/frameit/lib/frameit/strings_parser.rb +46 -0
- data/frameit/lib/frameit/template_finder.rb +45 -0
- data/frameit/lib/frameit/trim_box.rb +35 -0
- data/gym/README.md +17 -0
- data/gym/lib/assets/GymfileTemplate +13 -0
- data/gym/lib/assets/GymfileTemplate.swift +13 -0
- data/gym/lib/assets/wrap_xcodebuild/xcbuild-safe.sh +61 -0
- data/gym/lib/gym.rb +9 -0
- data/gym/lib/gym/code_signing_mapping.rb +210 -0
- data/gym/lib/gym/commands_generator.rb +78 -0
- data/gym/lib/gym/detect_values.rb +206 -0
- data/gym/lib/gym/error_handler.rb +306 -0
- data/gym/lib/gym/generators/README.md +1 -0
- data/gym/lib/gym/generators/build_command_generator.rb +147 -0
- data/gym/lib/gym/generators/package_command_generator.rb +68 -0
- data/gym/lib/gym/generators/package_command_generator_xcode7.rb +232 -0
- data/gym/lib/gym/manager.rb +22 -0
- data/gym/lib/gym/module.rb +74 -0
- data/gym/lib/gym/options.rb +286 -0
- data/gym/lib/gym/runner.rb +365 -0
- data/gym/lib/gym/xcode.rb +27 -0
- data/gym/lib/gym/xcodebuild_fixes/README.md +9 -0
- data/gym/lib/gym/xcodebuild_fixes/generic_archive_fix.rb +35 -0
- data/match/README.md +17 -0
- data/match/lib/assets/MatchfileTemplate +11 -0
- data/match/lib/assets/MatchfileTemplate.swift +9 -0
- data/match/lib/assets/READMETemplate.md +59 -0
- data/match/lib/match.rb +14 -0
- data/match/lib/match/change_password.rb +53 -0
- data/match/lib/match/commands_generator.rb +190 -0
- data/match/lib/match/encryption.rb +49 -0
- data/match/lib/match/encryption/interface.rb +17 -0
- data/match/lib/match/encryption/openssl.rb +161 -0
- data/match/lib/match/generator.rb +122 -0
- data/match/lib/match/importer.rb +157 -0
- data/match/lib/match/migrate.rb +109 -0
- data/match/lib/match/module.rb +32 -0
- data/match/lib/match/nuke.rb +350 -0
- data/match/lib/match/options.rb +315 -0
- data/match/lib/match/runner.rb +369 -0
- data/match/lib/match/setup.rb +40 -0
- data/match/lib/match/spaceship_ensure.rb +97 -0
- data/match/lib/match/storage.rb +46 -0
- data/match/lib/match/storage/git_storage.rb +250 -0
- data/match/lib/match/storage/google_cloud_storage.rb +382 -0
- data/match/lib/match/storage/interface.rb +119 -0
- data/match/lib/match/storage/s3_storage.rb +205 -0
- data/match/lib/match/table_printer.rb +51 -0
- data/match/lib/match/utils.rb +75 -0
- data/pem/README.md +17 -0
- data/pem/lib/pem.rb +4 -0
- data/pem/lib/pem/commands_generator.rb +47 -0
- data/pem/lib/pem/manager.rb +112 -0
- data/pem/lib/pem/module.rb +19 -0
- data/pem/lib/pem/options.rb +103 -0
- data/pilot/README.md +17 -0
- data/pilot/lib/pilot.rb +9 -0
- data/pilot/lib/pilot/build_manager.rb +546 -0
- data/pilot/lib/pilot/commands_generator.rb +174 -0
- data/pilot/lib/pilot/features.rb +0 -0
- data/pilot/lib/pilot/manager.rb +90 -0
- data/pilot/lib/pilot/module.rb +11 -0
- data/pilot/lib/pilot/options.rb +303 -0
- data/pilot/lib/pilot/tester_exporter.rb +58 -0
- data/pilot/lib/pilot/tester_importer.rb +53 -0
- data/pilot/lib/pilot/tester_manager.rb +168 -0
- data/pilot/lib/pilot/tester_util.rb +0 -0
- data/precheck/README.md +17 -0
- data/precheck/lib/assets/PrecheckfileTemplate +27 -0
- data/precheck/lib/assets/PrecheckfileTemplate.swift +19 -0
- data/precheck/lib/precheck.rb +3 -0
- data/precheck/lib/precheck/commands_generator.rb +74 -0
- data/precheck/lib/precheck/item_to_check.rb +58 -0
- data/precheck/lib/precheck/module.rb +21 -0
- data/precheck/lib/precheck/options.rb +104 -0
- data/precheck/lib/precheck/rule.rb +171 -0
- data/precheck/lib/precheck/rule_check_result.rb +19 -0
- data/precheck/lib/precheck/rule_processor.rb +265 -0
- data/precheck/lib/precheck/rules/abstract_text_match_rule.rb +80 -0
- data/precheck/lib/precheck/rules/all.rb +1 -0
- data/precheck/lib/precheck/rules/copyright_date_rule.rb +37 -0
- data/precheck/lib/precheck/rules/curse_words_rule.rb +62 -0
- data/precheck/lib/precheck/rules/custom_text_rule.rb +35 -0
- data/precheck/lib/precheck/rules/free_stuff_iap_rule.rb +31 -0
- data/precheck/lib/precheck/rules/future_functionality_rule.rb +33 -0
- data/precheck/lib/precheck/rules/negative_apple_sentiment_rule.rb +37 -0
- data/precheck/lib/precheck/rules/other_platforms_rule.rb +43 -0
- data/precheck/lib/precheck/rules/placeholder_words_rule.rb +31 -0
- data/precheck/lib/precheck/rules/rules_data/curse_word_hashes/en_us.txt +349 -0
- data/precheck/lib/precheck/rules/test_words_rule.rb +30 -0
- data/precheck/lib/precheck/rules/unreachable_urls_rule.rb +47 -0
- data/precheck/lib/precheck/runner.rb +197 -0
- data/produce/README.md +17 -0
- data/produce/lib/produce.rb +6 -0
- data/produce/lib/produce/available_default_languages.rb +51 -0
- data/produce/lib/produce/cloud_container.rb +82 -0
- data/produce/lib/produce/commands_generator.rb +236 -0
- data/produce/lib/produce/developer_center.rb +143 -0
- data/produce/lib/produce/group.rb +90 -0
- data/produce/lib/produce/itunes_connect.rb +139 -0
- data/produce/lib/produce/manager.rb +15 -0
- data/produce/lib/produce/merchant.rb +121 -0
- data/produce/lib/produce/module.rb +14 -0
- data/produce/lib/produce/options.rb +184 -0
- data/produce/lib/produce/service.rb +319 -0
- data/scan/README.md +17 -0
- data/scan/lib/assets/ScanfileTemplate +16 -0
- data/scan/lib/assets/ScanfileTemplate.swift +13 -0
- data/scan/lib/scan.rb +10 -0
- data/scan/lib/scan/commands_generator.rb +78 -0
- data/scan/lib/scan/detect_values.rb +224 -0
- data/scan/lib/scan/error_handler.rb +57 -0
- data/scan/lib/scan/manager.rb +38 -0
- data/scan/lib/scan/module.rb +32 -0
- data/scan/lib/scan/options.rb +445 -0
- data/scan/lib/scan/runner.rb +197 -0
- data/scan/lib/scan/slack_poster.rb +60 -0
- data/scan/lib/scan/test_command_generator.rb +174 -0
- data/scan/lib/scan/test_result_parser.rb +33 -0
- data/scan/lib/scan/xcpretty_reporter_options_generator.rb +85 -0
- data/screengrab/README.md +17 -0
- data/screengrab/lib/assets/ScreengrabfileTemplate +15 -0
- data/screengrab/lib/assets/ScreengrabfileTemplate.swift +15 -0
- data/screengrab/lib/screengrab.rb +7 -0
- data/screengrab/lib/screengrab/android_environment.rb +91 -0
- data/screengrab/lib/screengrab/commands_generator.rb +70 -0
- data/screengrab/lib/screengrab/dependency_checker.rb +58 -0
- data/screengrab/lib/screengrab/detect_values.rb +16 -0
- data/screengrab/lib/screengrab/module.rb +26 -0
- data/screengrab/lib/screengrab/options.rb +148 -0
- data/screengrab/lib/screengrab/page.html.erb +190 -0
- data/screengrab/lib/screengrab/reports_generator.rb +36 -0
- data/screengrab/lib/screengrab/runner.rb +449 -0
- data/screengrab/lib/screengrab/setup.rb +24 -0
- data/sigh/README.md +17 -0
- data/sigh/lib/assets/resign.sh +909 -0
- data/sigh/lib/sigh.rb +4 -0
- data/sigh/lib/sigh/commands_generator.rb +154 -0
- data/sigh/lib/sigh/download_all.rb +112 -0
- data/sigh/lib/sigh/local_manage.rb +145 -0
- data/sigh/lib/sigh/manager.rb +47 -0
- data/sigh/lib/sigh/module.rb +42 -0
- data/sigh/lib/sigh/options.rb +187 -0
- data/sigh/lib/sigh/repair.rb +34 -0
- data/sigh/lib/sigh/resign.rb +220 -0
- data/sigh/lib/sigh/runner.rb +402 -0
- data/snapshot/README.md +17 -0
- data/snapshot/lib/assets/SnapfileTemplate +37 -0
- data/snapshot/lib/assets/SnapfileTemplate.swift +41 -0
- data/snapshot/lib/assets/SnapshotHelper.swift +301 -0
- data/snapshot/lib/assets/SnapshotHelperXcode8.swift +172 -0
- data/snapshot/lib/snapshot.rb +19 -0
- data/snapshot/lib/snapshot/collector.rb +140 -0
- data/snapshot/lib/snapshot/commands_generator.rb +115 -0
- data/snapshot/lib/snapshot/dependency_checker.rb +69 -0
- data/snapshot/lib/snapshot/detect_values.rb +86 -0
- data/snapshot/lib/snapshot/error_handler.rb +24 -0
- data/snapshot/lib/snapshot/fixes/README.md +5 -0
- data/snapshot/lib/snapshot/fixes/hardware_keyboard_fix.rb +27 -0
- data/snapshot/lib/snapshot/fixes/simulator_shared_pasteboard.rb +16 -0
- data/snapshot/lib/snapshot/fixes/simulator_zoom_fix.rb +27 -0
- data/snapshot/lib/snapshot/latest_os_version.rb +34 -0
- data/snapshot/lib/snapshot/module.rb +44 -0
- data/snapshot/lib/snapshot/options.rb +290 -0
- data/snapshot/lib/snapshot/page.html.erb +285 -0
- data/snapshot/lib/snapshot/reports_generator.rb +139 -0
- data/snapshot/lib/snapshot/reset_simulators.rb +122 -0
- data/snapshot/lib/snapshot/runner.rb +146 -0
- data/snapshot/lib/snapshot/screenshot_flatten.rb +20 -0
- data/snapshot/lib/snapshot/screenshot_rotate.rb +36 -0
- data/snapshot/lib/snapshot/setup.rb +58 -0
- data/snapshot/lib/snapshot/simulator_launchers/launcher_configuration.rb +62 -0
- data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher.rb +219 -0
- data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +200 -0
- data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_xcode_8.rb +113 -0
- data/snapshot/lib/snapshot/test_command_generator.rb +108 -0
- data/snapshot/lib/snapshot/test_command_generator_base.rb +128 -0
- data/snapshot/lib/snapshot/test_command_generator_xcode_8.rb +70 -0
- data/snapshot/lib/snapshot/update.rb +38 -0
- data/spaceship/README.md +183 -0
- data/spaceship/lib/assets/displayFamilies.json +181 -0
- data/spaceship/lib/assets/languageMapping.json +306 -0
- data/spaceship/lib/assets/languageMappingReadable.json +30 -0
- data/spaceship/lib/spaceship.rb +30 -0
- data/spaceship/lib/spaceship/base.rb +310 -0
- data/spaceship/lib/spaceship/client.rb +913 -0
- data/spaceship/lib/spaceship/commands_generator.rb +53 -0
- data/spaceship/lib/spaceship/connect_api.rb +116 -0
- data/spaceship/lib/spaceship/connect_api/api_client.rb +279 -0
- data/spaceship/lib/spaceship/connect_api/client.rb +216 -0
- data/spaceship/lib/spaceship/connect_api/file_uploader.rb +99 -0
- data/spaceship/lib/spaceship/connect_api/model.rb +172 -0
- data/spaceship/lib/spaceship/connect_api/models/age_rating_declaration.rb +114 -0
- data/spaceship/lib/spaceship/connect_api/models/app.rb +388 -0
- data/spaceship/lib/spaceship/connect_api/models/app_category.rb +94 -0
- data/spaceship/lib/spaceship/connect_api/models/app_info.rb +95 -0
- data/spaceship/lib/spaceship/connect_api/models/app_info_localization.rb +39 -0
- data/spaceship/lib/spaceship/connect_api/models/app_preview.rb +131 -0
- data/spaceship/lib/spaceship/connect_api/models/app_preview_set.rb +100 -0
- data/spaceship/lib/spaceship/connect_api/models/app_price.rb +22 -0
- data/spaceship/lib/spaceship/connect_api/models/app_price_point.rb +26 -0
- data/spaceship/lib/spaceship/connect_api/models/app_price_tier.rb +12 -0
- data/spaceship/lib/spaceship/connect_api/models/app_screenshot.rb +187 -0
- data/spaceship/lib/spaceship/connect_api/models/app_screenshot_set.rb +153 -0
- data/spaceship/lib/spaceship/connect_api/models/app_store_review_attachment.rb +71 -0
- data/spaceship/lib/spaceship/connect_api/models/app_store_review_detail.rb +51 -0
- data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +217 -0
- data/spaceship/lib/spaceship/connect_api/models/app_store_version_localization.rb +85 -0
- data/spaceship/lib/spaceship/connect_api/models/app_store_version_phased_release.rb +57 -0
- data/spaceship/lib/spaceship/connect_api/models/app_store_version_release_request.rb +12 -0
- data/spaceship/lib/spaceship/connect_api/models/app_store_version_submission.rb +26 -0
- data/spaceship/lib/spaceship/connect_api/models/beta_app_localization.rb +28 -0
- data/spaceship/lib/spaceship/connect_api/models/beta_app_review_detail.rb +32 -0
- data/spaceship/lib/spaceship/connect_api/models/beta_app_review_submission.rb +26 -0
- data/spaceship/lib/spaceship/connect_api/models/beta_build_localization.rb +20 -0
- data/spaceship/lib/spaceship/connect_api/models/beta_build_metric.rb +24 -0
- data/spaceship/lib/spaceship/connect_api/models/beta_feedback.rb +75 -0
- data/spaceship/lib/spaceship/connect_api/models/beta_group.rb +41 -0
- data/spaceship/lib/spaceship/connect_api/models/beta_screenshot.rb +18 -0
- data/spaceship/lib/spaceship/connect_api/models/beta_tester.rb +57 -0
- data/spaceship/lib/spaceship/connect_api/models/beta_tester_metric.rb +44 -0
- data/spaceship/lib/spaceship/connect_api/models/build.rb +172 -0
- data/spaceship/lib/spaceship/connect_api/models/build_beta_detail.rb +61 -0
- data/spaceship/lib/spaceship/connect_api/models/build_delivery.rb +36 -0
- data/spaceship/lib/spaceship/connect_api/models/bundle_id.rb +58 -0
- data/spaceship/lib/spaceship/connect_api/models/bundle_id_capability.rb +71 -0
- data/spaceship/lib/spaceship/connect_api/models/certificate.rb +102 -0
- data/spaceship/lib/spaceship/connect_api/models/custom_app_organization.rb +43 -0
- data/spaceship/lib/spaceship/connect_api/models/custom_app_user.rb +41 -0
- data/spaceship/lib/spaceship/connect_api/models/device.rb +58 -0
- data/spaceship/lib/spaceship/connect_api/models/idfa_declaration.rb +41 -0
- data/spaceship/lib/spaceship/connect_api/models/pre_release_version.rb +20 -0
- data/spaceship/lib/spaceship/connect_api/models/profile.rb +97 -0
- data/spaceship/lib/spaceship/connect_api/models/reset_ratings_request.rb +26 -0
- data/spaceship/lib/spaceship/connect_api/models/sandbox_tester.rb +64 -0
- data/spaceship/lib/spaceship/connect_api/models/territory.rb +27 -0
- data/spaceship/lib/spaceship/connect_api/models/user.rb +51 -0
- data/spaceship/lib/spaceship/connect_api/models/user_invitation.rb +59 -0
- data/spaceship/lib/spaceship/connect_api/provisioning/client.rb +92 -0
- data/spaceship/lib/spaceship/connect_api/provisioning/provisioning.rb +143 -0
- data/spaceship/lib/spaceship/connect_api/response.rb +67 -0
- data/spaceship/lib/spaceship/connect_api/spaceship.rb +102 -0
- data/spaceship/lib/spaceship/connect_api/testflight/client.rb +24 -0
- data/spaceship/lib/spaceship/connect_api/testflight/testflight.rb +391 -0
- data/spaceship/lib/spaceship/connect_api/token.rb +102 -0
- data/spaceship/lib/spaceship/connect_api/token_refresh_middleware.rb +24 -0
- data/spaceship/lib/spaceship/connect_api/tunes/client.rb +24 -0
- data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +1045 -0
- data/spaceship/lib/spaceship/connect_api/users/client.rb +24 -0
- data/spaceship/lib/spaceship/connect_api/users/users.rb +80 -0
- data/spaceship/lib/spaceship/du/du_client.rb +138 -0
- data/spaceship/lib/spaceship/du/upload_file.rb +58 -0
- data/spaceship/lib/spaceship/du/utilities.rb +99 -0
- data/spaceship/lib/spaceship/errors.rb +82 -0
- data/spaceship/lib/spaceship/globals.rb +12 -0
- data/spaceship/lib/spaceship/helper/net_http_generic_request.rb +20 -0
- data/spaceship/lib/spaceship/helper/plist_middleware.rb +16 -0
- data/spaceship/lib/spaceship/helper/rels_middleware.rb +28 -0
- data/spaceship/lib/spaceship/launcher.rb +99 -0
- data/spaceship/lib/spaceship/module.rb +8 -0
- data/spaceship/lib/spaceship/playground.rb +75 -0
- data/spaceship/lib/spaceship/portal/app.rb +201 -0
- data/spaceship/lib/spaceship/portal/app_group.rb +73 -0
- data/spaceship/lib/spaceship/portal/app_service.rb +87 -0
- data/spaceship/lib/spaceship/portal/certificate.rb +365 -0
- data/spaceship/lib/spaceship/portal/cloud_container.rb +74 -0
- data/spaceship/lib/spaceship/portal/device.rb +191 -0
- data/spaceship/lib/spaceship/portal/invite.rb +53 -0
- data/spaceship/lib/spaceship/portal/key.rb +101 -0
- data/spaceship/lib/spaceship/portal/legacy_wrapper.rb +21 -0
- data/spaceship/lib/spaceship/portal/merchant.rb +86 -0
- data/spaceship/lib/spaceship/portal/passbook.rb +78 -0
- data/spaceship/lib/spaceship/portal/person.rb +62 -0
- data/spaceship/lib/spaceship/portal/persons.rb +67 -0
- data/spaceship/lib/spaceship/portal/portal.rb +17 -0
- data/spaceship/lib/spaceship/portal/portal_base.rb +16 -0
- data/spaceship/lib/spaceship/portal/portal_client.rb +862 -0
- data/spaceship/lib/spaceship/portal/provisioning_profile.rb +559 -0
- data/spaceship/lib/spaceship/portal/provisioning_profile_template.rb +52 -0
- data/spaceship/lib/spaceship/portal/spaceship.rb +154 -0
- data/spaceship/lib/spaceship/portal/ui/select_team.rb +116 -0
- data/spaceship/lib/spaceship/portal/website_push.rb +88 -0
- data/spaceship/lib/spaceship/provider.rb +13 -0
- data/spaceship/lib/spaceship/spaceauth_runner.rb +74 -0
- data/spaceship/lib/spaceship/stats_middleware.rb +65 -0
- data/spaceship/lib/spaceship/test_flight.rb +10 -0
- data/spaceship/lib/spaceship/test_flight/app_test_info.rb +40 -0
- data/spaceship/lib/spaceship/test_flight/base.rb +39 -0
- data/spaceship/lib/spaceship/test_flight/beta_review_info.rb +19 -0
- data/spaceship/lib/spaceship/test_flight/build.rb +242 -0
- data/spaceship/lib/spaceship/test_flight/build_trains.rb +50 -0
- data/spaceship/lib/spaceship/test_flight/client.rb +361 -0
- data/spaceship/lib/spaceship/test_flight/export_compliance.rb +12 -0
- data/spaceship/lib/spaceship/test_flight/group.rb +131 -0
- data/spaceship/lib/spaceship/test_flight/test_info.rb +56 -0
- data/spaceship/lib/spaceship/test_flight/tester.rb +136 -0
- data/spaceship/lib/spaceship/tunes/app_analytics.rb +168 -0
- data/spaceship/lib/spaceship/tunes/app_details.rb +147 -0
- data/spaceship/lib/spaceship/tunes/app_image.rb +51 -0
- data/spaceship/lib/spaceship/tunes/app_ratings.rb +58 -0
- data/spaceship/lib/spaceship/tunes/app_review.rb +55 -0
- data/spaceship/lib/spaceship/tunes/app_review_attachment.rb +49 -0
- data/spaceship/lib/spaceship/tunes/app_screenshot.rb +12 -0
- data/spaceship/lib/spaceship/tunes/app_status.rb +63 -0
- data/spaceship/lib/spaceship/tunes/app_submission.rb +161 -0
- data/spaceship/lib/spaceship/tunes/app_trailer.rb +64 -0
- data/spaceship/lib/spaceship/tunes/app_version.rb +970 -0
- data/spaceship/lib/spaceship/tunes/app_version_common.rb +35 -0
- data/spaceship/lib/spaceship/tunes/app_version_generated_promocodes.rb +28 -0
- data/spaceship/lib/spaceship/tunes/app_version_history.rb +52 -0
- data/spaceship/lib/spaceship/tunes/app_version_promocodes.rb +27 -0
- data/spaceship/lib/spaceship/tunes/app_version_ref.rb +15 -0
- data/spaceship/lib/spaceship/tunes/app_version_states_history.rb +27 -0
- data/spaceship/lib/spaceship/tunes/application.rb +453 -0
- data/spaceship/lib/spaceship/tunes/availability.rb +164 -0
- data/spaceship/lib/spaceship/tunes/b2b_organization.rb +50 -0
- data/spaceship/lib/spaceship/tunes/b2b_user.rb +30 -0
- data/spaceship/lib/spaceship/tunes/build.rb +263 -0
- data/spaceship/lib/spaceship/tunes/build_details.rb +184 -0
- data/spaceship/lib/spaceship/tunes/build_train.rb +181 -0
- data/spaceship/lib/spaceship/tunes/developer_response.rb +23 -0
- data/spaceship/lib/spaceship/tunes/device_type.rb +17 -0
- data/spaceship/lib/spaceship/tunes/display_family.rb +84 -0
- data/spaceship/lib/spaceship/tunes/errors.rb +17 -0
- data/spaceship/lib/spaceship/tunes/iap.rb +168 -0
- data/spaceship/lib/spaceship/tunes/iap_detail.rb +264 -0
- data/spaceship/lib/spaceship/tunes/iap_families.rb +68 -0
- data/spaceship/lib/spaceship/tunes/iap_family_details.rb +90 -0
- data/spaceship/lib/spaceship/tunes/iap_family_list.rb +28 -0
- data/spaceship/lib/spaceship/tunes/iap_list.rb +76 -0
- data/spaceship/lib/spaceship/tunes/iap_status.rb +56 -0
- data/spaceship/lib/spaceship/tunes/iap_subscription_pricing_info.rb +46 -0
- data/spaceship/lib/spaceship/tunes/iap_subscription_pricing_tier.rb +25 -0
- data/spaceship/lib/spaceship/tunes/iap_type.rb +45 -0
- data/spaceship/lib/spaceship/tunes/language_converter.rb +65 -0
- data/spaceship/lib/spaceship/tunes/language_item.rb +61 -0
- data/spaceship/lib/spaceship/tunes/legacy_wrapper.rb +13 -0
- data/spaceship/lib/spaceship/tunes/member.rb +84 -0
- data/spaceship/lib/spaceship/tunes/members.rb +35 -0
- data/spaceship/lib/spaceship/tunes/pricing_info.rb +42 -0
- data/spaceship/lib/spaceship/tunes/pricing_tier.rb +25 -0
- data/spaceship/lib/spaceship/tunes/sandbox_tester.rb +74 -0
- data/spaceship/lib/spaceship/tunes/spaceship.rb +39 -0
- data/spaceship/lib/spaceship/tunes/territory.rb +39 -0
- data/spaceship/lib/spaceship/tunes/transit_app_file.rb +23 -0
- data/spaceship/lib/spaceship/tunes/tunes.rb +35 -0
- data/spaceship/lib/spaceship/tunes/tunes_base.rb +17 -0
- data/spaceship/lib/spaceship/tunes/tunes_client.rb +1644 -0
- data/spaceship/lib/spaceship/tunes/user_detail.rb +15 -0
- data/spaceship/lib/spaceship/tunes/version_set.rb +26 -0
- data/spaceship/lib/spaceship/two_step_or_factor_client.rb +346 -0
- data/spaceship/lib/spaceship/ui.rb +27 -0
- data/supply/README.md +17 -0
- data/supply/lib/supply.rb +53 -0
- data/supply/lib/supply/apk_listing.rb +14 -0
- data/supply/lib/supply/client.rb +551 -0
- data/supply/lib/supply/commands_generator.rb +67 -0
- data/supply/lib/supply/languages.rb +88 -0
- data/supply/lib/supply/listing.rb +32 -0
- data/supply/lib/supply/options.rb +324 -0
- data/supply/lib/supply/reader.rb +41 -0
- data/supply/lib/supply/release_listing.rb +18 -0
- data/supply/lib/supply/setup.rb +122 -0
- data/supply/lib/supply/uploader.rb +480 -0
- metadata +1832 -0
@@ -0,0 +1,136 @@
|
|
1
|
+
require_relative 'device_types'
|
2
|
+
|
3
|
+
module Frameit
|
4
|
+
class ConfigParser
|
5
|
+
attr_reader :data
|
6
|
+
|
7
|
+
def load(path)
|
8
|
+
return nil unless File.exist?(path) # we are okay with no config at all
|
9
|
+
UI.verbose("Parsing config file '#{path}'")
|
10
|
+
@path = path
|
11
|
+
self.parse(File.read(path))
|
12
|
+
end
|
13
|
+
|
14
|
+
# @param data (String) the JSON data to be parsed
|
15
|
+
def parse(data)
|
16
|
+
begin
|
17
|
+
@data = JSON.parse(data)
|
18
|
+
rescue => ex
|
19
|
+
UI.error(ex.message)
|
20
|
+
UI.user_error!("Invalid JSON file at path '#{@path}'. Make sure it's a valid JSON file")
|
21
|
+
end
|
22
|
+
|
23
|
+
self
|
24
|
+
end
|
25
|
+
|
26
|
+
# Fetches the finished configuration for a given path. This will try to look for a specific value
|
27
|
+
# and fallback to a default value if nothing was found
|
28
|
+
def fetch_value(path)
|
29
|
+
specifics = @data['data'].select { |a| path.include?(a['filter']) }
|
30
|
+
|
31
|
+
default = @data['default']
|
32
|
+
|
33
|
+
values = default.clone
|
34
|
+
specifics.each do |specific|
|
35
|
+
values = values.fastlane_deep_merge(specific)
|
36
|
+
end
|
37
|
+
|
38
|
+
change_paths_to_absolutes!(values)
|
39
|
+
validate_values(values)
|
40
|
+
|
41
|
+
values
|
42
|
+
end
|
43
|
+
|
44
|
+
# Use absolute paths instead of relative
|
45
|
+
def change_paths_to_absolutes!(values)
|
46
|
+
values.each do |key, value|
|
47
|
+
if value.kind_of?(Hash)
|
48
|
+
change_paths_to_absolutes!(value) # recursive call
|
49
|
+
elsif value.kind_of?(Array)
|
50
|
+
value.each do |current|
|
51
|
+
change_paths_to_absolutes!(current) if current.kind_of?(Hash) # recursive call
|
52
|
+
end
|
53
|
+
else
|
54
|
+
if ['font', 'background'].include?(key)
|
55
|
+
# Change the paths to relative ones
|
56
|
+
# `replace`: to change the content of the string, so it's actually stored
|
57
|
+
if @path # where is the config file. We don't have a config file in tests
|
58
|
+
containing_folder = File.expand_path('..', @path)
|
59
|
+
value.replace(File.join(containing_folder, value))
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Make sure the paths/colors are valid
|
67
|
+
def validate_values(values)
|
68
|
+
values.each do |key, value|
|
69
|
+
if value.kind_of?(Hash)
|
70
|
+
validate_values(value) # recursive call
|
71
|
+
else
|
72
|
+
validate_key(key, value)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def validate_key(key, value)
|
78
|
+
case key
|
79
|
+
when 'font'
|
80
|
+
UI.user_error!("Could not find font at path '#{File.expand_path(value)}'") unless File.exist?(value)
|
81
|
+
when 'fonts'
|
82
|
+
check_fonts(value)
|
83
|
+
when 'background'
|
84
|
+
UI.user_error!("Could not find background image at path '#{File.expand_path(value)}'") unless File.exist?(value)
|
85
|
+
when 'color'
|
86
|
+
UI.user_error!("Invalid color '#{value}'. Must be valid Hex #123123") unless value.include?("#")
|
87
|
+
when 'padding'
|
88
|
+
unless integer_or_percentage(value) || value.split('x').length == 2
|
89
|
+
UI.user_error!("padding must be an integer, or pair of integers of format 'AxB', or a percentage of screen size")
|
90
|
+
end
|
91
|
+
when 'title_min_height'
|
92
|
+
unless integer_or_percentage(value)
|
93
|
+
UI.user_error!("padding must be an integer, or a percentage of screen size")
|
94
|
+
end
|
95
|
+
when 'show_complete_frame', 'title_below_image'
|
96
|
+
UI.user_error!("'#{key}' must be a Boolean") unless [true, false].include?(value)
|
97
|
+
when 'font_scale_factor'
|
98
|
+
UI.user_error!("font_scale_factor must be numeric") unless value.kind_of?(Numeric)
|
99
|
+
when 'frame'
|
100
|
+
UI.user_error!("Invalid frame color '#{value}'. Frame color must be one of " + Color.all_colors.join(', ')) unless ConfigParser.supported_color?(value)
|
101
|
+
when 'use_platform'
|
102
|
+
UI.user_error!("Invalid platform type '#{value}'. Available values are " + Platform.all_platforms.join(', ') + ".") unless ConfigParser.supported_platform?(value)
|
103
|
+
when 'force_device_type'
|
104
|
+
UI.user_error!("Invalid device type '#{value}'. Available values: " + Devices.all_device_names_without_apple.join(', ')) unless ConfigParser.supported_device?(value)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def check_fonts(value)
|
109
|
+
UI.user_error!("`fonts` must be an array") unless value.kind_of?(Array)
|
110
|
+
|
111
|
+
value.each do |current|
|
112
|
+
UI.user_error!("You must specify a font path") if current.fetch('font', '').length == 0
|
113
|
+
UI.user_error!("Could not find font at path '#{File.expand_path(current.fetch('font'))}'") unless File.exist?(current.fetch('font'))
|
114
|
+
UI.user_error!("`supported` must be an array") unless current.fetch('supported', []).kind_of?(Array)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def integer_or_percentage(value)
|
119
|
+
value.kind_of?(Integer) || (value.end_with?('%') && value.to_f > 0)
|
120
|
+
end
|
121
|
+
|
122
|
+
def self.supported_color?(value)
|
123
|
+
return false if value.nil?
|
124
|
+
Color.all_colors.any? { |c| c == value }
|
125
|
+
end
|
126
|
+
|
127
|
+
def self.supported_platform?(value)
|
128
|
+
return false if value.nil?
|
129
|
+
Platform.all_platforms.any? { |c| c == value }
|
130
|
+
end
|
131
|
+
|
132
|
+
def self.supported_device?(value)
|
133
|
+
return !Device.find_device_by_id_or_name(value).nil?
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require_relative 'module'
|
2
|
+
|
3
|
+
module Frameit
|
4
|
+
class DependencyChecker
|
5
|
+
def self.check_dependencies
|
6
|
+
return if Helper.test?
|
7
|
+
|
8
|
+
self.check_image_magick
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.check_image_magick
|
12
|
+
unless `which convert`.include?("convert")
|
13
|
+
UI.error('#############################################################')
|
14
|
+
UI.error("# You have to install the ImageMagick to use FrameIt")
|
15
|
+
UI.error("# Install it using 'brew update && brew install imagemagick'")
|
16
|
+
UI.error("# If you don't have homebrew: http://brew.sh")
|
17
|
+
UI.error('#############################################################')
|
18
|
+
UI.user_error!("Install ImageMagick and start frameit again!")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'fastimage'
|
2
|
+
require_relative 'module'
|
3
|
+
|
4
|
+
module Frameit
|
5
|
+
class Device
|
6
|
+
REQUIRED_PRIORITY = 999
|
7
|
+
|
8
|
+
attr_reader :id
|
9
|
+
attr_reader :deliver_screen_id
|
10
|
+
attr_reader :formatted_name
|
11
|
+
attr_reader :resolutions
|
12
|
+
attr_reader :density_ppi
|
13
|
+
attr_reader :default_color
|
14
|
+
attr_reader :platform
|
15
|
+
attr_reader :priority_config_key
|
16
|
+
|
17
|
+
def initialize(id, formatted_name, priority, resolutions, density_ppi, default_color, platform = Platform::IOS, deliver_screen_id = nil, priority_config_key = nil)
|
18
|
+
Raise("Priority mustn't be higher than #{REQUIRED_PRIORITY}") if priority > REQUIRED_PRIORITY
|
19
|
+
@id = id
|
20
|
+
@deliver_screen_id = deliver_screen_id
|
21
|
+
@formatted_name = formatted_name
|
22
|
+
@priority = priority
|
23
|
+
@resolutions = resolutions
|
24
|
+
@density_ppi = density_ppi
|
25
|
+
@default_color = default_color
|
26
|
+
@platform = platform
|
27
|
+
@priority_config_key = priority_config_key
|
28
|
+
end
|
29
|
+
|
30
|
+
def priority
|
31
|
+
if !priority_config_key.nil? && Frameit.config[priority_config_key]
|
32
|
+
REQUIRED_PRIORITY
|
33
|
+
else
|
34
|
+
@priority
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def is_chosen_platform?(platform)
|
39
|
+
@platform == platform || platform == Platform::ANY
|
40
|
+
end
|
41
|
+
|
42
|
+
def formatted_name_without_apple
|
43
|
+
formatted_name.gsub("Apple", "").strip.to_s
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.detect_device(path, platform)
|
47
|
+
size = FastImage.size(path)
|
48
|
+
|
49
|
+
UI.user_error!("Could not find or parse file at path '#{path}'") if size.nil? || size.count == 0
|
50
|
+
|
51
|
+
found_device = nil
|
52
|
+
filename_device = nil
|
53
|
+
filename = Pathname.new(path).basename.to_s
|
54
|
+
Devices.constants.each do |c|
|
55
|
+
device = Devices.const_get(c)
|
56
|
+
next unless device.resolutions.include?(size)
|
57
|
+
# assign to filename_device if the filename contains the formatted name / id and its priority is higher than the current filename_device
|
58
|
+
filename_device = device if (filename.include?(device.formatted_name_without_apple) || filename.include?(device.id)) && (filename_device.nil? || filename_device.priority < device.priority)
|
59
|
+
next unless device.is_chosen_platform?(platform) && (found_device.nil? || device.priority > found_device.priority)
|
60
|
+
found_device = device
|
61
|
+
end
|
62
|
+
|
63
|
+
# prefer filename
|
64
|
+
return filename_device if filename_device
|
65
|
+
|
66
|
+
# return found_device which was detected according to platform & priority & settings if found
|
67
|
+
return found_device if found_device
|
68
|
+
|
69
|
+
# no device detected - show error and return nil
|
70
|
+
UI.user_error!("Unsupported screen size #{size} for path '#{path}'")
|
71
|
+
return nil
|
72
|
+
end
|
73
|
+
|
74
|
+
# Previously ENV[FRAMEIT_FORCE_DEVICE_TYPE] was matched to Deliver::AppScreenshot::ScreenSize constants. However,
|
75
|
+
# options.rb defined a few Apple devices with unspecified IDs, this option was never read from Frameit.config.
|
76
|
+
# Therefore this function matches both ScreenSize constants and formatted names to maintain backward compatibility.
|
77
|
+
def self.find_device_by_id_or_name(id)
|
78
|
+
return nil if id.nil?
|
79
|
+
found_device = nil
|
80
|
+
# multiple devices can be matched to the same deliver_screen_id constant -> we return the one with the highest priority
|
81
|
+
Devices.constants.each do |c|
|
82
|
+
device = Devices.const_get(c)
|
83
|
+
if (device.id == id || device.deliver_screen_id == id || device.formatted_name_without_apple == id) && (found_device.nil? || device.priority > found_device.priority)
|
84
|
+
found_device = device
|
85
|
+
end
|
86
|
+
end
|
87
|
+
return found_device
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,144 @@
|
|
1
|
+
require_relative 'module'
|
2
|
+
require_relative './device'
|
3
|
+
require 'deliver/app_screenshot'
|
4
|
+
|
5
|
+
module Frameit
|
6
|
+
module Color
|
7
|
+
MATTE_BLACK ||= "Matte Black"
|
8
|
+
SPACE_GRAY ||= "Space Gray"
|
9
|
+
ROSE_GOLD ||= "Rose Gold"
|
10
|
+
CLEARLY_WHITE ||= "Clearly White"
|
11
|
+
JUST_BLACK ||= "Just Black"
|
12
|
+
NOT_PINK ||= "Not Pink"
|
13
|
+
SILVER_TITANIUM ||= "Silver Titanium"
|
14
|
+
ARCTIC_SILVER ||= "Arctic Silver"
|
15
|
+
CORAL_BLUE ||= "Coral Blue"
|
16
|
+
MAPLE_GOLD ||= "Maple Gold"
|
17
|
+
MIDNIGHT_BLACK ||= "Midnight Black"
|
18
|
+
MIDNIGHT_GREEN ||= "Midnight Green"
|
19
|
+
ORCHID_GRAY ||= "Orchid Gray"
|
20
|
+
BURGUNDY_RED ||= "Burgundy Red"
|
21
|
+
LILAC_PURPLE ||= "Lilac Purple"
|
22
|
+
SUNRISE_GOLD ||= "Sunrise Gold"
|
23
|
+
TITANIUM_GRAY ||= "Titanium Gray"
|
24
|
+
FLAMINGO_PINK ||= "Flamingo Pink"
|
25
|
+
PRISM_BLACK ||= "Prism Black"
|
26
|
+
PRISM_BLUE ||= "Prism Blue"
|
27
|
+
PRISM_GREEN ||= "Prism Green"
|
28
|
+
PRISM_WHITE ||= "Prism White"
|
29
|
+
CERAMIC_WHITE ||= "Ceramic White"
|
30
|
+
OH_SO_ORANGE ||= "Oh So Orange"
|
31
|
+
AURA_BLACK ||= "Aura Black"
|
32
|
+
AURA_GLOW ||= "Aura Glow"
|
33
|
+
AURA_PINK ||= "Aura Pink"
|
34
|
+
AURA_RED ||= "Aura Red"
|
35
|
+
AURA_WHITE ||= "Aura White"
|
36
|
+
AURA_BLUE ||= "Aura Blue"
|
37
|
+
CORAL ||= "Coral"
|
38
|
+
BLACK ||= "Black"
|
39
|
+
WHITE ||= "White"
|
40
|
+
GOLD ||= "Gold"
|
41
|
+
SILVER ||= "Silver"
|
42
|
+
BLUE ||= "Blue"
|
43
|
+
RED ||= "Red"
|
44
|
+
YELLOW ||= "Yellow"
|
45
|
+
GREEN ||= "Green"
|
46
|
+
PINK ||= "Pink"
|
47
|
+
PURPLE ||= "Purple"
|
48
|
+
|
49
|
+
def self.all_colors
|
50
|
+
Color.constants.map { |c| Color.const_get(c).upcase.gsub(' ', '_') }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
module Orientation
|
55
|
+
PORTRAIT ||= "PORTRAIT"
|
56
|
+
LANDSCAPE ||= "LANDSCAPE"
|
57
|
+
end
|
58
|
+
|
59
|
+
module Platform
|
60
|
+
ANDROID ||= "ANDROID"
|
61
|
+
IOS ||= "IOS"
|
62
|
+
ANY ||= "ANY"
|
63
|
+
|
64
|
+
def self.all_platforms
|
65
|
+
Platform.constants.map { |c| Platform.const_get(c) }
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.symbol_to_constant(symbol)
|
69
|
+
if symbol == :android
|
70
|
+
ANDROID
|
71
|
+
else
|
72
|
+
IOS
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
module Devices
|
78
|
+
GOOGLE_PIXEL_3 ||= Frameit::Device.new("google-pixel-3", "Google Pixel 3", 7, [[1080, 2160], [2160, 1080]], 443, Color::JUST_BLACK, Platform::ANDROID)
|
79
|
+
GOOGLE_PIXEL_3_XL ||= Frameit::Device.new("google-pixel-3-xl", "Google Pixel 3 XL", 7, [[1440, 2960], [2960, 1440]], 523, Color::JUST_BLACK, Platform::ANDROID)
|
80
|
+
# Google Pixel 4's priority should be higher than Samsung Galaxy S10+ (priority 8):
|
81
|
+
GOOGLE_PIXEL_4 ||= Frameit::Device.new("google-pixel-4", "Google Pixel 4", 9, [[1080, 2280], [2280, 1080]], 444, Color::JUST_BLACK, Platform::ANDROID)
|
82
|
+
GOOGLE_PIXEL_4_XL ||= Frameit::Device.new("google-pixel-4-xl", "Google Pixel 4 XL", 9, [[1440, 3040], [3040, 1440]], 537, Color::JUST_BLACK, Platform::ANDROID)
|
83
|
+
HTC_ONE_A9 ||= Frameit::Device.new("htc-one-a9", "HTC One A9", 6, [[1080, 1920], [1920, 1080]], 441, Color::BLACK, Platform::ANDROID)
|
84
|
+
HTC_ONE_M8 ||= Frameit::Device.new("htc-one-m8", "HTC One M8", 3, [[1080, 1920], [1920, 1080]], 441, Color::BLACK, Platform::ANDROID)
|
85
|
+
HUAWEI_P8 ||= Frameit::Device.new("huawei-p8", "Huawei P8", 5, [[1080, 1920], [1920, 1080]], 424, Color::BLACK, Platform::ANDROID)
|
86
|
+
MOTOROLA_MOTO_E ||= Frameit::Device.new("motorola-moto-e", "Motorola Moto E", 3, [[540, 960], [960, 540]], 245, Color::BLACK, Platform::ANDROID)
|
87
|
+
MOTOROLA_MOTO_G ||= Frameit::Device.new("motorola-moto-g", "Motorola Moto G", 4, [[1080, 1920], [1920, 1080]], 401, nil, Platform::ANDROID, nil)
|
88
|
+
NEXUS_4 ||= Frameit::Device.new("nexus-4", "Nexus 4", 7, [[768, 1280], [1820, 768]], 318, nil, Platform::ANDROID)
|
89
|
+
NEXUS_5X ||= Frameit::Device.new("nexus-5x", "Nexus 5X", 7, [[1080, 1920], [1920, 1080]], 423, nil, Platform::ANDROID)
|
90
|
+
NEXUS_6P ||= Frameit::Device.new("nexus-6p", "Nexus 6P", 7, [[1440, 2560], [2560, 1440]], 518, nil, Platform::ANDROID)
|
91
|
+
NEXUS_9 ||= Frameit::Device.new("nexus-9", "Nexus 9", 7, [[1536, 2048], [2048, 1536]], 281, nil, Platform::ANDROID)
|
92
|
+
SAMSUNG_GALAXY_GRAND_PRIME ||= Frameit::Device.new("samsung-galaxy-grand-prime", "Samsung Galaxy Grand Prime", 5, [[540, 960], [960, 540]], 220, Color::BLACK, Platform::ANDROID)
|
93
|
+
SAMSUNG_GALAXY_NOTE_5 ||= Frameit::Device.new("samsung-galaxy-note-5", "Samsung Galaxy Note 5", 5, [[1440, 2560], [2560, 1440]], 518, Color::BLACK, Platform::ANDROID)
|
94
|
+
SAMSUNG_GALAXY_NOTE_10 ||= Frameit::Device.new("samsung-galaxy-note-10", "Samsung Galaxy Note 10", 6, [[1080, 2280], [2280, 1080]], 401, Color::AURA_BLACK, Platform::ANDROID)
|
95
|
+
SAMSUNG_GALAXY_NOTE_10_PLUS ||= Frameit::Device.new("samsung-galaxy-note-10-plus", "Samsung Galaxy Note 10+", 7, [[1440, 3040], [3040, 1440]], 498, Color::AURA_BLACK, Platform::ANDROID)
|
96
|
+
SAMSUNG_GALAXY_S_DUOS ||= Frameit::Device.new("samsung-galaxy-s-duos", "Samsung Galaxy S Duos", 3, [[480, 800], [800, 480]], 233, nil, Platform::ANDROID)
|
97
|
+
SAMSUNG_GALAXY_S3 ||= Frameit::Device.new("samsung-galaxy-s3", "Samsung Galaxy S3", 3, [[720, 1280], [1280, 720]], 306, nil, Platform::ANDROID)
|
98
|
+
SAMSUNG_GALAXY_S5 ||= Frameit::Device.new("samsung-galaxy-s5", "Samsung Galaxy S5", 3, [[1080, 1920], [1920, 1080]], 432, Color::BLACK, Platform::ANDROID)
|
99
|
+
SAMSUNG_GALAXY_S7 ||= Frameit::Device.new("samsung-galaxy-s7", "Samsung Galaxy S7", 4, [[1440, 2560], [2560, 1440]], 577, Color::BLACK, Platform::ANDROID)
|
100
|
+
SAMSUNG_GALAXY_S8 ||= Frameit::Device.new("samsung-galaxy-s8", "Samsung Galaxy S8", 5, [[1440, 2960], [2960, 1440]], 570, Color::MIDNIGHT_BLACK, Platform::ANDROID)
|
101
|
+
SAMSUNG_GALAXY_S9 ||= Frameit::Device.new("samsung-galaxy-s9", "Samsung Galaxy S9", 6, [[1440, 2960], [2960, 1440]], 570, Color::MIDNIGHT_BLACK, Platform::ANDROID)
|
102
|
+
SAMSUNG_GALAXY_S10 ||= Frameit::Device.new("samsung-galaxy-s10", "Samsung Galaxy S10", 7, [[1440, 3040], [3040, 1440]], 550, Color::PRISM_BLACK, Platform::ANDROID)
|
103
|
+
SAMSUNG_GALAXY_S10_PLUS ||= Frameit::Device.new("samsung-galaxy-s10-plus", "Samsung Galaxy S10+", 8, [[1440, 3040], [3040, 1440]], 522, Color::PRISM_BLACK, Platform::ANDROID)
|
104
|
+
XIAOMI_MI_MIX_ALPHA ||= Frameit::Device.new("xiaomi-mi-mix-alpha", "Xiaomi Mi Mix Alpha", 1, [[2088, 2250], [2250, 2088]], 388, nil, Platform::ANDROID)
|
105
|
+
IPHONE_5S ||= Frameit::Device.new("iphone-5s", "Apple iPhone 5s", 2, [[640, 1096], [640, 1136], [1136, 600], [1136, 640]], 326, Color::SPACE_GRAY, Platform::IOS, Deliver::AppScreenshot::ScreenSize::IOS_40, :use_legacy_iphone5s)
|
106
|
+
IPHONE_5C ||= Frameit::Device.new("iphone-5c", "Apple iPhone 5c", 2, [[640, 1136], [1136, 640]], 326, Color::WHITE)
|
107
|
+
IPHONE_SE ||= Frameit::Device.new("iphone-se", "Apple iPhone SE", 3, [[640, 1096], [640, 1136], [1136, 600], [1136, 640]], 326, Color::SPACE_GRAY, Platform::IOS, Deliver::AppScreenshot::ScreenSize::IOS_40)
|
108
|
+
IPHONE_6S ||= Frameit::Device.new("iphone-6s", "Apple iPhone 6s", 4, [[750, 1334], [1334, 750]], 326, Color::SPACE_GRAY, Platform::IOS, Deliver::AppScreenshot::ScreenSize::IOS_47, :use_legacy_iphone6s)
|
109
|
+
IPHONE_6S_PLUS ||= Frameit::Device.new("iphone-6s-plus", "Apple iPhone 6s Plus", 4, [[1242, 2208], [2208, 1242]], 401, Color::SPACE_GRAY, Platform::IOS, Deliver::AppScreenshot::ScreenSize::IOS_55, :use_legacy_iphone6s)
|
110
|
+
IPHONE_7 ||= Frameit::Device.new("iphone-7", "Apple iPhone 7", 5, [[750, 1334], [1334, 750]], 326, Color::MATTE_BLACK, Platform::IOS, Deliver::AppScreenshot::ScreenSize::IOS_47, :use_legacy_iphone7)
|
111
|
+
IPHONE_7_PLUS ||= Frameit::Device.new("iphone-7-plus", "Apple iPhone 7 Plus", 5, [[1242, 2208], [2208, 1242]], 401, Color::MATTE_BLACK, Platform::IOS, Deliver::AppScreenshot::ScreenSize::IOS_55, :use_legacy_iphone7)
|
112
|
+
IPHONE_8 ||= Frameit::Device.new("iphone-8", "Apple iPhone 8", 6, [[750, 1334], [1334, 750]], 326, Color::SPACE_GRAY)
|
113
|
+
IPHONE_8_PLUS ||= Frameit::Device.new("iphone-8-plus", "Apple iPhone 8 Plus", 6, [[1080, 1920], [1920, 1080]], 401, Color::SPACE_GRAY)
|
114
|
+
IPHONE_X ||= Frameit::Device.new("iphone-X", "Apple iPhone X", 7, [[1125, 2436], [2436, 1125]], 458, Color::SPACE_GRAY, Platform::IOS, Deliver::AppScreenshot::ScreenSize::IOS_58, :use_legacy_iphonex)
|
115
|
+
IPHONE_XS ||= Frameit::Device.new("iphone-XS", "Apple iPhone XS", 8, [[1125, 2436], [2436, 1125]], 458, Color::SPACE_GRAY, Platform::IOS, Deliver::AppScreenshot::ScreenSize::IOS_58, :use_legacy_iphonexs)
|
116
|
+
IPHONE_XR ||= Frameit::Device.new("iphone-XR", "Apple iPhone XR", 8, [[828, 1792], [1792, 828]], 326, Color::SPACE_GRAY, Platform::IOS, Deliver::AppScreenshot::ScreenSize::IOS_61, :use_legacy_iphonexr)
|
117
|
+
IPHONE_XS_MAX ||= Frameit::Device.new("iphone-XS-Max", "Apple iPhone XS Max", 8, [[1242, 2688], [2688, 1242]], 458, Color::SPACE_GRAY, Platform::IOS, Deliver::AppScreenshot::ScreenSize::IOS_65, :use_legacy_iphonexsmax)
|
118
|
+
IPHONE_11 ||= Frameit::Device.new("iphone-11", "Apple iPhone 11", 9, [[828, 1792], [1792, 828]], 326, Color::BLACK, Platform::IOS)
|
119
|
+
IPHONE_11_PRO ||= Frameit::Device.new("iphone-11-pro", "Apple iPhone 11 Pro", 9, [[1125, 2436], [2436, 1125]], 458, Color::SPACE_GRAY, Platform::IOS)
|
120
|
+
IPHONE_11_PRO_MAX ||= Frameit::Device.new("iphone11-pro-max", "Apple iPhone 11 Pro Max", 9, [[1242, 2688], [2688, 1242]], 458, Color::SPACE_GRAY, Platform::IOS)
|
121
|
+
IPAD_10_2 ||= Frameit::Device.new("ipad-10-2", "Apple iPad 10.2", 1, [[1620, 2160], [2160, 1620]], 264, Color::SPACE_GRAY, Platform::IOS)
|
122
|
+
IPAD_AIR_2 ||= Frameit::Device.new("ipad-air-2", "Apple iPad Air 2", 1, [[1536, 2048], [2048, 1536]], 264, Color::SPACE_GRAY, Platform::IOS, Deliver::AppScreenshot::ScreenSize::IOS_IPAD)
|
123
|
+
IPAD_AIR_2019 ||= Frameit::Device.new("ipad-air-2019", "Apple iPad Air (2019)", 2, [[1668, 2224], [2224, 1668]], 265, Color::SPACE_GRAY, Platform::IOS)
|
124
|
+
IPAD_MINI_4 ||= Frameit::Device.new("ipad-mini-4", "Apple iPad Mini 4", 2, [[1536, 2048], [2048, 1536]], 324, Color::SPACE_GRAY)
|
125
|
+
IPAD_MINI_2019 ||= Frameit::Device.new("ipad-mini-2019", "Apple iPad Mini (2019)", 3, [[1536, 2048], [2048, 1536]], 324, Color::SPACE_GRAY)
|
126
|
+
# this is 1st or 2nd gen of iPad Pro 12.9:
|
127
|
+
IPAD_PRO ||= Frameit::Device.new("ipad-pro", "Apple iPad Pro", 3, [[2048, 2732], [2732, 2048]], 264, Color::SPACE_GRAY, Platform::IOS, Deliver::AppScreenshot::ScreenSize::IOS_IPAD_PRO)
|
128
|
+
# 3rd generation:
|
129
|
+
IPAD_PRO_12_9 ||= Frameit::Device.new("ipadPro129", "Apple iPad Pro (12.9-inch) (3rd generation)", 4, [[2048, 2732], [2732, 2048]], 264, Color::SPACE_GRAY, Platform::IOS, Deliver::AppScreenshot::ScreenSize::IOS_IPAD_PRO_12_9)
|
130
|
+
# 4th generation:
|
131
|
+
IPAD_PRO_12_9_4 ||= Frameit::Device.new("ipadPro129", "Apple iPad Pro (12.9-inch) (4th generation)", 5, [[2048, 2732], [2732, 2048]], 264, Color::SPACE_GRAY, Platform::IOS, Deliver::AppScreenshot::ScreenSize::IOS_IPAD_PRO_12_9)
|
132
|
+
# iPad Pro (10.5-inch) is not in frameit-frames repo, but must be included so that we are backward compatible with PR #15373
|
133
|
+
# priority must be lower so that users who didn't copy the frame to their frameit frames folder will not get an error
|
134
|
+
# ID and formatted name must be exactly as specified so that device.detect_device() will select this device if the filename includes them
|
135
|
+
IPAD_PRO_10_5 ||= Frameit::Device.new("ipad105", "Apple iPad Pro (10.5-inch)", 1, [[1668, 2224], [2224, 1668]], 265, Color::SPACE_GRAY, Platform::IOS, Deliver::AppScreenshot::ScreenSize::IOS_IPAD_10_5)
|
136
|
+
IPAD_PRO_11 ||= Frameit::Device.new("ipadPro11", "Apple iPad Pro (11-inch)", 1, [[1668, 2388], [2388, 1668]], 265, Color::SPACE_GRAY, Platform::IOS, Deliver::AppScreenshot::ScreenSize::IOS_IPAD_11)
|
137
|
+
|
138
|
+
MAC ||= Frameit::Device.new("mac", "Apple MacBook", 0, [[1280, 800], [1440, 900], [2560, 1600], [2880, 1800]], nil, Color::SPACE_GRAY, Platform::IOS, Deliver::AppScreenshot::ScreenSize::MAC)
|
139
|
+
|
140
|
+
def self.all_device_names_without_apple
|
141
|
+
Devices.constants.map { |c| Devices.const_get(c).formatted_name_without_apple }
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
@@ -0,0 +1,560 @@
|
|
1
|
+
require 'mini_magick'
|
2
|
+
|
3
|
+
require_relative 'template_finder'
|
4
|
+
require_relative 'trim_box'
|
5
|
+
require_relative 'module'
|
6
|
+
require_relative 'offsets'
|
7
|
+
require_relative 'config_parser'
|
8
|
+
require_relative 'strings_parser'
|
9
|
+
require_relative 'device_types'
|
10
|
+
|
11
|
+
module Frameit
|
12
|
+
# Currently the class is 2 lines too long. Reevaluate refactoring when it's length changes significantly
|
13
|
+
class Editor # rubocop:disable Metrics/ClassLength
|
14
|
+
attr_accessor :screenshot # reference to the screenshot object to fetch the path, title, etc.
|
15
|
+
attr_accessor :debug_mode
|
16
|
+
attr_accessor :frame_path
|
17
|
+
attr_accessor :frame # the frame of the device
|
18
|
+
attr_accessor :image # the current image used for editing
|
19
|
+
attr_accessor :space_to_device
|
20
|
+
|
21
|
+
def initialize(screenshot, config, debug_mode = false)
|
22
|
+
@screenshot = screenshot
|
23
|
+
@config = config
|
24
|
+
self.debug_mode = debug_mode
|
25
|
+
end
|
26
|
+
|
27
|
+
def frame!
|
28
|
+
prepare_image
|
29
|
+
|
30
|
+
@frame_path = load_frame
|
31
|
+
if @frame_path # Mac doesn't need a frame
|
32
|
+
self.frame = MiniMagick::Image.open(@frame_path)
|
33
|
+
# Rotate the frame according to the device orientation
|
34
|
+
self.frame.rotate(self.rotation_for_device_orientation)
|
35
|
+
elsif self.class == Editor
|
36
|
+
# Couldn't find device frame (probably an iPhone 4, for which there are no images available any more)
|
37
|
+
# Message is already shown elsewhere
|
38
|
+
return
|
39
|
+
end
|
40
|
+
|
41
|
+
if is_complex_framing_mode?
|
42
|
+
@image = complex_framing
|
43
|
+
else
|
44
|
+
# easy mode from 1.0 - no title or background
|
45
|
+
put_into_frame # put it in the frame
|
46
|
+
end
|
47
|
+
|
48
|
+
store_result # write to file system
|
49
|
+
end
|
50
|
+
|
51
|
+
def load_frame
|
52
|
+
color = fetch_frame_color
|
53
|
+
if color
|
54
|
+
screenshot.color = color
|
55
|
+
end
|
56
|
+
TemplateFinder.get_template(screenshot)
|
57
|
+
end
|
58
|
+
|
59
|
+
def prepare_image
|
60
|
+
@image = MiniMagick::Image.open(screenshot.path)
|
61
|
+
end
|
62
|
+
|
63
|
+
def rotation_for_device_orientation
|
64
|
+
return 90 if self.screenshot.landscape_right?
|
65
|
+
return -90 if self.screenshot.landscape_left?
|
66
|
+
return 0
|
67
|
+
end
|
68
|
+
|
69
|
+
def should_skip?
|
70
|
+
return is_complex_framing_mode? && !fetch_text(:title)
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
def store_result
|
76
|
+
output_path = screenshot.output_path
|
77
|
+
image.format("png")
|
78
|
+
image.write(output_path)
|
79
|
+
Helper.hide_loading_indicator
|
80
|
+
UI.success("Added frame: '#{File.expand_path(output_path)}'")
|
81
|
+
end
|
82
|
+
|
83
|
+
# puts the screenshot into the frame
|
84
|
+
def put_into_frame
|
85
|
+
# We have to rotate the screenshot, since the offset information is for portrait
|
86
|
+
# only. Instead of doing the calculations ourselves, it's much easier to let
|
87
|
+
# imagemagick do the hard lifting for landscape screenshots
|
88
|
+
rotation = self.rotation_for_device_orientation
|
89
|
+
frame.rotate(-rotation)
|
90
|
+
@image.rotate(-rotation)
|
91
|
+
|
92
|
+
# Debug Mode: Add filename to frame
|
93
|
+
if self.debug_mode
|
94
|
+
filename = File.basename(@frame_path, ".*")
|
95
|
+
filename.sub!('Apple', '') # remove 'Apple'
|
96
|
+
|
97
|
+
width = screenshot.size[0]
|
98
|
+
font_size = width / 20 # magic number that works well
|
99
|
+
|
100
|
+
offset_top = offset['offset'].split("+")[2].to_f
|
101
|
+
annotate_offset = "+0+#{offset_top}" # magic number that works semi well
|
102
|
+
|
103
|
+
frame.combine_options do |c|
|
104
|
+
c.gravity('North')
|
105
|
+
c.undercolor('#00000080')
|
106
|
+
c.fill('white')
|
107
|
+
c.pointsize(font_size)
|
108
|
+
c.annotate(annotate_offset.to_s, filename.to_s)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
@image = frame.composite(image, "png") do |c|
|
113
|
+
c.compose("DstOver")
|
114
|
+
c.geometry(offset['offset'])
|
115
|
+
end
|
116
|
+
|
117
|
+
# Revert the rotation from above
|
118
|
+
frame.rotate(rotation)
|
119
|
+
@image.rotate(rotation)
|
120
|
+
end
|
121
|
+
|
122
|
+
def offset
|
123
|
+
return @offset_information if @offset_information
|
124
|
+
|
125
|
+
@offset_information = @config['offset'] || Offsets.image_offset(screenshot).dup
|
126
|
+
|
127
|
+
if @offset_information && (@offset_information['offset'] || @offset_information['offset'])
|
128
|
+
return @offset_information
|
129
|
+
end
|
130
|
+
UI.user_error!("Could not find offset_information for '#{screenshot}'")
|
131
|
+
end
|
132
|
+
|
133
|
+
#########################################################################################
|
134
|
+
# Everything below is related to title, background, etc. and is not used in the easy mode
|
135
|
+
#########################################################################################
|
136
|
+
|
137
|
+
# this is used to correct the 1:1 offset information
|
138
|
+
# the offset information is stored to work for the template images
|
139
|
+
# since we resize the template images to have higher quality screenshots
|
140
|
+
# we need to modify the offset information by a certain factor
|
141
|
+
def modify_offset(multiplicator)
|
142
|
+
# Format: "+133+50"
|
143
|
+
hash = offset['offset']
|
144
|
+
x = hash.split("+")[1].to_f * multiplicator
|
145
|
+
y = hash.split("+")[2].to_f * multiplicator
|
146
|
+
new_offset = "+#{x.round}+#{y.round}"
|
147
|
+
@offset_information['offset'] = new_offset
|
148
|
+
end
|
149
|
+
|
150
|
+
# Do we add a background and title as well?
|
151
|
+
def is_complex_framing_mode?
|
152
|
+
return (@config['background'] and (@config['title'] or @config['keyword']))
|
153
|
+
end
|
154
|
+
|
155
|
+
# more complex mode: background, frame and title
|
156
|
+
def complex_framing
|
157
|
+
background = generate_background
|
158
|
+
|
159
|
+
self.space_to_device = vertical_frame_padding
|
160
|
+
|
161
|
+
if @config['title']
|
162
|
+
background = put_title_into_background(background, @config['stack_title'])
|
163
|
+
end
|
164
|
+
|
165
|
+
if self.frame # we have no frame on le mac
|
166
|
+
resize_frame!
|
167
|
+
put_into_frame
|
168
|
+
|
169
|
+
# Decrease the size of the framed screenshot to fit into the defined padding + background
|
170
|
+
frame_width = background.width - horizontal_frame_padding * 2
|
171
|
+
frame_height = background.height - effective_text_height - vertical_frame_padding
|
172
|
+
|
173
|
+
if @config['show_complete_frame']
|
174
|
+
# calculate the final size of the screenshot to resize in one go
|
175
|
+
# it may be limited either by the width or height of the frame
|
176
|
+
image_aspect_ratio = @image.width.to_f / @image.height.to_f
|
177
|
+
image_width = [frame_width, @image.width].min
|
178
|
+
image_height = [frame_height, image_width / image_aspect_ratio].min
|
179
|
+
image_width = image_height * image_aspect_ratio
|
180
|
+
@image.resize("#{image_width}x#{image_height}") if image_width < @image.width || image_height < @image.height
|
181
|
+
else
|
182
|
+
# the screenshot size is only limited by width.
|
183
|
+
# If higher than the frame, the screenshot is cut off at the bottom
|
184
|
+
@image.resize("#{frame_width}x") if frame_width < @image.width
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
@image = put_device_into_background(background)
|
189
|
+
|
190
|
+
image
|
191
|
+
end
|
192
|
+
|
193
|
+
# Horizontal adding around the frames
|
194
|
+
def horizontal_frame_padding
|
195
|
+
padding = @config['padding']
|
196
|
+
if padding.kind_of?(String) && padding.split('x').length == 2
|
197
|
+
padding = padding.split('x')[0]
|
198
|
+
padding = padding.to_i unless padding.end_with?('%')
|
199
|
+
end
|
200
|
+
return scale_padding(padding)
|
201
|
+
end
|
202
|
+
|
203
|
+
# Vertical adding around the frames
|
204
|
+
def vertical_frame_padding
|
205
|
+
padding = @config['padding']
|
206
|
+
if padding.kind_of?(String) && padding.split('x').length == 2
|
207
|
+
padding = padding.split('x')[1]
|
208
|
+
padding = padding.to_i unless padding.end_with?('%')
|
209
|
+
end
|
210
|
+
return scale_padding(padding)
|
211
|
+
end
|
212
|
+
|
213
|
+
# Minimum height for the title
|
214
|
+
def title_min_height
|
215
|
+
@title_min_height ||= begin
|
216
|
+
height = @config['title_min_height'] || 0
|
217
|
+
if height.kind_of?(String) && height.end_with?('%')
|
218
|
+
height = ([image.width, image.height].min * height.to_f * 0.01).ceil
|
219
|
+
end
|
220
|
+
height
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
def scale_padding(padding)
|
225
|
+
if padding.kind_of?(String) && padding.end_with?('%')
|
226
|
+
padding = ([image.width, image.height].min * padding.to_f * 0.01).ceil
|
227
|
+
end
|
228
|
+
multi = 1.0
|
229
|
+
multi = 1.7 if self.screenshot.triple_density?
|
230
|
+
return padding * multi
|
231
|
+
end
|
232
|
+
|
233
|
+
def effective_text_height
|
234
|
+
[space_to_device, title_min_height].max
|
235
|
+
end
|
236
|
+
|
237
|
+
def device_top(background)
|
238
|
+
@device_top ||= begin
|
239
|
+
if title_below_image
|
240
|
+
background.height - effective_text_height - image.height
|
241
|
+
else
|
242
|
+
effective_text_height
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
def title_below_image
|
248
|
+
@title_below_image ||= @config['title_below_image']
|
249
|
+
end
|
250
|
+
|
251
|
+
# Returns a correctly sized background image
|
252
|
+
def generate_background
|
253
|
+
background = MiniMagick::Image.open(@config['background'])
|
254
|
+
|
255
|
+
if background.height != screenshot.size[1]
|
256
|
+
background.resize("#{screenshot.size[0]}x#{screenshot.size[1]}^") # `^` says it should fill area
|
257
|
+
background.merge!(["-gravity", "center", "-crop", "#{screenshot.size[0]}x#{screenshot.size[1]}+0+0"]) # crop from center
|
258
|
+
end
|
259
|
+
background
|
260
|
+
end
|
261
|
+
|
262
|
+
def put_device_into_background(background)
|
263
|
+
left_space = (background.width / 2.0 - image.width / 2.0).round
|
264
|
+
|
265
|
+
@image = background.composite(image, "png") do |c|
|
266
|
+
colorspace = image.data["colorspace"]
|
267
|
+
c.colorspace(colorspace) if colorspace
|
268
|
+
|
269
|
+
c.compose("Over")
|
270
|
+
c.geometry("+#{left_space}+#{device_top(background)}")
|
271
|
+
end
|
272
|
+
|
273
|
+
return image
|
274
|
+
end
|
275
|
+
|
276
|
+
# Resize the frame as it's too low quality by default
|
277
|
+
def resize_frame!
|
278
|
+
screenshot_width = self.screenshot.portrait? ? screenshot.size[0] : screenshot.size[1]
|
279
|
+
|
280
|
+
multiplicator = (screenshot_width.to_f / offset['width'].to_f) # by how much do we have to change this?
|
281
|
+
new_frame_width = multiplicator * frame.width # the new width for the frame
|
282
|
+
frame.resize("#{new_frame_width.round}x") # resize it to the calculated width
|
283
|
+
modify_offset(multiplicator) # modify the offset to properly insert the screenshot into the frame later
|
284
|
+
end
|
285
|
+
|
286
|
+
def resize_text(text)
|
287
|
+
width = text.width
|
288
|
+
ratio = width / (image.width.to_f - horizontal_frame_padding * 2)
|
289
|
+
if ratio > 1.0
|
290
|
+
# too large - resizing now
|
291
|
+
text.resize("#{((1.0 / ratio) * text.width).round}x")
|
292
|
+
end
|
293
|
+
end
|
294
|
+
|
295
|
+
# Add the title above or below the device
|
296
|
+
def put_title_into_background_stacked(background, title, keyword)
|
297
|
+
resize_text(title)
|
298
|
+
resize_text(keyword)
|
299
|
+
|
300
|
+
vertical_padding = vertical_frame_padding # assign padding to variable
|
301
|
+
spacing_between_title_and_keyword = (actual_font_size('keyword') / 2)
|
302
|
+
title_left_space = (background.width / 2.0 - title.width / 2.0).round
|
303
|
+
keyword_left_space = (background.width / 2.0 - keyword.width / 2.0).round
|
304
|
+
|
305
|
+
self.space_to_device += title.height + keyword.height + spacing_between_title_and_keyword + vertical_padding
|
306
|
+
|
307
|
+
if title_below_image
|
308
|
+
keyword_top = background.height - effective_text_height / 2 - (keyword.height + spacing_between_title_and_keyword + title.height) / 2
|
309
|
+
else
|
310
|
+
keyword_top = device_top(background) / 2 - spacing_between_title_and_keyword / 2 - keyword.height
|
311
|
+
end
|
312
|
+
title_top = keyword_top + keyword.height + spacing_between_title_and_keyword
|
313
|
+
|
314
|
+
# keyword
|
315
|
+
background = background.composite(keyword, "png") do |c|
|
316
|
+
c.compose("Over")
|
317
|
+
c.geometry("+#{keyword_left_space}+#{keyword_top}")
|
318
|
+
end
|
319
|
+
# Place the title below the keyword
|
320
|
+
background = background.composite(title, "png") do |c|
|
321
|
+
c.compose("Over")
|
322
|
+
c.geometry("+#{title_left_space}+#{title_top}")
|
323
|
+
end
|
324
|
+
background
|
325
|
+
end
|
326
|
+
|
327
|
+
def put_title_into_background(background, stack_title)
|
328
|
+
text_images = build_text_images(image.width - 2 * horizontal_frame_padding, image.height - 2 * vertical_frame_padding, stack_title)
|
329
|
+
|
330
|
+
keyword = text_images[:keyword]
|
331
|
+
title = text_images[:title]
|
332
|
+
|
333
|
+
if stack_title && !keyword.nil? && !title.nil? && keyword.width > 0 && title.width > 0
|
334
|
+
background = put_title_into_background_stacked(background, title, keyword)
|
335
|
+
return background
|
336
|
+
end
|
337
|
+
# sum_width: the width of both labels together including the space in-between
|
338
|
+
# is used to calculate the ratio
|
339
|
+
sum_width = title.width
|
340
|
+
sum_width += keyword.width + keyword_padding if keyword
|
341
|
+
|
342
|
+
title_below_image = @config['title_below_image']
|
343
|
+
|
344
|
+
# Resize the 2 labels if they exceed the available space either horizontally or vertically:
|
345
|
+
image_scale_factor = 1.0 # default
|
346
|
+
ratio_horizontal = sum_width / (image.width.to_f - horizontal_frame_padding * 2) # The fraction of the text images compared to the left and right padding
|
347
|
+
ratio_vertical = title.height.to_f / effective_text_height # The fraction of the actual height of the images compared to the available space
|
348
|
+
if ratio_horizontal > 1.0 || ratio_vertical > 1.0
|
349
|
+
# If either is too large, resize with the maximum ratio:
|
350
|
+
image_scale_factor = (1.0 / [ratio_horizontal, ratio_vertical].max)
|
351
|
+
|
352
|
+
UI.verbose("Text for image #{self.screenshot.path} is quite long, reducing font size by #{(100 * (1.0 - image_scale_factor)).round(1)}%")
|
353
|
+
|
354
|
+
title.resize("#{(image_scale_factor * title.width).round}x")
|
355
|
+
keyword.resize("#{(image_scale_factor * keyword.width).round}x") if keyword
|
356
|
+
sum_width *= image_scale_factor
|
357
|
+
end
|
358
|
+
|
359
|
+
vertical_padding = vertical_frame_padding # assign padding to variable
|
360
|
+
left_space = (background.width / 2.0 - sum_width / 2.0).round
|
361
|
+
|
362
|
+
self.space_to_device += actual_font_size('title') + vertical_padding
|
363
|
+
|
364
|
+
if title_below_image
|
365
|
+
title_top = background.height - effective_text_height / 2 - title.height / 2
|
366
|
+
else
|
367
|
+
title_top = device_top(background) / 2 - title.height / 2
|
368
|
+
end
|
369
|
+
|
370
|
+
# First, put the keyword on top of the screenshot, if we have one
|
371
|
+
if keyword
|
372
|
+
background = background.composite(keyword, "png") do |c|
|
373
|
+
c.compose("Over")
|
374
|
+
c.geometry("+#{left_space}+#{title_top}")
|
375
|
+
end
|
376
|
+
|
377
|
+
left_space += keyword.width + (keyword_padding * image_scale_factor)
|
378
|
+
end
|
379
|
+
|
380
|
+
# Then, put the title on top of the screenshot next to the keyword
|
381
|
+
background = background.composite(title, "png") do |c|
|
382
|
+
c.compose("Over")
|
383
|
+
c.geometry("+#{left_space}+#{title_top}")
|
384
|
+
end
|
385
|
+
background
|
386
|
+
end
|
387
|
+
|
388
|
+
def actual_font_size(key)
|
389
|
+
font_size = @config[key.to_s]['font_size']
|
390
|
+
return font_size if !font_size.nil? && font_size > 0
|
391
|
+
|
392
|
+
font_scale_factor = @config['font_scale_factor'] || 0.1
|
393
|
+
UI.user_error!("Parameter 'font_scale_factor' can not be 0. Please provide a value larger than 0.0 (default = 0.1).") if font_scale_factor == 0.0
|
394
|
+
[@image.width * font_scale_factor].max.round
|
395
|
+
end
|
396
|
+
|
397
|
+
# The space between the keyword and the title
|
398
|
+
def keyword_padding
|
399
|
+
(actual_font_size('keyword') / 3.0).round
|
400
|
+
end
|
401
|
+
|
402
|
+
# This will build up to 2 individual images with the title and optional keyword, which will then be added to the real image
|
403
|
+
def build_text_images(max_width, max_height, stack_title)
|
404
|
+
words = [:keyword, :title].keep_if { |a| fetch_text(a) } # optional keyword/title
|
405
|
+
results = {}
|
406
|
+
trim_boxes = {}
|
407
|
+
top_vertical_trim_offset = Float::INFINITY # Init at a large value, as the code will search for a minimal value.
|
408
|
+
bottom_vertical_trim_offset = 0
|
409
|
+
words.each do |key|
|
410
|
+
# Create empty background
|
411
|
+
empty_path = File.join(Frameit::ROOT, "lib/assets/empty.png")
|
412
|
+
text_image = MiniMagick::Image.open(empty_path)
|
413
|
+
image_height = max_height # gets trimmed afterwards anyway, and on the iPad the `y` would get cut
|
414
|
+
text_image.combine_options do |i|
|
415
|
+
# Oversize as the text might be larger than the actual image. We're trimming afterwards anyway
|
416
|
+
i.resize("#{max_width * 5.0}x#{image_height}!") # `!` says it should ignore the ratio
|
417
|
+
end
|
418
|
+
|
419
|
+
current_font = font(key)
|
420
|
+
text = fetch_text(key)
|
421
|
+
UI.verbose("Using #{current_font} as font the #{key} of #{screenshot.path}") if current_font
|
422
|
+
UI.verbose("Adding text '#{text}'")
|
423
|
+
|
424
|
+
text.gsub!('\n', "\n")
|
425
|
+
text.gsub!(/(?<!\\)(')/) { |s| "\\#{s}" } # escape unescaped apostrophes with a backslash
|
426
|
+
|
427
|
+
interline_spacing = @config['interline_spacing']
|
428
|
+
|
429
|
+
# Add the actual title
|
430
|
+
text_image.combine_options do |i|
|
431
|
+
i.font(current_font) if current_font
|
432
|
+
i.weight(@config[key.to_s]['font_weight']) if @config[key.to_s]['font_weight']
|
433
|
+
i.gravity("Center")
|
434
|
+
i.pointsize(actual_font_size(key))
|
435
|
+
i.draw("text 0,0 '#{text}'")
|
436
|
+
i.interline_spacing(interline_spacing) if interline_spacing
|
437
|
+
i.fill(@config[key.to_s]['color'])
|
438
|
+
end
|
439
|
+
|
440
|
+
results[key] = text_image
|
441
|
+
|
442
|
+
# Natively trimming the image with .trim will result in the loss of the common baseline between the text in all images when side-by-side (e.g. stack_title is false).
|
443
|
+
# Hence retrieve the calculated trim bounding box without actually trimming:
|
444
|
+
calculated_trim_box = text_image.identify do |b|
|
445
|
+
b.format("%@") # CALCULATED: trim bounding box (without actually trimming), see: http://www.imagemagick.org/script/escape.php
|
446
|
+
end
|
447
|
+
|
448
|
+
# Create a Trimbox object from the MiniMagick .identify string with syntax "<width>x<height>+<offset_x>+<offset_y>":
|
449
|
+
trim_box = Frameit::Trimbox.new(calculated_trim_box)
|
450
|
+
|
451
|
+
# Get the minimum top offset of the trim box:
|
452
|
+
if trim_box.offset_y < top_vertical_trim_offset
|
453
|
+
top_vertical_trim_offset = trim_box.offset_y
|
454
|
+
end
|
455
|
+
|
456
|
+
# Get the maximum bottom offset of the trim box, this is the top offset + height:
|
457
|
+
if (trim_box.offset_y + trim_box.height) > bottom_vertical_trim_offset
|
458
|
+
bottom_vertical_trim_offset = trim_box.offset_y + trim_box.height
|
459
|
+
end
|
460
|
+
|
461
|
+
# Store for the crop action:
|
462
|
+
trim_boxes[key] = trim_box
|
463
|
+
end
|
464
|
+
|
465
|
+
# Crop text images:
|
466
|
+
words.each do |key|
|
467
|
+
# Get matching trim box:
|
468
|
+
trim_box = trim_boxes[key]
|
469
|
+
|
470
|
+
# For side-by-side text images (e.g. stack_title is false) adjust the trim box based on top_vertical_trim_offset and bottom_vertical_trim_offset to maintain the text baseline:
|
471
|
+
unless stack_title
|
472
|
+
# Determine the trim area by maintaining the same vertical top offset based on the smallest value from all trim boxes (top_vertical_trim_offset).
|
473
|
+
# When the vertical top offset is larger than the smallest vertical top offset, the trim box needs to be adjusted:
|
474
|
+
if trim_box.offset_y > top_vertical_trim_offset
|
475
|
+
# Increase the height of the trim box with the difference in vertical top offset:
|
476
|
+
trim_box.height += trim_box.offset_y - top_vertical_trim_offset
|
477
|
+
# Change the vertical top offset to match that of the others:
|
478
|
+
trim_box.offset_y = top_vertical_trim_offset
|
479
|
+
|
480
|
+
UI.verbose("Trim box for key \"#{key}\" is adjusted to align top: #{trim_box}\n")
|
481
|
+
end
|
482
|
+
|
483
|
+
# Check if the height needs to be adjusted to reach the bottom offset:
|
484
|
+
if (trim_box.offset_y + trim_box.height) < bottom_vertical_trim_offset
|
485
|
+
# Set the height of the trim box to the difference between vertical bottom and top offset:
|
486
|
+
trim_box.height = bottom_vertical_trim_offset - trim_box.offset_y
|
487
|
+
|
488
|
+
UI.verbose("Trim box for key \"#{key}\" is adjusted to align bottom: #{trim_box}\n")
|
489
|
+
end
|
490
|
+
end
|
491
|
+
|
492
|
+
# Crop image with (adjusted) trim box parameters in MiniMagick string format:
|
493
|
+
results[key].crop(trim_box.string_format)
|
494
|
+
end
|
495
|
+
|
496
|
+
results
|
497
|
+
end
|
498
|
+
|
499
|
+
# Fetches the title + keyword for this particular screenshot
|
500
|
+
def fetch_text(type)
|
501
|
+
UI.user_error!("Valid parameters :keyword, :title") unless [:keyword, :title].include?(type)
|
502
|
+
|
503
|
+
# Try to get it from a keyword.strings or title.strings file
|
504
|
+
strings_path = File.join(File.expand_path("../", screenshot.path), "#{type}.strings")
|
505
|
+
strings_path = File.join(File.expand_path("../../", screenshot.path), "#{type}.strings") unless File.exist?(strings_path)
|
506
|
+
strings_path = File.join(File.expand_path("../../../", screenshot.path), "#{type}.strings") unless File.exist?(strings_path)
|
507
|
+
if File.exist?(strings_path)
|
508
|
+
parsed = StringsParser.parse(strings_path)
|
509
|
+
text_array = parsed.find { |k, v| screenshot.path.upcase.include?(k.upcase) }
|
510
|
+
return text_array.last if text_array && text_array.last.length > 0 # Ignore empty string
|
511
|
+
end
|
512
|
+
|
513
|
+
UI.verbose("Falling back to text in Framefile.json as there was nothing specified in the #{type}.strings file")
|
514
|
+
|
515
|
+
# No string files, fallback to Framefile config
|
516
|
+
text = @config[type.to_s]['text'] if @config[type.to_s] && @config[type.to_s]['text'] && @config[type.to_s]['text'].length > 0 # Ignore empty string
|
517
|
+
return text
|
518
|
+
end
|
519
|
+
|
520
|
+
def fetch_frame_color
|
521
|
+
color = @config['frame']
|
522
|
+
unless color.nil?
|
523
|
+
Frameit::Color.constants.each do |c|
|
524
|
+
constant = Frameit::Color.const_get(c)
|
525
|
+
if color == constant.upcase.gsub(' ', '_')
|
526
|
+
return constant
|
527
|
+
end
|
528
|
+
end
|
529
|
+
end
|
530
|
+
|
531
|
+
return nil
|
532
|
+
end
|
533
|
+
|
534
|
+
# The font we want to use
|
535
|
+
def font(key)
|
536
|
+
single_font = @config[key.to_s]['font']
|
537
|
+
return single_font if single_font
|
538
|
+
|
539
|
+
fonts = @config[key.to_s]['fonts']
|
540
|
+
if fonts
|
541
|
+
fonts.each do |font|
|
542
|
+
if font['supported']
|
543
|
+
font['supported'].each do |language|
|
544
|
+
if screenshot.language == language
|
545
|
+
return font["font"]
|
546
|
+
end
|
547
|
+
end
|
548
|
+
else
|
549
|
+
# No `supported` array, this will always be true
|
550
|
+
UI.verbose("Found a font with no list of supported languages, using this now")
|
551
|
+
return font["font"]
|
552
|
+
end
|
553
|
+
end
|
554
|
+
end
|
555
|
+
|
556
|
+
UI.verbose("No custom font specified for #{screenshot}, using the default one")
|
557
|
+
return nil
|
558
|
+
end
|
559
|
+
end
|
560
|
+
end
|