pem 0.3.0 → 0.3.1
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 +2 -2
 - data/bin/pem +48 -40
 - data/lib/pem/developer_center.rb +49 -26
 - data/lib/pem/version.rb +1 -1
 - metadata +2 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 5113d3a0b7c34285b2ae53df264b7ff74c14d631
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 25849e4e7815c1756c4cc3be3d09269a1199e920
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: f385fe1bdfa680067687e8431345d315a5b6df8f67f3a7323551c190d3b15ba1ff4bccc9399e9fc75b303f4b9937a7a21406a2a7034da224327f93f64944a70d
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 8551602780f0c56612f4b76a64e0628215bea5a75078b5f99f6056f13afa44a25890fb2f6ec8f16e5aa5df373094fc3ac3dfeab1a03cab093fc4120aa4e7e3e1
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -109,7 +109,7 @@ There are 2 actions involved: 
     | 
|
| 
       109 
109 
     | 
    
         | 
| 
       110 
110 
     | 
    
         | 
| 
       111 
111 
     | 
    
         
             
            ## How is my password stored?
         
     | 
| 
       112 
     | 
    
         
            -
            ```PEM``` uses the password manager 
     | 
| 
      
 112 
     | 
    
         
            +
            ```PEM``` uses the [password manager](https://github.com/KrauseFx/CredentialsManager) from `fastlane`. Take a look the [CredentialsManager README](https://github.com/KrauseFx/CredentialsManager) for more information.
         
     | 
| 
       113 
113 
     | 
    
         | 
| 
       114 
114 
     | 
    
         
             
            # Tips
         
     | 
| 
       115 
115 
     | 
    
         | 
| 
         @@ -129,7 +129,7 @@ It will show you the ```pem``` files like this: 
     | 
|
| 
       129 
129 
     | 
    
         | 
| 
       130 
130 
     | 
    
         | 
| 
       131 
131 
     | 
    
         
             
            # Need help?
         
     | 
| 
       132 
     | 
    
         
            -
            - If there is a technical problem with ```PEM```, submit an issue. 
     | 
| 
      
 132 
     | 
    
         
            +
            - If there is a technical problem with ```PEM```, submit an issue.
         
     | 
| 
       133 
133 
     | 
    
         
             
            - I'm available for contract work - drop me an email: pem@krausefx.com
         
     | 
| 
       134 
134 
     | 
    
         | 
| 
       135 
135 
     | 
    
         
             
            # License
         
     | 
    
        data/bin/pem
    CHANGED
    
    | 
         @@ -3,61 +3,69 @@ 
     | 
|
| 
       3 
3 
     | 
    
         
             
            $:.push File.expand_path("../../lib", __FILE__)
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
            require 'pem'
         
     | 
| 
       6 
     | 
    
         
            -
            require 'commander 
     | 
| 
      
 6 
     | 
    
         
            +
            require 'commander'
         
     | 
| 
       7 
7 
     | 
    
         
             
            require 'credentials_manager/password_manager'
         
     | 
| 
       8 
8 
     | 
    
         
             
            require 'credentials_manager/appfile_config'
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
10 
     | 
    
         
             
            HighLine.track_eof = false
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
      
 12 
     | 
    
         
            +
            class PemApplication
         
     | 
| 
      
 13 
     | 
    
         
            +
              include Commander::Methods
         
     | 
| 
       12 
14 
     | 
    
         | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
            program :version, PEM::VERSION
         
     | 
| 
       15 
     | 
    
         
            -
            program :description, 'CLI for \'PEM\' - Automatically generate and renew your push notification profiles'
         
     | 
| 
       16 
     | 
    
         
            -
            program :help, 'Author', 'Felix Krause <pem@krausefx.com>'
         
     | 
| 
       17 
     | 
    
         
            -
            program :help, 'Website', 'http://fastlane.tools'
         
     | 
| 
       18 
     | 
    
         
            -
            program :help, 'GitHub', 'https://github.com/krausefx/PEM'
         
     | 
| 
       19 
     | 
    
         
            -
            program :help_formatter, :compact
         
     | 
| 
      
 15 
     | 
    
         
            +
              def run
         
     | 
| 
      
 16 
     | 
    
         
            +
                program :version, PEM::VERSION
         
     | 
| 
      
 17 
     | 
    
         
            +
                program :description, 'CLI for \'PEM\' - Automatically generate and renew your push notification profiles'
         
     | 
| 
      
 18 
     | 
    
         
            +
                program :help, 'Author', 'Felix Krause <pem@krausefx.com>'
         
     | 
| 
      
 19 
     | 
    
         
            +
                program :help, 'Website', 'http://fastlane.tools'
         
     | 
| 
      
 20 
     | 
    
         
            +
                program :help, 'GitHub', 'https://github.com/krausefx/PEM'
         
     | 
| 
      
 21 
     | 
    
         
            +
                program :help_formatter, :compact
         
     | 
| 
       20 
22 
     | 
    
         | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
      
 23 
     | 
    
         
            +
                always_trace!
         
     | 
| 
       22 
24 
     | 
    
         | 
| 
      
 25 
     | 
    
         
            +
                global_option '--development', 'Renew the development push certificate instead of the production one'
         
     | 
| 
      
 26 
     | 
    
         
            +
                global_option '-u', '--username STRING', 'Your Apple ID username'
         
     | 
| 
      
 27 
     | 
    
         
            +
                global_option '-a', '--identifier STRING', String, 'The bundle identifier of your app'
         
     | 
| 
       23 
28 
     | 
    
         | 
| 
       24 
     | 
    
         
            -
            command :renew do |c|
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
      
 29 
     | 
    
         
            +
                command :renew do |c|
         
     | 
| 
      
 30 
     | 
    
         
            +
                  c.syntax = 'pem renew'
         
     | 
| 
      
 31 
     | 
    
         
            +
                  c.description = 'Renews the certificate (in case it expired) and shows the path to the generated pem file'
         
     | 
| 
       27 
32 
     | 
    
         | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
      
 33 
     | 
    
         
            +
                  c.action do |args, options|
         
     | 
| 
      
 34 
     | 
    
         
            +
                    app = app_identifier(options)
         
     | 
| 
      
 35 
     | 
    
         
            +
                    username(options)
         
     | 
| 
       31 
36 
     | 
    
         | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
                app = app_identifier(options)
         
     | 
| 
       34 
     | 
    
         
            -
                username(options)
         
     | 
| 
      
 37 
     | 
    
         
            +
                    path = PEM::CertManager.new.run(app, !options.development)
         
     | 
| 
       35 
38 
     | 
    
         | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
                   
     | 
| 
      
 39 
     | 
    
         
            +
                    if path
         
     | 
| 
      
 40 
     | 
    
         
            +
                      file_name = File.basename(path)
         
     | 
| 
      
 41 
     | 
    
         
            +
                      output = "./#{file_name}"
         
     | 
| 
      
 42 
     | 
    
         
            +
                      FileUtils.mv(path, output)
         
     | 
| 
      
 43 
     | 
    
         
            +
                      puts output.green
         
     | 
| 
      
 44 
     | 
    
         
            +
                    end
         
     | 
| 
      
 45 
     | 
    
         
            +
                  end
         
     | 
| 
       43 
46 
     | 
    
         
             
                end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                default_command :renew
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                run!
         
     | 
| 
       44 
51 
     | 
    
         
             
              end
         
     | 
| 
       45 
     | 
    
         
            -
            end
         
     | 
| 
       46 
52 
     | 
    
         | 
| 
       47 
     | 
    
         
            -
             
     | 
| 
      
 53 
     | 
    
         
            +
              def username(options)
         
     | 
| 
      
 54 
     | 
    
         
            +
                user = options.username
         
     | 
| 
      
 55 
     | 
    
         
            +
                user ||= ENV["PEM_USERNAME"]
         
     | 
| 
      
 56 
     | 
    
         
            +
                user ||= CredentialsManager::AppfileConfig.try_fetch_value(:apple_id)
         
     | 
| 
      
 57 
     | 
    
         
            +
                
         
     | 
| 
      
 58 
     | 
    
         
            +
                CredentialsManager::PasswordManager.shared_manager(user) if user
         
     | 
| 
      
 59 
     | 
    
         
            +
              end
         
     | 
| 
       48 
60 
     | 
    
         | 
| 
       49 
     | 
    
         
            -
            def  
     | 
| 
       50 
     | 
    
         
            -
             
     | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
             
     | 
| 
       55 
     | 
    
         
            -
            end
         
     | 
| 
      
 61 
     | 
    
         
            +
              def app_identifier(options)
         
     | 
| 
      
 62 
     | 
    
         
            +
                value = options.identifier
         
     | 
| 
      
 63 
     | 
    
         
            +
                value ||= ENV["PEM_APP_IDENTIFIER"]
         
     | 
| 
      
 64 
     | 
    
         
            +
                value ||= CredentialsManager::AppfileConfig.try_fetch_value(:app_identifier)
         
     | 
| 
      
 65 
     | 
    
         
            +
                value ||= ask("App Identifier (Bundle ID, e.g. com.krausefx.app): ")
         
     | 
| 
      
 66 
     | 
    
         
            +
                return value
         
     | 
| 
      
 67 
     | 
    
         
            +
              end
         
     | 
| 
       56 
68 
     | 
    
         | 
| 
       57 
     | 
    
         
            -
            def app_identifier(options)
         
     | 
| 
       58 
     | 
    
         
            -
              value = options.identifier
         
     | 
| 
       59 
     | 
    
         
            -
              value ||= ENV["PEM_APP_IDENTIFIER"]
         
     | 
| 
       60 
     | 
    
         
            -
              value ||= CredentialsManager::AppfileConfig.try_fetch_value(:app_identifier)
         
     | 
| 
       61 
     | 
    
         
            -
              value ||= ask("App Identifier (Bundle ID, e.g. com.krausefx.app): ")
         
     | 
| 
       62 
     | 
    
         
            -
              return value
         
     | 
| 
       63 
69 
     | 
    
         
             
            end
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
            PemApplication.new.run
         
     | 
    
        data/lib/pem/developer_center.rb
    CHANGED
    
    | 
         @@ -68,7 +68,7 @@ module PEM 
     | 
|
| 
       68 
68 
     | 
    
         
             
                    user ||= CredentialsManager::PasswordManager.shared_manager.username
         
     | 
| 
       69 
69 
     | 
    
         
             
                    password ||= CredentialsManager::PasswordManager.shared_manager.password
         
     | 
| 
       70 
70 
     | 
    
         | 
| 
       71 
     | 
    
         
            -
                    result = visit  
     | 
| 
      
 71 
     | 
    
         
            +
                    result = visit APP_IDS_URL
         
     | 
| 
       72 
72 
     | 
    
         
             
                    raise "Could not open Developer Center" unless result['status'] == 'success'
         
     | 
| 
       73 
73 
     | 
    
         | 
| 
       74 
74 
     | 
    
         
             
                    wait_for_elements(".button.blue").first.click
         
     | 
| 
         @@ -86,37 +86,17 @@ module PEM 
     | 
|
| 
       86 
86 
     | 
    
         
             
                    all(".button.large.blue.signin-button").first.click
         
     | 
| 
       87 
87 
     | 
    
         | 
| 
       88 
88 
     | 
    
         
             
                    begin
         
     | 
| 
       89 
     | 
    
         
            -
                      if page.has_content?"Select  
     | 
| 
       90 
     | 
    
         
            -
                         
     | 
| 
       91 
     | 
    
         
            -
                        unless team_id
         
     | 
| 
       92 
     | 
    
         
            -
                          Helper.log.info "You can store you preferred team using the environment variable `PEM_TEAM_ID`".green
         
     | 
| 
       93 
     | 
    
         
            -
                          Helper.log.info "Your ID belongs to the following teams:".green
         
     | 
| 
       94 
     | 
    
         
            -
                          
         
     | 
| 
       95 
     | 
    
         
            -
                          teams = find("select").all('option') # Grab all the teams data
         
     | 
| 
       96 
     | 
    
         
            -
                          teams.each_with_index do |val, index|
         
     | 
| 
       97 
     | 
    
         
            -
                            team_text = val.text
         
     | 
| 
       98 
     | 
    
         
            -
                            description_text = val.value
         
     | 
| 
       99 
     | 
    
         
            -
                            description_text = " (#{description_text})" unless description_text.empty? # Include the team description if any
         
     | 
| 
       100 
     | 
    
         
            -
                            Helper.log.info "\t#{index + 1}. #{team_text}#{description_text}".green # Print the team index and team name
         
     | 
| 
       101 
     | 
    
         
            -
                          end
         
     | 
| 
       102 
     | 
    
         
            -
                          
         
     | 
| 
       103 
     | 
    
         
            -
                          team_index = ask("Please select the team number you would like to access: ".green)
         
     | 
| 
       104 
     | 
    
         
            -
                          team_id = teams[team_index.to_i - 1].value # Select the desired team
         
     | 
| 
       105 
     | 
    
         
            -
                        end
         
     | 
| 
       106 
     | 
    
         
            -
                      within 'select' do
         
     | 
| 
       107 
     | 
    
         
            -
                        find("option[value='#{team_id}']").select_option
         
     | 
| 
      
 89 
     | 
    
         
            +
                      if page.has_content?"Select Team" # If the user is not on multiple teams
         
     | 
| 
      
 90 
     | 
    
         
            +
                        select_team
         
     | 
| 
       108 
91 
     | 
    
         
             
                      end
         
     | 
| 
       109 
     | 
    
         
            -
                        
         
     | 
| 
       110 
     | 
    
         
            -
                     all("#saveTeamSelection_saveTeamSelection").first.click
         
     | 
| 
       111 
     | 
    
         
            -
                     end
         
     | 
| 
       112 
92 
     | 
    
         
             
                    rescue => ex
         
     | 
| 
       113 
93 
     | 
    
         
             
                      Helper.log.debug ex
         
     | 
| 
       114 
94 
     | 
    
         
             
                      raise DeveloperCenterLoginError.new("Error loggin in user #{user}. User is on multiple teams and we were unable to correctly retrieve them.")
         
     | 
| 
       115 
95 
     | 
    
         
             
                    end
         
     | 
| 
       116 
96 
     | 
    
         | 
| 
       117 
97 
     | 
    
         
             
                    begin
         
     | 
| 
       118 
     | 
    
         
            -
                      
         
     | 
| 
       119 
     | 
    
         
            -
                      wait_for_elements(' 
     | 
| 
      
 98 
     | 
    
         
            +
                      visit APP_IDS_URL
         
     | 
| 
      
 99 
     | 
    
         
            +
                      wait_for_elements('.ios.bundles.gridList')
         
     | 
| 
       120 
100 
     | 
    
         
             
                    rescue => ex
         
     | 
| 
       121 
101 
     | 
    
         
             
                      Helper.log.debug ex
         
     | 
| 
       122 
102 
     | 
    
         
             
                      raise DeveloperCenterLoginError.new("Error logging in user #{user} with the given password. Make sure you entered them correctly.")
         
     | 
| 
         @@ -130,6 +110,49 @@ module PEM 
     | 
|
| 
       130 
110 
     | 
    
         
             
                  end
         
     | 
| 
       131 
111 
     | 
    
         
             
                end
         
     | 
| 
       132 
112 
     | 
    
         | 
| 
      
 113 
     | 
    
         
            +
                def select_team
         
     | 
| 
      
 114 
     | 
    
         
            +
                  team_id = ENV["PEM_TEAM_ID"]
         
     | 
| 
      
 115 
     | 
    
         
            +
                  team_id = nil if team_id.to_s.length == 0
         
     | 
| 
      
 116 
     | 
    
         
            +
             
     | 
| 
      
 117 
     | 
    
         
            +
                  unless team_id
         
     | 
| 
      
 118 
     | 
    
         
            +
                    Helper.log.info "You can store you preferred team using the environment variable `PEM_TEAM_ID`".green
         
     | 
| 
      
 119 
     | 
    
         
            +
                    Helper.log.info "Your ID belongs to the following teams:".green
         
     | 
| 
      
 120 
     | 
    
         
            +
                  end
         
     | 
| 
      
 121 
     | 
    
         
            +
                  
         
     | 
| 
      
 122 
     | 
    
         
            +
                  available_options = []
         
     | 
| 
      
 123 
     | 
    
         
            +
             
     | 
| 
      
 124 
     | 
    
         
            +
                  teams = find("div.input").all('.team-value') # Grab all the teams data
         
     | 
| 
      
 125 
     | 
    
         
            +
                  teams.each_with_index do |val, index|
         
     | 
| 
      
 126 
     | 
    
         
            +
                    current_team_id = '"' + val.find("input").value + '"'
         
     | 
| 
      
 127 
     | 
    
         
            +
                    team_text = val.find(".label-primary").text
         
     | 
| 
      
 128 
     | 
    
         
            +
                    description_text = val.find(".label-secondary").text
         
     | 
| 
      
 129 
     | 
    
         
            +
                    description_text = "(#{description_text})" unless description_text.empty? # Include the team description if any
         
     | 
| 
      
 130 
     | 
    
         
            +
                    index_text = (index + 1).to_s + "."
         
     | 
| 
      
 131 
     | 
    
         
            +
             
     | 
| 
      
 132 
     | 
    
         
            +
                    available_options << [index_text, current_team_id, team_text, description_text].join(" ")
         
     | 
| 
      
 133 
     | 
    
         
            +
                  end
         
     | 
| 
      
 134 
     | 
    
         
            +
             
     | 
| 
      
 135 
     | 
    
         
            +
                  unless team_id
         
     | 
| 
      
 136 
     | 
    
         
            +
                    puts available_options.join("\n").green
         
     | 
| 
      
 137 
     | 
    
         
            +
                    team_index = ask("Please select the team number you would like to access: ".green)
         
     | 
| 
      
 138 
     | 
    
         
            +
                    team_id = teams[team_index.to_i - 1].find(".radio").value
         
     | 
| 
      
 139 
     | 
    
         
            +
                  end
         
     | 
| 
      
 140 
     | 
    
         
            +
             
     | 
| 
      
 141 
     | 
    
         
            +
                  team_button = first(:xpath, "//input[@type='radio' and @value='#{team_id}']") # Select the desired team
         
     | 
| 
      
 142 
     | 
    
         
            +
                  if team_button
         
     | 
| 
      
 143 
     | 
    
         
            +
                    team_button.click
         
     | 
| 
      
 144 
     | 
    
         
            +
                  else
         
     | 
| 
      
 145 
     | 
    
         
            +
                    Helper.log.fatal "Could not find given Team. Available options: ".red
         
     | 
| 
      
 146 
     | 
    
         
            +
                    puts available_options.join("\n").yellow
         
     | 
| 
      
 147 
     | 
    
         
            +
                    raise DeveloperCenterLoginError.new("Error finding given team #{team_id}.".red)
         
     | 
| 
      
 148 
     | 
    
         
            +
                  end
         
     | 
| 
      
 149 
     | 
    
         
            +
             
     | 
| 
      
 150 
     | 
    
         
            +
                  all(".button.large.blue.submit").first.click
         
     | 
| 
      
 151 
     | 
    
         
            +
             
     | 
| 
      
 152 
     | 
    
         
            +
                  result = visit APP_IDS_URL
         
     | 
| 
      
 153 
     | 
    
         
            +
                  raise "Could not open Developer Center" unless result['status'] == 'success'
         
     | 
| 
      
 154 
     | 
    
         
            +
                end
         
     | 
| 
      
 155 
     | 
    
         
            +
             
     | 
| 
       133 
156 
     | 
    
         
             
                # This method will enable push for the given app
         
     | 
| 
       134 
157 
     | 
    
         
             
                # and download the cer file in any case, no matter if it existed before or not
         
     | 
| 
       135 
158 
     | 
    
         
             
                # @return the path to the push file
         
     | 
| 
         @@ -160,6 +183,7 @@ module PEM 
     | 
|
| 
       160 
183 
     | 
    
         
             
                  def open_app_page(app_identifier)
         
     | 
| 
       161 
184 
     | 
    
         
             
                    begin
         
     | 
| 
       162 
185 
     | 
    
         
             
                      visit APP_IDS_URL
         
     | 
| 
      
 186 
     | 
    
         
            +
                      sleep 5
         
     | 
| 
       163 
187 
     | 
    
         | 
| 
       164 
188 
     | 
    
         
             
                      apps = all(:xpath, "//td[@title='#{app_identifier}']")
         
     | 
| 
       165 
189 
     | 
    
         
             
                      if apps.count == 1
         
     | 
| 
         @@ -264,7 +288,6 @@ module PEM 
     | 
|
| 
       264 
288 
     | 
    
         | 
| 
       265 
289 
     | 
    
         
             
                      counter += 1
         
     | 
| 
       266 
290 
     | 
    
         
             
                      if counter > 100
         
     | 
| 
       267 
     | 
    
         
            -
                        Helper.log.debug page.html
         
     | 
| 
       268 
291 
     | 
    
         
             
                        Helper.log.debug caller
         
     | 
| 
       269 
292 
     | 
    
         
             
                        raise DeveloperCenterGeneralError.new("Couldn't find element '#{name}' after waiting for quite some time")
         
     | 
| 
       270 
293 
     | 
    
         
             
                      end
         
     | 
    
        data/lib/pem/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: pem
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0.3. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.3.1
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Felix Krause
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2015-01- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2015-01-28 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: json
         
     |