bitballoon 0.1.6 → 0.2.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/Gemfile.lock +5 -6
 - data/README.md +26 -16
 - data/bin/bitballoon +1 -1
 - data/lib/bitballoon/collection_proxy.rb +1 -1
 - data/lib/bitballoon/deploy.rb +45 -1
 - data/lib/bitballoon/deploys.rb +32 -1
 - data/lib/bitballoon/site.rb +10 -40
 - data/lib/bitballoon/sites.rb +6 -28
 - data/lib/bitballoon/version.rb +1 -1
 - data/test/sites_test.rb +23 -9
 - metadata +15 -15
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: c588189c9a104f90e2ad87493ceb496ca7d5aa01
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 411c2dc541f248a0751e071746a86ae024e46284
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: e196e56cd6b436727c08696a9f371eb080d1fe3faa94438a8b56a9a3035f7cbf05c735ebc1a3e52262a8ada9b7fa9c743e44ebf233f001c32ca08be7d86f67d5
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 4a81d173863aafac2c6bd2abe669b3f45344d9dd8bf502c70fccae5c0b9fc7d2dffe45f8127bce4d307d3639174f41bcc24c660b8d60351400a1402bbc4415e5
         
     | 
    
        data/Gemfile.lock
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            PATH
         
     | 
| 
       2 
2 
     | 
    
         
             
              remote: .
         
     | 
| 
       3 
3 
     | 
    
         
             
              specs:
         
     | 
| 
       4 
     | 
    
         
            -
                bitballoon (0. 
     | 
| 
      
 4 
     | 
    
         
            +
                bitballoon (0.2.0)
         
     | 
| 
       5 
5 
     | 
    
         
             
                  highline
         
     | 
| 
       6 
6 
     | 
    
         
             
                  oauth2 (>= 0.9.2)
         
     | 
| 
       7 
7 
     | 
    
         
             
                  slop
         
     | 
| 
         @@ -14,15 +14,14 @@ GEM 
     | 
|
| 
       14 
14 
     | 
    
         
             
                faraday (0.9.0)
         
     | 
| 
       15 
15 
     | 
    
         
             
                  multipart-post (>= 1.2, < 3)
         
     | 
| 
       16 
16 
     | 
    
         
             
                highline (1.6.21)
         
     | 
| 
       17 
     | 
    
         
            -
                jwt (0. 
     | 
| 
       18 
     | 
    
         
            -
                  multi_json (>= 1.5)
         
     | 
| 
      
 17 
     | 
    
         
            +
                jwt (1.0.0)
         
     | 
| 
       19 
18 
     | 
    
         
             
                minitest (5.0.8)
         
     | 
| 
       20 
     | 
    
         
            -
                multi_json (1. 
     | 
| 
      
 19 
     | 
    
         
            +
                multi_json (1.10.1)
         
     | 
| 
       21 
20 
     | 
    
         
             
                multi_xml (0.5.5)
         
     | 
| 
       22 
21 
     | 
    
         
             
                multipart-post (2.0.0)
         
     | 
| 
       23 
     | 
    
         
            -
                oauth2 (0.9. 
     | 
| 
      
 22 
     | 
    
         
            +
                oauth2 (0.9.4)
         
     | 
| 
       24 
23 
     | 
    
         
             
                  faraday (>= 0.8, < 0.10)
         
     | 
| 
       25 
     | 
    
         
            -
                  jwt (~>  
     | 
| 
      
 24 
     | 
    
         
            +
                  jwt (~> 1.0)
         
     | 
| 
       26 
25 
     | 
    
         
             
                  multi_json (~> 1.3)
         
     | 
| 
       27 
26 
     | 
    
         
             
                  multi_xml (~> 0.5)
         
     | 
| 
       28 
27 
     | 
    
         
             
                  rack (~> 1.2)
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -28,7 +28,7 @@ or put it in a Gemfile and run `bundle install` 
     | 
|
| 
       28 
28 
     | 
    
         
             
            Authenticating
         
     | 
| 
       29 
29 
     | 
    
         
             
            ==============
         
     | 
| 
       30 
30 
     | 
    
         | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
      
 31 
     | 
    
         
            +
            Register a new application at https://www.bitballoon.com/applications to get your Oauth2 secret and key.
         
     | 
| 
       32 
32 
     | 
    
         | 
| 
       33 
33 
     | 
    
         
             
            Once you have your credentials you can instantiate a BitBalloon client.
         
     | 
| 
       34 
34 
     | 
    
         | 
| 
         @@ -41,7 +41,7 @@ Before you can make any requests to the API, you'll need to authenticate with OA 
     | 
|
| 
       41 
41 
     | 
    
         
             
            If you're authenticating on behalf of a user, you'll need to get a valid access token for that user. Use the BitBalloon client to request an authentication URL:
         
     | 
| 
       42 
42 
     | 
    
         | 
| 
       43 
43 
     | 
    
         
             
            ```ruby
         
     | 
| 
       44 
     | 
    
         
            -
            url = bitballoon.authorize_url(: 
     | 
| 
      
 44 
     | 
    
         
            +
            url = bitballoon.authorize_url(:redirect_uri => "http://www.example.com/callback")
         
     | 
| 
       45 
45 
     | 
    
         
             
            ```
         
     | 
| 
       46 
46 
     | 
    
         | 
| 
       47 
47 
     | 
    
         
             
            The user then visits that URL and will be prompted to authorize your application to access his BitBalloon sites. If she grants permission, she'll be redirected back to the `redirect_uri` provided in the `authorize_url` call. This URL must match the redirect url configured for your BitBalloon application. Once the user comes back to your app, you'll be able to access a `code` query parameter that gives you an authorization code. Use this to finish the OAuth2 flow:
         
     | 
| 
         @@ -132,17 +132,13 @@ Creating a site from a zip file: 
     | 
|
| 
       132 
132 
     | 
    
         
             
            site = bitballoon.sites.create(:zip => "/tmp/my-site.zip")
         
     | 
| 
       133 
133 
     | 
    
         
             
            ```
         
     | 
| 
       134 
134 
     | 
    
         | 
| 
       135 
     | 
    
         
            -
            Both methods will create the site and upload the files 
     | 
| 
      
 135 
     | 
    
         
            +
            Both methods will create the site and upload the files to a new deploy.
         
     | 
| 
       136 
136 
     | 
    
         | 
| 
       137 
     | 
    
         
            -
             
     | 
| 
       138 
     | 
    
         
            -
            site.state == "processing"
         
     | 
| 
       139 
     | 
    
         
            -
            site.processing? == true
         
     | 
| 
       140 
     | 
    
         
            -
            ```
         
     | 
| 
       141 
     | 
    
         
            -
             
     | 
| 
       142 
     | 
    
         
            -
            Refresh a site to update the state:
         
     | 
| 
      
 137 
     | 
    
         
            +
            Creating a site with a dir or a zip is actually a shortcut for something like this:
         
     | 
| 
       143 
138 
     | 
    
         | 
| 
       144 
139 
     | 
    
         
             
            ```ruby
         
     | 
| 
       145 
     | 
    
         
            -
             
     | 
| 
      
 140 
     | 
    
         
            +
            site = bitballoon.sites.create(:name => "unique-site-subdomain", :custom_domain => "www.example.com")
         
     | 
| 
      
 141 
     | 
    
         
            +
            deploy = site.deploys.create(:dir => "path/to/my-site")
         
     | 
| 
       146 
142 
     | 
    
         
             
            ```
         
     | 
| 
       147 
143 
     | 
    
         | 
| 
       148 
144 
     | 
    
         
             
            Use `wait_for_ready` to wait until a site has finished processing.
         
     | 
| 
         @@ -153,20 +149,29 @@ site.wait_for_ready 
     | 
|
| 
       153 
149 
     | 
    
         
             
            site.state == "ready"
         
     | 
| 
       154 
150 
     | 
    
         
             
            ```
         
     | 
| 
       155 
151 
     | 
    
         | 
| 
      
 152 
     | 
    
         
            +
            This also works on a specific deploy, and you can pass in a block to execute after each polling action:
         
     | 
| 
      
 153 
     | 
    
         
            +
             
     | 
| 
      
 154 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 155 
     | 
    
         
            +
            deploy = site.deploys.create(:dir => "/tmp/my-site")
         
     | 
| 
      
 156 
     | 
    
         
            +
            deploy.wait_for_ready do |deploy|
         
     | 
| 
      
 157 
     | 
    
         
            +
              puts "Current state: #{deploy.state}"
         
     | 
| 
      
 158 
     | 
    
         
            +
            end
         
     | 
| 
      
 159 
     | 
    
         
            +
            ```
         
     | 
| 
      
 160 
     | 
    
         
            +
             
     | 
| 
       156 
161 
     | 
    
         
             
            Redeploy a site from a dir:
         
     | 
| 
       157 
162 
     | 
    
         | 
| 
       158 
163 
     | 
    
         
             
            ```ruby
         
     | 
| 
       159 
164 
     | 
    
         
             
            site = bitballoon.sites.get(site_id)
         
     | 
| 
       160 
     | 
    
         
            -
            site. 
     | 
| 
       161 
     | 
    
         
            -
             
     | 
| 
      
 165 
     | 
    
         
            +
            deploy = site.deploys.create(:dir => "/tmp/my-site")
         
     | 
| 
      
 166 
     | 
    
         
            +
            deploy.wait_for_ready
         
     | 
| 
       162 
167 
     | 
    
         
             
            ```
         
     | 
| 
       163 
168 
     | 
    
         | 
| 
       164 
169 
     | 
    
         
             
            Redeploy a site from a zip file:
         
     | 
| 
       165 
170 
     | 
    
         | 
| 
       166 
171 
     | 
    
         
             
            ```ruby
         
     | 
| 
       167 
172 
     | 
    
         
             
            site = bitballoon.sites.get(site_id)
         
     | 
| 
       168 
     | 
    
         
            -
            site. 
     | 
| 
       169 
     | 
    
         
            -
             
     | 
| 
      
 173 
     | 
    
         
            +
            deploy = site.deploys.create(:zip => "/tmp/my-site.zip")
         
     | 
| 
      
 174 
     | 
    
         
            +
            deploy.wait_for_ready
         
     | 
| 
       170 
175 
     | 
    
         
             
            ```
         
     | 
| 
       171 
176 
     | 
    
         | 
| 
       172 
177 
     | 
    
         
             
            Update the name of the site (its subdomain), the custom domain and the notification email for form submissions:
         
     | 
| 
         @@ -195,7 +200,7 @@ Access a specific deploy 
     | 
|
| 
       195 
200 
     | 
    
         | 
| 
       196 
201 
     | 
    
         
             
            ```ruby
         
     | 
| 
       197 
202 
     | 
    
         
             
            site = bitballoon.sites.get(site_id)
         
     | 
| 
       198 
     | 
    
         
            -
            site.deploys.get(id)
         
     | 
| 
      
 203 
     | 
    
         
            +
            deploy = site.deploys.get(id)
         
     | 
| 
       199 
204 
     | 
    
         
             
            ```
         
     | 
| 
       200 
205 
     | 
    
         | 
| 
       201 
206 
     | 
    
         
             
            Restore a deploy (makes it the current live version of the site)
         
     | 
| 
         @@ -204,6 +209,12 @@ Restore a deploy (makes it the current live version of the site) 
     | 
|
| 
       204 
209 
     | 
    
         
             
            site.deploys.get(id).restore
         
     | 
| 
       205 
210 
     | 
    
         
             
            ```
         
     | 
| 
       206 
211 
     | 
    
         | 
| 
      
 212 
     | 
    
         
            +
            Create a new deploy
         
     | 
| 
      
 213 
     | 
    
         
            +
             
     | 
| 
      
 214 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 215 
     | 
    
         
            +
            deploy = site.deploys.create(:dir => "/tmp/my-site")
         
     | 
| 
      
 216 
     | 
    
         
            +
            ```
         
     | 
| 
      
 217 
     | 
    
         
            +
             
     | 
| 
       207 
218 
     | 
    
         
             
            Users
         
     | 
| 
       208 
219 
     | 
    
         
             
            =====
         
     | 
| 
       209 
220 
     | 
    
         | 
| 
         @@ -427,4 +438,3 @@ Revoke access token: 
     | 
|
| 
       427 
438 
     | 
    
         
             
            ```ruby
         
     | 
| 
       428 
439 
     | 
    
         
             
            bitballoon.access_tokens.get("token-string").destroy
         
     | 
| 
       429 
440 
     | 
    
         
             
            ```
         
     | 
| 
       430 
     | 
    
         
            -
             
     | 
    
        data/bin/bitballoon
    CHANGED
    
    
    
        data/lib/bitballoon/deploy.rb
    CHANGED
    
    | 
         @@ -4,10 +4,54 @@ module BitBalloon 
     | 
|
| 
       4 
4 
     | 
    
         
             
                       :admin_url, :deploy_url, :screenshot_url, :created_at, :updated_at,
         
     | 
| 
       5 
5 
     | 
    
         
             
                       :user_id, :required
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
      
 7 
     | 
    
         
            +
                def upload_dir(dir)
         
     | 
| 
      
 8 
     | 
    
         
            +
                  return unless state == "uploading"
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                  shas = Hash.new { [] }
         
     | 
| 
      
 11 
     | 
    
         
            +
                  glob = ::File.join(dir, "**", "*")
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                  Dir.glob(glob) do |file|
         
     | 
| 
      
 14 
     | 
    
         
            +
                    next unless ::File.file?(file)
         
     | 
| 
      
 15 
     | 
    
         
            +
                    pathname = ::File.join("/", file[dir.length..-1])
         
     | 
| 
      
 16 
     | 
    
         
            +
                    next if pathname.match(/(^\/?__MACOSX\/|\/\.)/)
         
     | 
| 
      
 17 
     | 
    
         
            +
                    sha = Digest::SHA1.hexdigest(::File.read(file))
         
     | 
| 
      
 18 
     | 
    
         
            +
                    shas[sha] = shas[sha] + [pathname]
         
     | 
| 
      
 19 
     | 
    
         
            +
                  end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                  (required || []).each do |sha|
         
     | 
| 
      
 22 
     | 
    
         
            +
                    shas[sha].each do |pathname|
         
     | 
| 
      
 23 
     | 
    
         
            +
                      client.request(:put, ::File.join(path, "files", URI.encode(pathname)), :body => ::File.read(::File.join(dir, pathname)), :headers => {"Content-Type" => "application/octet-stream"})
         
     | 
| 
      
 24 
     | 
    
         
            +
                    end
         
     | 
| 
      
 25 
     | 
    
         
            +
                  end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                  refresh
         
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                def wait_for_ready(timeout = 900)
         
     | 
| 
      
 31 
     | 
    
         
            +
                  start = Time.now
         
     | 
| 
      
 32 
     | 
    
         
            +
                  while !(ready?)
         
     | 
| 
      
 33 
     | 
    
         
            +
                    sleep 5
         
     | 
| 
      
 34 
     | 
    
         
            +
                    refresh
         
     | 
| 
      
 35 
     | 
    
         
            +
                    puts "Got state: #{state}"
         
     | 
| 
      
 36 
     | 
    
         
            +
                    raise "Error processing site: #{error_message}" if error?
         
     | 
| 
      
 37 
     | 
    
         
            +
                    yield(self) if block_given?
         
     | 
| 
      
 38 
     | 
    
         
            +
                    raise "Timeout while waiting for ready" if Time.now - start > timeout
         
     | 
| 
      
 39 
     | 
    
         
            +
                  end
         
     | 
| 
      
 40 
     | 
    
         
            +
                  self
         
     | 
| 
      
 41 
     | 
    
         
            +
                end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                def ready?
         
     | 
| 
      
 44 
     | 
    
         
            +
                  state == "ready"
         
     | 
| 
      
 45 
     | 
    
         
            +
                end
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                def error?
         
     | 
| 
      
 48 
     | 
    
         
            +
                  state == "error"
         
     | 
| 
      
 49 
     | 
    
         
            +
                end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
       7 
51 
     | 
    
         
             
                def restore
         
     | 
| 
       8 
52 
     | 
    
         
             
                  response = client.request(:post, ::File.join(path, "restore"))
         
     | 
| 
       9 
53 
     | 
    
         
             
                  process(response.parsed)
         
     | 
| 
       10 
54 
     | 
    
         
             
                  self
         
     | 
| 
       11 
55 
     | 
    
         
             
                end
         
     | 
| 
       12 
56 
     | 
    
         
             
              end
         
     | 
| 
       13 
     | 
    
         
            -
            end
         
     | 
| 
      
 57 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/bitballoon/deploys.rb
    CHANGED
    
    | 
         @@ -3,5 +3,36 @@ require "bitballoon/deploy" 
     | 
|
| 
       3 
3 
     | 
    
         
             
            module BitBalloon
         
     | 
| 
       4 
4 
     | 
    
         
             
              class Deploys < CollectionProxy
         
     | 
| 
       5 
5 
     | 
    
         
             
                path "/deploys"
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
                def create(attributes)
         
     | 
| 
      
 8 
     | 
    
         
            +
                  if attributes[:dir]
         
     | 
| 
      
 9 
     | 
    
         
            +
                    response = client.request(:post, path,
         
     | 
| 
      
 10 
     | 
    
         
            +
                      :body => JSON.generate({:files => inventory(attributes[:dir])}),
         
     | 
| 
      
 11 
     | 
    
         
            +
                      :headers => {"Content-Type" => "application/json"}
         
     | 
| 
      
 12 
     | 
    
         
            +
                    )
         
     | 
| 
      
 13 
     | 
    
         
            +
                    Deploy.new(client, response.parsed).tap do |deploy|
         
     | 
| 
      
 14 
     | 
    
         
            +
                      deploy.upload_dir(attributes[:dir])
         
     | 
| 
      
 15 
     | 
    
         
            +
                    end
         
     | 
| 
      
 16 
     | 
    
         
            +
                  elsif attributes[:zip]
         
     | 
| 
      
 17 
     | 
    
         
            +
                    response = client.request(:post, path,
         
     | 
| 
      
 18 
     | 
    
         
            +
                      :body => ::File.read(attributes[:zip]),
         
     | 
| 
      
 19 
     | 
    
         
            +
                      :headers => {"Content-Type" => "application/zip"}
         
     | 
| 
      
 20 
     | 
    
         
            +
                    )
         
     | 
| 
      
 21 
     | 
    
         
            +
                    Deploy.new(client, response.parsed)
         
     | 
| 
      
 22 
     | 
    
         
            +
                  else
         
     | 
| 
      
 23 
     | 
    
         
            +
                    raise "Need dir or zip to create a deploy"
         
     | 
| 
      
 24 
     | 
    
         
            +
                  end
         
     | 
| 
      
 25 
     | 
    
         
            +
                end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                private
         
     | 
| 
      
 28 
     | 
    
         
            +
                def inventory(dir)
         
     | 
| 
      
 29 
     | 
    
         
            +
                  files = {}
         
     | 
| 
      
 30 
     | 
    
         
            +
                  Dir[::File.join(dir, "**", "*")].each do |file|
         
     | 
| 
      
 31 
     | 
    
         
            +
                    next unless ::File.file?(file)
         
     | 
| 
      
 32 
     | 
    
         
            +
                    path = ::File.join("/", file[dir.length..-1])
         
     | 
| 
      
 33 
     | 
    
         
            +
                    files[path] = Digest::SHA1.hexdigest(::File.read(file))
         
     | 
| 
      
 34 
     | 
    
         
            +
                  end
         
     | 
| 
      
 35 
     | 
    
         
            +
                  files
         
     | 
| 
      
 36 
     | 
    
         
            +
                end
         
     | 
| 
       6 
37 
     | 
    
         
             
              end
         
     | 
| 
       7 
     | 
    
         
            -
            end
         
     | 
| 
      
 38 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/bitballoon/site.rb
    CHANGED
    
    | 
         @@ -4,32 +4,8 @@ require 'uri' 
     | 
|
| 
       4 
4 
     | 
    
         
             
            module BitBalloon
         
     | 
| 
       5 
5 
     | 
    
         
             
              class Site < Model
         
     | 
| 
       6 
6 
     | 
    
         
             
                fields :id, :state, :premium, :claimed, :name, :custom_domain, :url,
         
     | 
| 
       7 
     | 
    
         
            -
                       :admin_url, :deploy_url, :screenshot_url, :created_at, :updated_at,
         
     | 
| 
       8 
     | 
    
         
            -
                       :password, :notification_email, :user_id, : 
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
                def upload_dir(dir)
         
     | 
| 
       11 
     | 
    
         
            -
                  return unless state == "uploading"
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
                  shas = Hash.new { [] }
         
     | 
| 
       14 
     | 
    
         
            -
                  glob = ::File.join(dir, "**", "*")
         
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
                  Dir.glob(glob) do |file|
         
     | 
| 
       17 
     | 
    
         
            -
                    next unless ::File.file?(file)
         
     | 
| 
       18 
     | 
    
         
            -
                    pathname = ::File.join("/", file[dir.length..-1])
         
     | 
| 
       19 
     | 
    
         
            -
                    next if pathname.match(/(^\/?__MACOSX\/|\/\.)/)
         
     | 
| 
       20 
     | 
    
         
            -
                    sha = Digest::SHA1.hexdigest(::File.read(file))
         
     | 
| 
       21 
     | 
    
         
            -
                    shas[sha] = shas[sha] + [pathname]
         
     | 
| 
       22 
     | 
    
         
            -
                  end
         
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
                  (required || []).each do |sha|
         
     | 
| 
       26 
     | 
    
         
            -
                    shas[sha].each do |pathname|
         
     | 
| 
       27 
     | 
    
         
            -
                      client.request(:put, ::File.join(path, "files", URI.encode(pathname)), :body => ::File.read(::File.join(dir, pathname)), :headers => {"Content-Type" => "application/octet-stream"})
         
     | 
| 
       28 
     | 
    
         
            -
                    end
         
     | 
| 
       29 
     | 
    
         
            -
                  end
         
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
                  refresh
         
     | 
| 
       32 
     | 
    
         
            -
                end
         
     | 
| 
      
 7 
     | 
    
         
            +
                       :admin_url, :deploy_id, :deploy_url, :screenshot_url, :created_at, :updated_at,
         
     | 
| 
      
 8 
     | 
    
         
            +
                       :password, :notification_email, :user_id, :error_message, :required
         
     | 
| 
       33 
9 
     | 
    
         | 
| 
       34 
10 
     | 
    
         
             
                def ready?
         
     | 
| 
       35 
11 
     | 
    
         
             
                  state == "current"
         
     | 
| 
         @@ -39,25 +15,19 @@ module BitBalloon 
     | 
|
| 
       39 
15 
     | 
    
         
             
                  state == "error"
         
     | 
| 
       40 
16 
     | 
    
         
             
                end
         
     | 
| 
       41 
17 
     | 
    
         | 
| 
       42 
     | 
    
         
            -
                def wait_for_ready(timeout = 900)
         
     | 
| 
       43 
     | 
    
         
            -
                   
     | 
| 
       44 
     | 
    
         
            -
                   
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
       46 
     | 
    
         
            -
                    refresh
         
     | 
| 
       47 
     | 
    
         
            -
                    raise "Error processing site: #{error_message}" if error?
         
     | 
| 
       48 
     | 
    
         
            -
                    yield(self) if block_given?
         
     | 
| 
       49 
     | 
    
         
            -
                    raise "Timeout while waiting for ready" if Time.now - start > timeout
         
     | 
| 
       50 
     | 
    
         
            -
                  end
         
     | 
| 
      
 18 
     | 
    
         
            +
                def wait_for_ready(timeout = 900, &block)
         
     | 
| 
      
 19 
     | 
    
         
            +
                  deploy = deploys.get(deploy_id)
         
     | 
| 
      
 20 
     | 
    
         
            +
                  raise "Error fetching deploy #{deploy_id}" unless deploy
         
     | 
| 
      
 21 
     | 
    
         
            +
                  deploy.wait_for_ready(timeout, &block)
         
     | 
| 
       51 
22 
     | 
    
         
             
                  self
         
     | 
| 
       52 
23 
     | 
    
         
             
                end
         
     | 
| 
       53 
24 
     | 
    
         | 
| 
       54 
25 
     | 
    
         
             
                def update(attributes)
         
     | 
| 
      
 26 
     | 
    
         
            +
                  response = client.request(:put, path, :body => mutable_attributes(attributes))
         
     | 
| 
      
 27 
     | 
    
         
            +
                  process(response.parsed)
         
     | 
| 
       55 
28 
     | 
    
         
             
                  if attributes[:zip] || attributes[:dir]
         
     | 
| 
       56 
     | 
    
         
            -
                     
     | 
| 
       57 
     | 
    
         
            -
                     
     | 
| 
       58 
     | 
    
         
            -
                  else
         
     | 
| 
       59 
     | 
    
         
            -
                    response = client.request(:put, path, :body => mutable_attributes(attributes))
         
     | 
| 
       60 
     | 
    
         
            -
                    process(response.parsed)
         
     | 
| 
      
 29 
     | 
    
         
            +
                    deploy = deploys.create(attributes)
         
     | 
| 
      
 30 
     | 
    
         
            +
                    self.deploy_id = deploy.id
         
     | 
| 
       61 
31 
     | 
    
         
             
                  end
         
     | 
| 
       62 
32 
     | 
    
         
             
                  self
         
     | 
| 
       63 
33 
     | 
    
         
             
                end
         
     | 
    
        data/lib/bitballoon/sites.rb
    CHANGED
    
    | 
         @@ -6,35 +6,13 @@ module BitBalloon 
     | 
|
| 
       6 
6 
     | 
    
         
             
                path "/sites"
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
       8 
8 
     | 
    
         
             
                def create(attributes = {})
         
     | 
| 
       9 
     | 
    
         
            -
                   
     | 
| 
       10 
     | 
    
         
            -
                   
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
                    response = client.request(method, path, :body => JSON.generate(attributes.merge(:files => inventory(dir))), :headers => {"Content-Type" => "application/json"})
         
     | 
| 
       15 
     | 
    
         
            -
                    Site.new(client, response.parsed).tap do |site|
         
     | 
| 
       16 
     | 
    
         
            -
                      site.upload_dir(dir)
         
     | 
| 
      
 9 
     | 
    
         
            +
                  response = client.request(:post, path, :body => Site.new(client, {}).send(:mutable_attributes, attributes))
         
     | 
| 
      
 10 
     | 
    
         
            +
                  Site.new(client, response.parsed).tap do |site|
         
     | 
| 
      
 11 
     | 
    
         
            +
                    if attributes[:zip] || attributes[:dir]
         
     | 
| 
      
 12 
     | 
    
         
            +
                      deploy = site.deploys.create(attributes)
         
     | 
| 
      
 13 
     | 
    
         
            +
                      site.deploy_id = deploy.id
         
     | 
| 
       17 
14 
     | 
    
         
             
                    end
         
     | 
| 
       18 
     | 
    
         
            -
                  elsif attributes[:zip]
         
     | 
| 
       19 
     | 
    
         
            -
                    zip = attributes.delete(:zip)
         
     | 
| 
       20 
     | 
    
         
            -
                    ::File.open(zip) do |file|
         
     | 
| 
       21 
     | 
    
         
            -
                      response = client.request(method, path, :body => attributes.merge(
         
     | 
| 
       22 
     | 
    
         
            -
                        :zip => Faraday::UploadIO.new(file, 'application/zip')
         
     | 
| 
       23 
     | 
    
         
            -
                      ))
         
     | 
| 
       24 
     | 
    
         
            -
                      Site.new(client, response.parsed)
         
     | 
| 
       25 
     | 
    
         
            -
                    end
         
     | 
| 
       26 
     | 
    
         
            -
                  end
         
     | 
| 
       27 
     | 
    
         
            -
                end
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
                private
         
     | 
| 
       30 
     | 
    
         
            -
                def inventory(dir)
         
     | 
| 
       31 
     | 
    
         
            -
                  files = {}
         
     | 
| 
       32 
     | 
    
         
            -
                  Dir[::File.join(dir, "**", "*")].each do |file|
         
     | 
| 
       33 
     | 
    
         
            -
                    next unless ::File.file?(file)
         
     | 
| 
       34 
     | 
    
         
            -
                    path = ::File.join("/", file[dir.length..-1])
         
     | 
| 
       35 
     | 
    
         
            -
                    files[path] = Digest::SHA1.hexdigest(::File.read(file))
         
     | 
| 
       36 
15 
     | 
    
         
             
                  end
         
     | 
| 
       37 
     | 
    
         
            -
                  files
         
     | 
| 
       38 
16 
     | 
    
         
             
                end
         
     | 
| 
       39 
17 
     | 
    
         
             
              end
         
     | 
| 
       40 
     | 
    
         
            -
            end
         
     | 
| 
      
 18 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/bitballoon/version.rb
    CHANGED
    
    
    
        data/test/sites_test.rb
    CHANGED
    
    | 
         @@ -17,23 +17,29 @@ class SitesTest < MiniTest::Unit::TestCase 
     | 
|
| 
       17 
17 
     | 
    
         
             
                index_sha = Digest::SHA1.hexdigest(::File.read(::File.join(dir, "index.html")))
         
     | 
| 
       18 
18 
     | 
    
         | 
| 
       19 
19 
     | 
    
         
             
                stub_request(:post, "https://www.bitballoon.com/api/v1/sites")
         
     | 
| 
      
 20 
     | 
    
         
            +
                  .to_return {|request|
         
     | 
| 
      
 21 
     | 
    
         
            +
                    {
         
     | 
| 
      
 22 
     | 
    
         
            +
                      :headers => {'Content-Type' => 'application/json'},
         
     | 
| 
      
 23 
     | 
    
         
            +
                      :body => JSON.generate({:id => "1234"})
         
     | 
| 
      
 24 
     | 
    
         
            +
                    }
         
     | 
| 
      
 25 
     | 
    
         
            +
                  }
         
     | 
| 
      
 26 
     | 
    
         
            +
                stub_request(:post, "https://www.bitballoon.com/api/v1/sites/1234/deploys")
         
     | 
| 
       20 
27 
     | 
    
         
             
                  .to_return {|request|
         
     | 
| 
       21 
28 
     | 
    
         
             
                    body = JSON.parse(request.body)
         
     | 
| 
       22 
29 
     | 
    
         
             
                    {
         
     | 
| 
       23 
30 
     | 
    
         
             
                      :headers => {'Content-Type' => 'application/json'},
         
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
      
 31 
     | 
    
         
            +
                      :body => JSON.generate({:id => "2345", :state => "uploading", :required => [index_sha]})
         
     | 
| 
       25 
32 
     | 
    
         
             
                    }
         
     | 
| 
       26 
33 
     | 
    
         
             
                  }
         
     | 
| 
       27 
     | 
    
         
            -
                stub_request(:put, "https://www.bitballoon.com/api/v1/ 
     | 
| 
       28 
     | 
    
         
            -
                stub_request(:get, "https://www.bitballoon.com/api/v1/ 
     | 
| 
       29 
     | 
    
         
            -
                  .to_return(:headers => {'Content-Type' => 'application/json'}, :body => {:id => " 
     | 
| 
      
 34 
     | 
    
         
            +
                stub_request(:put, "https://www.bitballoon.com/api/v1/deploys/2345/files/index.html")
         
     | 
| 
      
 35 
     | 
    
         
            +
                stub_request(:get, "https://www.bitballoon.com/api/v1/deploys/2345")
         
     | 
| 
      
 36 
     | 
    
         
            +
                  .to_return(:headers => {'Content-Type' => 'application/json'}, :body => {:id => "2345", :state => "processing"})
         
     | 
| 
       30 
37 
     | 
    
         | 
| 
       31 
38 
     | 
    
         
             
                site = client.sites.create(:dir => dir)
         
     | 
| 
       32 
39 
     | 
    
         | 
| 
       33 
     | 
    
         
            -
                assert_equal 'processing', site.state
         
     | 
| 
       34 
40 
     | 
    
         
             
                assert_equal index_sha, body['files']['/index.html']
         
     | 
| 
       35 
41 
     | 
    
         | 
| 
       36 
     | 
    
         
            -
                assert_requested :put, "https://www.bitballoon.com/api/v1/ 
     | 
| 
      
 42 
     | 
    
         
            +
                assert_requested :put, "https://www.bitballoon.com/api/v1/deploys/2345/files/index.html",
         
     | 
| 
       37 
43 
     | 
    
         
             
                  :body => ::File.read(::File.join(dir, "index.html")), :times => 1    # ===> Success
         
     | 
| 
       38 
44 
     | 
    
         
             
              end
         
     | 
| 
       39 
45 
     | 
    
         | 
| 
         @@ -41,12 +47,20 @@ class SitesTest < MiniTest::Unit::TestCase 
     | 
|
| 
       41 
47 
     | 
    
         
             
                stub_request(:post, "https://www.bitballoon.com/api/v1/sites")
         
     | 
| 
       42 
48 
     | 
    
         
             
                  .to_return({
         
     | 
| 
       43 
49 
     | 
    
         
             
                    :headers => {'Content-Type' => 'application/json'},
         
     | 
| 
       44 
     | 
    
         
            -
                    :body => JSON.generate({:id => "1234" 
     | 
| 
      
 50 
     | 
    
         
            +
                    :body => JSON.generate({:id => "1234"})
         
     | 
| 
       45 
51 
     | 
    
         
             
                  })
         
     | 
| 
       46 
52 
     | 
    
         | 
| 
      
 53 
     | 
    
         
            +
                stub_request(:post, "https://www.bitballoon.com/api/v1/sites/1234/deploys")
         
     | 
| 
      
 54 
     | 
    
         
            +
                .to_return {|request|
         
     | 
| 
      
 55 
     | 
    
         
            +
                  {
         
     | 
| 
      
 56 
     | 
    
         
            +
                    :headers => {'Content-Type' => 'application/json'},
         
     | 
| 
      
 57 
     | 
    
         
            +
                    :body => JSON.generate({:id => "2345", :state => "uploading", :required => []})
         
     | 
| 
      
 58 
     | 
    
         
            +
                  }
         
     | 
| 
      
 59 
     | 
    
         
            +
                }
         
     | 
| 
       47 
60 
     | 
    
         
             
                zip = ::File.expand_path("../files/site-dir.zip", __FILE__)
         
     | 
| 
       48 
61 
     | 
    
         
             
                site = client.sites.create(:zip => zip)
         
     | 
| 
       49 
62 
     | 
    
         | 
| 
       50 
     | 
    
         
            -
                 
     | 
| 
      
 63 
     | 
    
         
            +
                assert_requested :post, "https://www.bitballoon.com/api/v1/sites/1234/deploys",
         
     | 
| 
      
 64 
     | 
    
         
            +
                  :body => ::File.read(zip), :times => 1
         
     | 
| 
       51 
65 
     | 
    
         
             
              end
         
     | 
| 
       52 
     | 
    
         
            -
            end
         
     | 
| 
      
 66 
     | 
    
         
            +
            end
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,83 +1,83 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: bitballoon
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.2.0
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Mathias Biilmann Christensen
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2014- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2014-06-02 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: oauth2
         
     | 
| 
       15 
15 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
       16 
16 
     | 
    
         
             
                requirements:
         
     | 
| 
       17 
     | 
    
         
            -
                - -  
     | 
| 
      
 17 
     | 
    
         
            +
                - - '>='
         
     | 
| 
       18 
18 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       19 
19 
     | 
    
         
             
                    version: 0.9.2
         
     | 
| 
       20 
20 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       21 
21 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       22 
22 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       23 
23 
     | 
    
         
             
                requirements:
         
     | 
| 
       24 
     | 
    
         
            -
                - -  
     | 
| 
      
 24 
     | 
    
         
            +
                - - '>='
         
     | 
| 
       25 
25 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       26 
26 
     | 
    
         
             
                    version: 0.9.2
         
     | 
| 
       27 
27 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       28 
28 
     | 
    
         
             
              name: slop
         
     | 
| 
       29 
29 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
       30 
30 
     | 
    
         
             
                requirements:
         
     | 
| 
       31 
     | 
    
         
            -
                - -  
     | 
| 
      
 31 
     | 
    
         
            +
                - - '>='
         
     | 
| 
       32 
32 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       33 
33 
     | 
    
         
             
                    version: '0'
         
     | 
| 
       34 
34 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       35 
35 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       36 
36 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       37 
37 
     | 
    
         
             
                requirements:
         
     | 
| 
       38 
     | 
    
         
            -
                - -  
     | 
| 
      
 38 
     | 
    
         
            +
                - - '>='
         
     | 
| 
       39 
39 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       40 
40 
     | 
    
         
             
                    version: '0'
         
     | 
| 
       41 
41 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       42 
42 
     | 
    
         
             
              name: highline
         
     | 
| 
       43 
43 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
       44 
44 
     | 
    
         
             
                requirements:
         
     | 
| 
       45 
     | 
    
         
            -
                - -  
     | 
| 
      
 45 
     | 
    
         
            +
                - - '>='
         
     | 
| 
       46 
46 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       47 
47 
     | 
    
         
             
                    version: '0'
         
     | 
| 
       48 
48 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       49 
49 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       50 
50 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       51 
51 
     | 
    
         
             
                requirements:
         
     | 
| 
       52 
     | 
    
         
            -
                - -  
     | 
| 
      
 52 
     | 
    
         
            +
                - - '>='
         
     | 
| 
       53 
53 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       54 
54 
     | 
    
         
             
                    version: '0'
         
     | 
| 
       55 
55 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       56 
56 
     | 
    
         
             
              name: minitest
         
     | 
| 
       57 
57 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
       58 
58 
     | 
    
         
             
                requirements:
         
     | 
| 
       59 
     | 
    
         
            -
                - -  
     | 
| 
      
 59 
     | 
    
         
            +
                - - '>='
         
     | 
| 
       60 
60 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       61 
61 
     | 
    
         
             
                    version: '0'
         
     | 
| 
       62 
62 
     | 
    
         
             
              type: :development
         
     | 
| 
       63 
63 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       64 
64 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       65 
65 
     | 
    
         
             
                requirements:
         
     | 
| 
       66 
     | 
    
         
            -
                - -  
     | 
| 
      
 66 
     | 
    
         
            +
                - - '>='
         
     | 
| 
       67 
67 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       68 
68 
     | 
    
         
             
                    version: '0'
         
     | 
| 
       69 
69 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       70 
70 
     | 
    
         
             
              name: webmock
         
     | 
| 
       71 
71 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
       72 
72 
     | 
    
         
             
                requirements:
         
     | 
| 
       73 
     | 
    
         
            -
                - -  
     | 
| 
      
 73 
     | 
    
         
            +
                - - '>='
         
     | 
| 
       74 
74 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       75 
75 
     | 
    
         
             
                    version: '0'
         
     | 
| 
       76 
76 
     | 
    
         
             
              type: :development
         
     | 
| 
       77 
77 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       78 
78 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       79 
79 
     | 
    
         
             
                requirements:
         
     | 
| 
       80 
     | 
    
         
            -
                - -  
     | 
| 
      
 80 
     | 
    
         
            +
                - - '>='
         
     | 
| 
       81 
81 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       82 
82 
     | 
    
         
             
                    version: '0'
         
     | 
| 
       83 
83 
     | 
    
         
             
            description: API Client for BitBalloon
         
     | 
| 
         @@ -136,17 +136,17 @@ require_paths: 
     | 
|
| 
       136 
136 
     | 
    
         
             
            - lib
         
     | 
| 
       137 
137 
     | 
    
         
             
            required_ruby_version: !ruby/object:Gem::Requirement
         
     | 
| 
       138 
138 
     | 
    
         
             
              requirements:
         
     | 
| 
       139 
     | 
    
         
            -
              - -  
     | 
| 
      
 139 
     | 
    
         
            +
              - - '>='
         
     | 
| 
       140 
140 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       141 
141 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       142 
142 
     | 
    
         
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         
     | 
| 
       143 
143 
     | 
    
         
             
              requirements:
         
     | 
| 
       144 
     | 
    
         
            -
              - -  
     | 
| 
      
 144 
     | 
    
         
            +
              - - '>='
         
     | 
| 
       145 
145 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       146 
146 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       147 
147 
     | 
    
         
             
            requirements: []
         
     | 
| 
       148 
148 
     | 
    
         
             
            rubyforge_project: 
         
     | 
| 
       149 
     | 
    
         
            -
            rubygems_version: 2. 
     | 
| 
      
 149 
     | 
    
         
            +
            rubygems_version: 2.0.2
         
     | 
| 
       150 
150 
     | 
    
         
             
            signing_key: 
         
     | 
| 
       151 
151 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       152 
152 
     | 
    
         
             
            summary: API Client for BitBalloon
         
     |