fastlane 2.155.1 → 2.157.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 +4 -4
- data/README.md +72 -72
- data/deliver/lib/deliver.rb +1 -0
- data/deliver/lib/deliver/app_screenshot_iterator.rb +95 -0
- data/deliver/lib/deliver/detect_values.rb +4 -1
- data/deliver/lib/deliver/languages.rb +7 -0
- data/deliver/lib/deliver/loader.rb +4 -5
- data/deliver/lib/deliver/queue_worker.rb +64 -0
- data/deliver/lib/deliver/runner.rb +7 -5
- data/deliver/lib/deliver/upload_screenshots.rb +143 -128
- data/fastlane/lib/fastlane/actions/app_store_connect_api_key.rb +120 -0
- data/fastlane/lib/fastlane/actions/commit_version_bump.rb +1 -1
- data/fastlane/lib/fastlane/actions/docs/upload_to_play_store.md +2 -0
- data/fastlane/lib/fastlane/actions/docs/upload_to_testflight.md +17 -1
- data/fastlane/lib/fastlane/actions/set_changelog.rb +2 -2
- data/fastlane/lib/fastlane/actions/sonar.rb +5 -0
- data/fastlane/lib/fastlane/actions/spaceship_stats.rb +73 -0
- data/fastlane/lib/fastlane/actions/upload_to_testflight.rb +4 -0
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane/swift/Deliverfile.swift +1 -1
- data/fastlane/swift/DeliverfileProtocol.swift +1 -1
- data/fastlane/swift/Fastlane.swift +68 -8
- data/fastlane/swift/Gymfile.swift +1 -1
- data/fastlane/swift/GymfileProtocol.swift +1 -1
- data/fastlane/swift/Matchfile.swift +1 -1
- data/fastlane/swift/MatchfileProtocol.swift +1 -1
- data/fastlane/swift/Precheckfile.swift +1 -1
- data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
- data/fastlane/swift/Scanfile.swift +1 -1
- data/fastlane/swift/ScanfileProtocol.swift +1 -1
- data/fastlane/swift/Screengrabfile.swift +1 -1
- data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
- data/fastlane/swift/Snapshotfile.swift +1 -1
- data/fastlane/swift/SnapshotfileProtocol.swift +1 -1
- data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +71 -42
- data/fastlane_core/lib/fastlane_core/project.rb +1 -0
- data/gym/lib/gym/error_handler.rb +1 -1
- data/gym/lib/gym/generators/build_command_generator.rb +0 -1
- data/pilot/lib/pilot/build_manager.rb +18 -4
- data/pilot/lib/pilot/manager.rb +15 -5
- data/pilot/lib/pilot/options.rb +16 -0
- data/produce/lib/produce/itunes_connect.rb +2 -2
- data/scan/lib/scan/test_command_generator.rb +3 -1
- data/screengrab/lib/screengrab/runner.rb +8 -7
- data/sigh/lib/sigh/runner.rb +9 -5
- data/snapshot/lib/snapshot/test_command_generator_base.rb +3 -1
- data/spaceship/lib/spaceship.rb +4 -0
- data/spaceship/lib/spaceship/client.rb +2 -0
- data/spaceship/lib/spaceship/connect_api.rb +0 -15
- data/spaceship/lib/spaceship/connect_api/api_client.rb +270 -0
- data/spaceship/lib/spaceship/connect_api/client.rb +139 -213
- data/spaceship/lib/spaceship/connect_api/models/profile.rb +3 -2
- data/spaceship/lib/spaceship/connect_api/provisioning/client.rb +8 -17
- data/spaceship/lib/spaceship/connect_api/provisioning/provisioning.rb +75 -64
- data/spaceship/lib/spaceship/connect_api/spaceship.rb +94 -0
- data/spaceship/lib/spaceship/connect_api/testflight/client.rb +8 -17
- data/spaceship/lib/spaceship/connect_api/testflight/testflight.rb +288 -277
- data/spaceship/lib/spaceship/connect_api/token.rb +46 -5
- data/spaceship/lib/spaceship/connect_api/token_refresh_middleware.rb +24 -0
- data/spaceship/lib/spaceship/connect_api/tunes/client.rb +8 -17
- data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +717 -706
- data/spaceship/lib/spaceship/connect_api/users/client.rb +8 -17
- data/spaceship/lib/spaceship/connect_api/users/users.rb +28 -17
- data/spaceship/lib/spaceship/stats_middleware.rb +65 -0
- metadata +25 -18
- data/sigh/lib/sigh/.runner.rb.swp +0 -0
- data/spaceship/lib/spaceship/connect_api/models/.device.rb.swp +0 -0
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 54d4961677c76fce8c6ecb5e8c89f9b28ea818abd3dc886217d8eaf4e198902b
         | 
| 4 | 
            +
              data.tar.gz: a36d89c144e59c29e7dc94eeb8f51a72b3a50a9ed2813ca700d8ee7008d778de
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: ef36ec87ab67fa77d75cb6836e994463de4f550e6ff0bc832690c734c09a8a21cd9644c90657d29894baf2b4b7e4d87269f7c8d350ce0300ee2b162f3a861870
         | 
| 7 | 
            +
              data.tar.gz: d8a4392c60f47e7b7d73a374020c854694f27a91a59a23d33a6f0de2464efdd2b653bfb6a999faa3b1657a7aa4d29a097ef7d8cff34eeec5481bafb2e5612339
         | 
    
        data/README.md
    CHANGED
    
    | @@ -34,11 +34,11 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/ | |
| 34 34 | 
             
            <!-- This table is regenerated and resorted on each release -->
         | 
| 35 35 | 
             
            <table id='team'>
         | 
| 36 36 | 
             
            <tr>
         | 
| 37 | 
            -
            <td id=' | 
| 38 | 
            -
            <a href='https://github.com/ | 
| 39 | 
            -
            <img src='https://github.com/ | 
| 37 | 
            +
            <td id='olivier-halligon'>
         | 
| 38 | 
            +
            <a href='https://github.com/AliSoftware'>
         | 
| 39 | 
            +
            <img src='https://github.com/AliSoftware.png?size=140'>
         | 
| 40 40 | 
             
            </a>
         | 
| 41 | 
            -
            <h4 align='center'><a href='https://twitter.com/ | 
| 41 | 
            +
            <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
         | 
| 42 42 | 
             
            </td>
         | 
| 43 43 | 
             
            <td id='stefan-natchev'>
         | 
| 44 44 | 
             
            <a href='https://github.com/snatchev'>
         | 
| @@ -46,17 +46,17 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/ | |
| 46 46 | 
             
            </a>
         | 
| 47 47 | 
             
            <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
         | 
| 48 48 | 
             
            </td>
         | 
| 49 | 
            -
            <td id=' | 
| 50 | 
            -
            <a href='https://github.com/ | 
| 51 | 
            -
            <img src='https://github.com/ | 
| 49 | 
            +
            <td id='jan-piotrowski'>
         | 
| 50 | 
            +
            <a href='https://github.com/janpio'>
         | 
| 51 | 
            +
            <img src='https://github.com/janpio.png?size=140'>
         | 
| 52 52 | 
             
            </a>
         | 
| 53 | 
            -
            <h4 align='center'><a href='https://twitter.com/ | 
| 53 | 
            +
            <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
         | 
| 54 54 | 
             
            </td>
         | 
| 55 | 
            -
            <td id=' | 
| 56 | 
            -
            <a href='https://github.com/ | 
| 57 | 
            -
            <img src='https://github.com/ | 
| 55 | 
            +
            <td id='max-ott'>
         | 
| 56 | 
            +
            <a href='https://github.com/max-ott'>
         | 
| 57 | 
            +
            <img src='https://github.com/max-ott.png?size=140'>
         | 
| 58 58 | 
             
            </a>
         | 
| 59 | 
            -
            <h4 align='center'><a href='https://twitter.com/ | 
| 59 | 
            +
            <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
         | 
| 60 60 | 
             
            </td>
         | 
| 61 61 | 
             
            <td id='jorge-revuelta-h'>
         | 
| 62 62 | 
             
            <a href='https://github.com/minuscorp'>
         | 
| @@ -66,29 +66,23 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/ | |
| 66 66 | 
             
            </td>
         | 
| 67 67 | 
             
            </tr>
         | 
| 68 68 | 
             
            <tr>
         | 
| 69 | 
            -
            <td id=' | 
| 70 | 
            -
            <a href='https://github.com/ | 
| 71 | 
            -
            <img src='https://github.com/ | 
| 72 | 
            -
            </a>
         | 
| 73 | 
            -
            <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
         | 
| 74 | 
            -
            </td>
         | 
| 75 | 
            -
            <td id='danielle-tomlinson'>
         | 
| 76 | 
            -
            <a href='https://github.com/endocrimes'>
         | 
| 77 | 
            -
            <img src='https://github.com/endocrimes.png?size=140'>
         | 
| 69 | 
            +
            <td id='joshua-liebowitz'>
         | 
| 70 | 
            +
            <a href='https://github.com/taquitos'>
         | 
| 71 | 
            +
            <img src='https://github.com/taquitos.png?size=140'>
         | 
| 78 72 | 
             
            </a>
         | 
| 79 | 
            -
            <h4 align='center'><a href='https://twitter.com/ | 
| 73 | 
            +
            <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
         | 
| 80 74 | 
             
            </td>
         | 
| 81 | 
            -
            <td id=' | 
| 82 | 
            -
            <a href='https://github.com/ | 
| 83 | 
            -
            <img src='https://github.com/ | 
| 75 | 
            +
            <td id='manu-wallner'>
         | 
| 76 | 
            +
            <a href='https://github.com/milch'>
         | 
| 77 | 
            +
            <img src='https://github.com/milch.png?size=140'>
         | 
| 84 78 | 
             
            </a>
         | 
| 85 | 
            -
            <h4 align='center'><a href='https://twitter.com/ | 
| 79 | 
            +
            <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
         | 
| 86 80 | 
             
            </td>
         | 
| 87 | 
            -
            <td id=' | 
| 88 | 
            -
            <a href='https://github.com/ | 
| 89 | 
            -
            <img src='https://github.com/ | 
| 81 | 
            +
            <td id='daniel-jankowski'>
         | 
| 82 | 
            +
            <a href='https://github.com/mollyIV'>
         | 
| 83 | 
            +
            <img src='https://github.com/mollyIV.png?size=140'>
         | 
| 90 84 | 
             
            </a>
         | 
| 91 | 
            -
            <h4 align='center'><a href='https://twitter.com/ | 
| 85 | 
            +
            <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
         | 
| 92 86 | 
             
            </td>
         | 
| 93 87 | 
             
            <td id='jimmy-dee'>
         | 
| 94 88 | 
             
            <a href='https://github.com/jdee'>
         | 
| @@ -96,25 +90,25 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/ | |
| 96 90 | 
             
            </a>
         | 
| 97 91 | 
             
            <h4 align='center'>Jimmy Dee</h4>
         | 
| 98 92 | 
             
            </td>
         | 
| 99 | 
            -
             | 
| 100 | 
            -
            < | 
| 101 | 
            -
            < | 
| 102 | 
            -
            <a href='https://github.com/KrauseFx'>
         | 
| 103 | 
            -
            <img src='https://github.com/KrauseFx.png?size=140'>
         | 
| 93 | 
            +
            <td id='maksym-grebenets'>
         | 
| 94 | 
            +
            <a href='https://github.com/mgrebenets'>
         | 
| 95 | 
            +
            <img src='https://github.com/mgrebenets.png?size=140'>
         | 
| 104 96 | 
             
            </a>
         | 
| 105 | 
            -
            <h4 align='center'><a href='https://twitter.com/ | 
| 97 | 
            +
            <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
         | 
| 106 98 | 
             
            </td>
         | 
| 107 | 
            -
             | 
| 108 | 
            -
            < | 
| 109 | 
            -
            < | 
| 99 | 
            +
            </tr>
         | 
| 100 | 
            +
            <tr>
         | 
| 101 | 
            +
            <td id='kohki-miki'>
         | 
| 102 | 
            +
            <a href='https://github.com/giginet'>
         | 
| 103 | 
            +
            <img src='https://github.com/giginet.png?size=140'>
         | 
| 110 104 | 
             
            </a>
         | 
| 111 | 
            -
            <h4 align='center'><a href='https://twitter.com/ | 
| 105 | 
            +
            <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
         | 
| 112 106 | 
             
            </td>
         | 
| 113 | 
            -
            <td id=' | 
| 114 | 
            -
            <a href='https://github.com/ | 
| 115 | 
            -
            <img src='https://github.com/ | 
| 107 | 
            +
            <td id='andrew-mcburney'>
         | 
| 108 | 
            +
            <a href='https://github.com/armcburney'>
         | 
| 109 | 
            +
            <img src='https://github.com/armcburney.png?size=140'>
         | 
| 116 110 | 
             
            </a>
         | 
| 117 | 
            -
            <h4 align='center'><a href='https://twitter.com/ | 
| 111 | 
            +
            <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
         | 
| 118 112 | 
             
            </td>
         | 
| 119 113 | 
             
            <td id='luka-mirosevic'>
         | 
| 120 114 | 
             
            <a href='https://github.com/lmirosevic'>
         | 
| @@ -122,20 +116,6 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/ | |
| 122 116 | 
             
            </a>
         | 
| 123 117 | 
             
            <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
         | 
| 124 118 | 
             
            </td>
         | 
| 125 | 
            -
            <td id='max-ott'>
         | 
| 126 | 
            -
            <a href='https://github.com/max-ott'>
         | 
| 127 | 
            -
            <img src='https://github.com/max-ott.png?size=140'>
         | 
| 128 | 
            -
            </a>
         | 
| 129 | 
            -
            <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
         | 
| 130 | 
            -
            </td>
         | 
| 131 | 
            -
            </tr>
         | 
| 132 | 
            -
            <tr>
         | 
| 133 | 
            -
            <td id='joshua-liebowitz'>
         | 
| 134 | 
            -
            <a href='https://github.com/taquitos'>
         | 
| 135 | 
            -
            <img src='https://github.com/taquitos.png?size=140'>
         | 
| 136 | 
            -
            </a>
         | 
| 137 | 
            -
            <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
         | 
| 138 | 
            -
            </td>
         | 
| 139 119 | 
             
            <td id='josh-holtz'>
         | 
| 140 120 | 
             
            <a href='https://github.com/joshdholtz'>
         | 
| 141 121 | 
             
            <img src='https://github.com/joshdholtz.png?size=140'>
         | 
| @@ -148,31 +128,51 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/ | |
| 148 128 | 
             
            </a>
         | 
| 149 129 | 
             
            <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
         | 
| 150 130 | 
             
            </td>
         | 
| 151 | 
            -
             | 
| 152 | 
            -
            < | 
| 153 | 
            -
            < | 
| 131 | 
            +
            </tr>
         | 
| 132 | 
            +
            <tr>
         | 
| 133 | 
            +
            <td id='danielle-tomlinson'>
         | 
| 134 | 
            +
            <a href='https://github.com/endocrimes'>
         | 
| 135 | 
            +
            <img src='https://github.com/endocrimes.png?size=140'>
         | 
| 154 136 | 
             
            </a>
         | 
| 155 | 
            -
            <h4 align='center'><a href='https://twitter.com/ | 
| 137 | 
            +
            <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
         | 
| 156 138 | 
             
            </td>
         | 
| 157 | 
            -
            <td id=' | 
| 158 | 
            -
            <a href='https://github.com/ | 
| 159 | 
            -
            <img src='https://github.com/ | 
| 139 | 
            +
            <td id='matthew-ellis'>
         | 
| 140 | 
            +
            <a href='https://github.com/matthewellis'>
         | 
| 141 | 
            +
            <img src='https://github.com/matthewellis.png?size=140'>
         | 
| 160 142 | 
             
            </a>
         | 
| 161 | 
            -
            <h4 align='center'><a href='https://twitter.com/ | 
| 143 | 
            +
            <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
         | 
| 162 144 | 
             
            </td>
         | 
| 163 | 
            -
            </tr>
         | 
| 164 | 
            -
            <tr>
         | 
| 165 145 | 
             
            <td id='aaron-brager'>
         | 
| 166 146 | 
             
            <a href='https://github.com/getaaron'>
         | 
| 167 147 | 
             
            <img src='https://github.com/getaaron.png?size=140'>
         | 
| 168 148 | 
             
            </a>
         | 
| 169 149 | 
             
            <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
         | 
| 170 150 | 
             
            </td>
         | 
| 171 | 
            -
            <td id=' | 
| 172 | 
            -
            <a href='https://github.com/ | 
| 173 | 
            -
            <img src='https://github.com/ | 
| 151 | 
            +
            <td id='helmut-januschka'>
         | 
| 152 | 
            +
            <a href='https://github.com/hjanuschka'>
         | 
| 153 | 
            +
            <img src='https://github.com/hjanuschka.png?size=140'>
         | 
| 174 154 | 
             
            </a>
         | 
| 175 | 
            -
            <h4 align='center'><a href='https://twitter.com/ | 
| 155 | 
            +
            <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
         | 
| 156 | 
            +
            </td>
         | 
| 157 | 
            +
            <td id='felix-krause'>
         | 
| 158 | 
            +
            <a href='https://github.com/KrauseFx'>
         | 
| 159 | 
            +
            <img src='https://github.com/KrauseFx.png?size=140'>
         | 
| 160 | 
            +
            </a>
         | 
| 161 | 
            +
            <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
         | 
| 162 | 
            +
            </td>
         | 
| 163 | 
            +
            </tr>
         | 
| 164 | 
            +
            <tr>
         | 
| 165 | 
            +
            <td id='iulian-onofrei'>
         | 
| 166 | 
            +
            <a href='https://github.com/revolter'>
         | 
| 167 | 
            +
            <img src='https://github.com/revolter.png?size=140'>
         | 
| 168 | 
            +
            </a>
         | 
| 169 | 
            +
            <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
         | 
| 170 | 
            +
            </td>
         | 
| 171 | 
            +
            <td id='jérôme-lacoste'>
         | 
| 172 | 
            +
            <a href='https://github.com/lacostej'>
         | 
| 173 | 
            +
            <img src='https://github.com/lacostej.png?size=140'>
         | 
| 174 | 
            +
            </a>
         | 
| 175 | 
            +
            <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
         | 
| 176 176 | 
             
            </td>
         | 
| 177 177 | 
             
            </table>
         | 
| 178 178 |  | 
    
        data/deliver/lib/deliver.rb
    CHANGED
    
    
| @@ -0,0 +1,95 @@ | |
| 1 | 
            +
            module Deliver
         | 
| 2 | 
            +
              # This is a convinient class that enumerates app store connect's screenshots in various degrees.
         | 
| 3 | 
            +
              class AppScreenshotIterator
         | 
| 4 | 
            +
                NUMBER_OF_THREADS = Helper.test? ? 1 : [ENV.fetch("DELIVER_NUMBER_OF_THREADS", 10).to_i, 10].min
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                # @param localizations [Array<Spaceship::ConnectAPI::AppStoreVersionLocalization>]
         | 
| 7 | 
            +
                def initialize(localizations)
         | 
| 8 | 
            +
                  @localizations = localizations
         | 
| 9 | 
            +
                end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                # Iterate app_screenshot_set over localizations
         | 
| 12 | 
            +
                #
         | 
| 13 | 
            +
                # @yield [localization, app_screenshot_set]
         | 
| 14 | 
            +
                # @yieldparam [optional, Spaceship::ConnectAPI::AppStoreVersionLocalization] localization
         | 
| 15 | 
            +
                # @yieldparam [optional, Spaceship::ConnectAPI::AppStoreScreenshotSet] app_screenshot_set
         | 
| 16 | 
            +
                def each_app_screenshot_set(localizations = @localizations, &block)
         | 
| 17 | 
            +
                  return enum_for(__method__, localizations) unless block_given?
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  # Collect app_screenshot_sets from localizations in parallel but
         | 
| 20 | 
            +
                  # limit the number of threads working at a time with using `lazy` and `force` controls
         | 
| 21 | 
            +
                  # to not attack App Store Connect
         | 
| 22 | 
            +
                  results = localizations.each_slice(NUMBER_OF_THREADS).lazy.map do |localizations_grouped|
         | 
| 23 | 
            +
                    localizations_grouped.map do |localization|
         | 
| 24 | 
            +
                      Thread.new do
         | 
| 25 | 
            +
                        [localization, localization.get_app_screenshot_sets]
         | 
| 26 | 
            +
                      end
         | 
| 27 | 
            +
                    end
         | 
| 28 | 
            +
                  end.flat_map do |threads|
         | 
| 29 | 
            +
                    threads.map { |t| t.join.value }
         | 
| 30 | 
            +
                  end.force
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  results.each do |localization, app_screenshot_sets|
         | 
| 33 | 
            +
                    app_screenshot_sets.each do |app_screenshot_set|
         | 
| 34 | 
            +
                      yield(localization, app_screenshot_set)
         | 
| 35 | 
            +
                    end
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                # Iterate app_screenshot over localizations and app_screenshot_sets
         | 
| 40 | 
            +
                #
         | 
| 41 | 
            +
                # @yield [localization, app_screenshot_set, app_screenshot]
         | 
| 42 | 
            +
                # @yieldparam [optional, Spaceship::ConnectAPI::AppStoreVersionLocalization] localization
         | 
| 43 | 
            +
                # @yieldparam [optional, Spaceship::ConnectAPI::AppStoreScreenshotSet] app_screenshot_set
         | 
| 44 | 
            +
                # @yieldparam [optional, Spaceship::ConnectAPI::AppStoreScreenshot] app_screenshot
         | 
| 45 | 
            +
                def each_app_screenshot(&block)
         | 
| 46 | 
            +
                  return enum_for(__method__) unless block_given?
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                  each_app_screenshot_set do |localization, app_screenshot_set|
         | 
| 49 | 
            +
                    app_screenshot_set.app_screenshots.each do |app_screenshot|
         | 
| 50 | 
            +
                      yield(localization, app_screenshot_set, app_screenshot)
         | 
| 51 | 
            +
                    end
         | 
| 52 | 
            +
                  end
         | 
| 53 | 
            +
                end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                # Iterate given local app_screenshot over localizations and app_screenshot_sets with index within each app_screenshot_set
         | 
| 56 | 
            +
                #
         | 
| 57 | 
            +
                # @param screenshots_per_language [Hash<String, Array<Deliver::AppScreenshot>]
         | 
| 58 | 
            +
                # @yield [localization, app_screenshot_set, app_screenshot, index]
         | 
| 59 | 
            +
                # @yieldparam [optional, Spaceship::ConnectAPI::AppStoreVersionLocalization] localization
         | 
| 60 | 
            +
                # @yieldparam [optional, Spaceship::ConnectAPI::AppStoreScreenshotSet] app_screenshot_set
         | 
| 61 | 
            +
                # @yieldparam [optional, Deliver::AppScreenshot] screenshot
         | 
| 62 | 
            +
                # @yieldparam [optional, Integer] index a number reperesents which position the screenshot will be
         | 
| 63 | 
            +
                def each_local_screenshot(screenshots_per_language, &block)
         | 
| 64 | 
            +
                  return enum_for(__method__, screenshots_per_language) unless block_given?
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                  # filter unnecessary localizations
         | 
| 67 | 
            +
                  supported_localizations = @localizations.reject { |l| screenshots_per_language[l.locale].nil? }
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                  # build a hash that can access app_screenshot_set corresponding to given locale and display_type
         | 
| 70 | 
            +
                  # via parallelized each_app_screenshot_set to gain performance
         | 
| 71 | 
            +
                  app_screenshot_set_per_locale_and_display_type = each_app_screenshot_set(supported_localizations)
         | 
| 72 | 
            +
                                                                   .each_with_object({}) do |(localization, app_screenshot_set), hash|
         | 
| 73 | 
            +
                    hash[localization.locale] ||= {}
         | 
| 74 | 
            +
                    hash[localization.locale][app_screenshot_set.screenshot_display_type] = app_screenshot_set
         | 
| 75 | 
            +
                  end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                  # iterate over screenshots per localization
         | 
| 78 | 
            +
                  screenshots_per_language.each do |language, screenshots_for_language|
         | 
| 79 | 
            +
                    localization = supported_localizations.find { |l| l.locale == language }
         | 
| 80 | 
            +
                    screenshots_per_display_type = screenshots_for_language.reject { |screenshot| screenshot.device_type.nil? }.group_by(&:device_type)
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                    screenshots_per_display_type.each do |display_type, screenshots|
         | 
| 83 | 
            +
                      # create AppScreenshotSet for given display_type if it doesn't exsit
         | 
| 84 | 
            +
                      app_screenshot_set = app_screenshot_set_per_locale_and_display_type[language][display_type]
         | 
| 85 | 
            +
                      app_screenshot_set ||= localization.create_app_screenshot_set(attributes: { screenshotDisplayType: display_type })
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                      # iterate over screenshots per display size with index
         | 
| 88 | 
            +
                      screenshots.each.with_index do |screenshot, index|
         | 
| 89 | 
            +
                        yield(localization, app_screenshot_set, screenshot, index)
         | 
| 90 | 
            +
                      end
         | 
| 91 | 
            +
                    end
         | 
| 92 | 
            +
                  end
         | 
| 93 | 
            +
                end
         | 
| 94 | 
            +
              end
         | 
| 95 | 
            +
            end
         | 
| @@ -5,6 +5,7 @@ require 'spaceship/tunes/tunes' | |
| 5 5 | 
             
            require 'spaceship/tunes/application'
         | 
| 6 6 |  | 
| 7 7 | 
             
            require_relative 'module'
         | 
| 8 | 
            +
            require_relative 'languages'
         | 
| 8 9 |  | 
| 9 10 | 
             
            module Deliver
         | 
| 10 11 | 
             
              class DetectValues
         | 
| @@ -88,7 +89,9 @@ module Deliver | |
| 88 89 | 
             
                  languages = options[:languages]
         | 
| 89 90 | 
             
                  return unless languages
         | 
| 90 91 |  | 
| 91 | 
            -
                   | 
| 92 | 
            +
                  # 2020-08-24 - Available locales are not available as an endpoint in App Store Connect
         | 
| 93 | 
            +
                  # Update with Spaceship::Tunes.client.available_languages.sort (as long as endpoint is avilable)
         | 
| 94 | 
            +
                  all_languages = Deliver::Languages::ALL_LANGUAGES
         | 
| 92 95 | 
             
                  diff = languages - all_languages
         | 
| 93 96 |  | 
| 94 97 | 
             
                  unless diff.empty?
         | 
| @@ -0,0 +1,7 @@ | |
| 1 | 
            +
            module Deliver
         | 
| 2 | 
            +
              module Languages
         | 
| 3 | 
            +
                # 2020-08-24 - Available locales are not available as an endpoint in App Store Connect
         | 
| 4 | 
            +
                # Update with Spaceship::Tunes.client.available_languages.sort (as long as endpoint is avilable)
         | 
| 5 | 
            +
                ALL_LANGUAGES = ["ar-SA", "ca", "cs", "da", "de-DE", "el", "en-AU", "en-CA", "en-GB", "en-US", "es-ES", "es-MX", "fi", "fr-CA", "fr-FR", "he", "hi", "hr", "hu", "id", "it", "ja", "ko", "ms", "nl-NL", "no", "pl", "pt-BR", "pt-PT", "ro", "ru", "sk", "sv", "th", "tr", "uk", "vi", "zh-Hans", "zh-Hant"]
         | 
| 6 | 
            +
              end
         | 
| 7 | 
            +
            end
         | 
| @@ -3,6 +3,7 @@ require 'spaceship/tunes/tunes' | |
| 3 3 |  | 
| 4 4 | 
             
            require_relative 'module'
         | 
| 5 5 | 
             
            require_relative 'upload_metadata'
         | 
| 6 | 
            +
            require_relative 'languages'
         | 
| 6 7 |  | 
| 7 8 | 
             
            module Deliver
         | 
| 8 9 | 
             
              module Loader
         | 
| @@ -24,11 +25,9 @@ module Deliver | |
| 24 25 | 
             
                def self.language_folders(root, ignore_validation)
         | 
| 25 26 | 
             
                  folders = Dir.glob(File.join(root, '*'))
         | 
| 26 27 |  | 
| 27 | 
            -
                   | 
| 28 | 
            -
             | 
| 29 | 
            -
                   | 
| 30 | 
            -
                    available_languages = Spaceship::Tunes.client.available_languages.sort
         | 
| 31 | 
            -
                  end
         | 
| 28 | 
            +
                  # 2020-08-24 - Available locales are not available as an endpoint in App Store Connect
         | 
| 29 | 
            +
                  # Update with Spaceship::Tunes.client.available_languages.sort (as long as endpoint is avilable)
         | 
| 30 | 
            +
                  available_languages = Deliver::Languages::ALL_LANGUAGES
         | 
| 32 31 |  | 
| 33 32 | 
             
                  allowed_directory_names_with_case = (available_languages + SPECIAL_DIR_NAMES)
         | 
| 34 33 | 
             
                  allowed_directory_names = allowed_directory_names_with_case.map(&:downcase).freeze
         | 
| @@ -0,0 +1,64 @@ | |
| 1 | 
            +
            require 'thread'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Deliver
         | 
| 4 | 
            +
              # This dispatches jobs to worker threads and make it work in parallel.
         | 
| 5 | 
            +
              # It's suitable for I/O bounds works and not for CPU bounds works.
         | 
| 6 | 
            +
              # Use this when you have all the items that you'll process in advance.
         | 
| 7 | 
            +
              # Simply enqueue them to this and call `QueueWorker#start`.
         | 
| 8 | 
            +
              class QueueWorker
         | 
| 9 | 
            +
                # @param concurrency (Numeric) - A number of threads to be created
         | 
| 10 | 
            +
                # @param block (Proc) - A task you want to execute with enqueued items
         | 
| 11 | 
            +
                def initialize(concurrency, &block)
         | 
| 12 | 
            +
                  @concurrency = concurrency
         | 
| 13 | 
            +
                  @block = block
         | 
| 14 | 
            +
                  @queue = Queue.new
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                # @param job (Object) - An arbitary object that keeps parameters
         | 
| 18 | 
            +
                def enqueue(job)
         | 
| 19 | 
            +
                  @queue.push(job)
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                # Call this after you enqueuned all the jobs you want to process
         | 
| 23 | 
            +
                # This method blocks current thread until all the enqueued jobs are processed
         | 
| 24 | 
            +
                def start
         | 
| 25 | 
            +
                  threads = []
         | 
| 26 | 
            +
                  @concurrency.times do
         | 
| 27 | 
            +
                    threads << Thread.new do
         | 
| 28 | 
            +
                      while running? && !empty?
         | 
| 29 | 
            +
                        job = @queue.pop
         | 
| 30 | 
            +
                        @block.call(job) if job
         | 
| 31 | 
            +
                      end
         | 
| 32 | 
            +
                    end
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                  wait_for_complete
         | 
| 36 | 
            +
                  threads.each(&:join)
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                private
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                def running?
         | 
| 42 | 
            +
                  !@queue.closed?
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                def empty?
         | 
| 46 | 
            +
                  @queue.empty?
         | 
| 47 | 
            +
                end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                def wait_for_complete
         | 
| 50 | 
            +
                  wait_thread = Thread.new do
         | 
| 51 | 
            +
                    loop do
         | 
| 52 | 
            +
                      if @queue.empty?
         | 
| 53 | 
            +
                        @queue.close
         | 
| 54 | 
            +
                        break
         | 
| 55 | 
            +
                      end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                      sleep(1)
         | 
| 58 | 
            +
                    end
         | 
| 59 | 
            +
                  end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                  wait_thread.join
         | 
| 62 | 
            +
                end
         | 
| 63 | 
            +
              end
         | 
| 64 | 
            +
            end
         | 
| @@ -27,8 +27,8 @@ module Deliver | |
| 27 27 |  | 
| 28 28 | 
             
                def login
         | 
| 29 29 | 
             
                  UI.message("Login to App Store Connect (#{options[:username]})")
         | 
| 30 | 
            -
                  Spaceship:: | 
| 31 | 
            -
                  Spaceship:: | 
| 30 | 
            +
                  Spaceship::ConnectAPI.login(options[:username])
         | 
| 31 | 
            +
                  Spaceship::ConnectAPI.select_team
         | 
| 32 32 | 
             
                  UI.message("Login successful")
         | 
| 33 33 | 
             
                end
         | 
| 34 34 |  | 
| @@ -177,17 +177,19 @@ module Deliver | |
| 177 177 | 
             
                # If there are multiple teams, infer the provider from the selected team name.
         | 
| 178 178 | 
             
                # If there are fewer than two teams, don't infer the provider.
         | 
| 179 179 | 
             
                def transporter_for_selected_team
         | 
| 180 | 
            +
                  tunes_client = Spaceship::ConnectAPI.client.tunes_client
         | 
| 181 | 
            +
             | 
| 180 182 | 
             
                  generic_transporter = FastlaneCore::ItunesTransporter.new(options[:username], nil, false, options[:itc_provider])
         | 
| 181 | 
            -
                  return generic_transporter unless options[:itc_provider].nil? &&  | 
| 183 | 
            +
                  return generic_transporter unless options[:itc_provider].nil? && tunes_client.teams.count > 1
         | 
| 182 184 |  | 
| 183 185 | 
             
                  begin
         | 
| 184 | 
            -
                    team =  | 
| 186 | 
            +
                    team = tunes_client.teams.find { |t| t['contentProvider']['contentProviderId'].to_s == tunes_client.team_id }
         | 
| 185 187 | 
             
                    name = team['contentProvider']['name']
         | 
| 186 188 | 
             
                    provider_id = generic_transporter.provider_ids[name]
         | 
| 187 189 | 
             
                    UI.verbose("Inferred provider id #{provider_id} for team #{name}.")
         | 
| 188 190 | 
             
                    return FastlaneCore::ItunesTransporter.new(options[:username], nil, false, provider_id)
         | 
| 189 191 | 
             
                  rescue => ex
         | 
| 190 | 
            -
                    UI.verbose("Couldn't infer a provider short name for team with id #{ | 
| 192 | 
            +
                    UI.verbose("Couldn't infer a provider short name for team with id #{tunes_client.team_id} automatically: #{ex}. Proceeding without provider short name.")
         | 
| 191 193 | 
             
                    return generic_transporter
         | 
| 192 194 | 
             
                  end
         | 
| 193 195 | 
             
                end
         |