picasa 0.5.4 → 0.6.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.
- data/.gitignore +2 -0
- data/.travis.yml +4 -9
- data/Gemfile +4 -4
- data/README.md +4 -12
- data/extra/Thorfile +0 -3
- data/lib/picasa.rb +1 -8
- data/lib/picasa/api/album.rb +11 -11
- data/lib/picasa/api/base.rb +0 -3
- data/lib/picasa/api/comment.rb +6 -8
- data/lib/picasa/api/photo.rb +9 -9
- data/lib/picasa/api/tag.rb +6 -8
- data/lib/picasa/client.rb +2 -2
- data/lib/picasa/connection.rb +14 -51
- data/lib/picasa/exceptions.rb +1 -0
- data/lib/picasa/file.rb +8 -0
- data/lib/picasa/http.rb +28 -0
- data/lib/picasa/presenter/album.rb +15 -15
- data/lib/picasa/presenter/album_list.rb +10 -10
- data/lib/picasa/presenter/comment.rb +6 -6
- data/lib/picasa/presenter/comment_list.rb +10 -10
- data/lib/picasa/presenter/media.rb +5 -5
- data/lib/picasa/presenter/photo.rb +15 -15
- data/lib/picasa/presenter/tag.rb +3 -3
- data/lib/picasa/presenter/tag_list.rb +10 -10
- data/lib/picasa/utils.rb +11 -13
- data/lib/picasa/version.rb +1 -1
- data/picasa.gemspec +2 -1
- data/test/api/album_test.rb +163 -20
- data/test/api/comment_test.rb +95 -10
- data/test/api/photo_test.rb +27 -11
- data/test/api/tag_test.rb +84 -13
- data/test/cassettes/album-404.yml +52 -0
- data/test/cassettes/album-create.yml +107 -0
- data/test/cassettes/album-destroy.yml +55 -0
- data/test/cassettes/album-list.yml +85 -0
- data/test/cassettes/album-show.yml +123 -0
- data/test/cassettes/auth-failed.yml +50 -0
- data/test/cassettes/auth-success.yml +64 -0
- data/test/cassettes/comment-400.yml +56 -0
- data/test/cassettes/comment-create.yml +88 -0
- data/test/cassettes/comment-destroy.yml +53 -0
- data/test/cassettes/comment-list.yml +87 -0
- data/test/cassettes/photo-412.yml +58 -0
- data/test/cassettes/photo-create.yml +1908 -0
- data/test/cassettes/photo-destroy.yml +55 -0
- data/test/cassettes/tag-create.yml +85 -0
- data/test/cassettes/tag-destroy.yml +53 -0
- data/test/cassettes/tag-list.yml +79 -0
- data/test/client_test.rb +10 -10
- data/test/connection_test.rb +0 -35
- data/test/helper.rb +21 -7
- data/test/utils_test.rb +0 -6
- metadata +37 -40
- data/test/fixtures/album/album-create.txt +0 -21
- data/test/fixtures/album/album-list-with-tag.txt +0 -105
- data/test/fixtures/album/album-list.txt +0 -105
- data/test/fixtures/album/album-show-with-max-results.txt +0 -131
- data/test/fixtures/album/album-show-with-tag-and-many-photos.txt +0 -156
- data/test/fixtures/album/album-show-with-tag-and-one-photo.txt +0 -105
- data/test/fixtures/album/album-show.txt +0 -169
- data/test/fixtures/auth/success.txt +0 -14
- data/test/fixtures/comment/comment-list.txt +0 -65
- data/test/fixtures/exceptions/forbidden.txt +0 -12
- data/test/fixtures/exceptions/not_found.txt +0 -14
- data/test/fixtures/exceptions/precondition_failed.txt +0 -14
- data/test/fixtures/json.txt +0 -435
- data/test/fixtures/photo/photo-created.txt +0 -21
- data/test/fixtures/photo/photo-list-all-with-q.txt +0 -556
- data/test/fixtures/photo/photo-list-all.txt +0 -623
- data/test/fixtures/photo/photo-list-user.txt +0 -388
- data/test/fixtures/presenters/album_list.xml +0 -88
- data/test/fixtures/presenters/album_show.xml +0 -152
- data/test/fixtures/presenters/album_show_with_one_photo.xml +0 -88
- data/test/fixtures/presenters/comment_list.xml +0 -48
- data/test/fixtures/presenters/tag_list.xml +0 -51
- data/test/fixtures/tag/tag-list.txt +0 -68
- data/test/presenter/album_list_test.rb +0 -67
- data/test/presenter/album_test.rb +0 -189
- data/test/presenter/author_test.rb +0 -17
- data/test/presenter/base_test.rb +0 -50
- data/test/presenter/comment_list_test.rb +0 -67
- data/test/presenter/comment_test.rb +0 -56
- data/test/presenter/content_test.rb +0 -18
- data/test/presenter/link_test.rb +0 -21
- data/test/presenter/media_test.rb +0 -29
- data/test/presenter/photo_test.rb +0 -90
- data/test/presenter/tag_list_test.rb +0 -67
- data/test/presenter/tag_test.rb +0 -48
- data/test/presenter/thumbnail_test.rb +0 -24
    
        data/.gitignore
    CHANGED
    
    
    
        data/.travis.yml
    CHANGED
    
    | @@ -3,13 +3,8 @@ notifications: | |
| 3 3 | 
             
            rvm:
         | 
| 4 4 | 
             
              - 1.8.7
         | 
| 5 5 | 
             
              - 1.9.3
         | 
| 6 | 
            -
            env:
         | 
| 7 | 
            -
              - XML_PARSER=rexml
         | 
| 8 | 
            -
              - XML_PARSER=nokogiri
         | 
| 9 | 
            -
              - XML_PARSER=libxml
         | 
| 10 | 
            -
              # does not work yet
         | 
| 11 | 
            -
              # - XML_PARSER=ox
         | 
| 12 6 |  | 
| 13 | 
            -
             | 
| 14 | 
            -
               | 
| 15 | 
            -
             | 
| 7 | 
            +
            env:
         | 
| 8 | 
            +
              - JSON_PARSER=oj
         | 
| 9 | 
            +
              - JSON_PARSER=yajl
         | 
| 10 | 
            +
              - JSON_PARSER=json_pure
         | 
    
        data/Gemfile
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -37,7 +37,7 @@ client = Picasa::Client.new(user_id: "some.user@gmail.com", password: "secret") | |
| 37 37 | 
             
            Or by setting custom authorization header, i.e. taken from OAuth authentication:
         | 
| 38 38 |  | 
| 39 39 | 
             
            ```ruby
         | 
| 40 | 
            -
            client = Picasa::Client.new(user_id: "some.user@gmail.com", authorization_header: " | 
| 40 | 
            +
            client = Picasa::Client.new(user_id: "some.user@gmail.com", authorization_header: "Bearer access-token")
         | 
| 41 41 | 
             
            ```
         | 
| 42 42 |  | 
| 43 43 | 
             
            ### Proxy
         | 
| @@ -78,18 +78,9 @@ If you run out of quota and want to resize images to fit Picasa free storage lim | |
| 78 78 | 
             
            thor imagery:resize path-to-folder-with-photos
         | 
| 79 79 | 
             
            ```
         | 
| 80 80 |  | 
| 81 | 
            -
             | 
| 81 | 
            +
            ### Boost
         | 
| 82 82 |  | 
| 83 | 
            -
             | 
| 84 | 
            -
             | 
| 85 | 
            -
            Using `rexml` parser wont return `etag` attribute properly.
         | 
| 86 | 
            -
             | 
| 87 | 
            -
            I recommend to use `libxml` or `nokogiri`.
         | 
| 88 | 
            -
            You can set it by:
         | 
| 89 | 
            -
             | 
| 90 | 
            -
            ```ruby
         | 
| 91 | 
            -
            MultiXml.parser = :libxml
         | 
| 92 | 
            -
            ```
         | 
| 83 | 
            +
            Picasa uses gzipped requests to speedup fetching results. Benchmarks are available on [Vinicius Teles gist](https://gist.github.com/4012466)
         | 
| 93 84 |  | 
| 94 85 | 
             
            ## Continuous Integration
         | 
| 95 86 | 
             
            [](http://travis-ci.org/morgoth/picasa)
         | 
| @@ -102,6 +93,7 @@ MultiXml.parser = :libxml | |
| 102 93 | 
             
            * [Javier Guerra](https://github.com/javierg)
         | 
| 103 94 | 
             
            * [Eiichi Takebuchi](https://github.com/GRGSIBERIA)
         | 
| 104 95 | 
             
            * [TADA Tadashi](https://github.com/tdtds)
         | 
| 96 | 
            +
            * [Vinicius Teles](https://github.com/viniciusteles)
         | 
| 105 97 |  | 
| 106 98 | 
             
            ## Copyright
         | 
| 107 99 |  | 
    
        data/extra/Thorfile
    CHANGED
    
    
    
        data/lib/picasa.rb
    CHANGED
    
    | @@ -1,8 +1,7 @@ | |
| 1 | 
            -
            require "multi_xml"
         | 
| 2 | 
            -
             | 
| 3 1 | 
             
            require "picasa/version"
         | 
| 4 2 | 
             
            require "picasa/utils"
         | 
| 5 3 | 
             
            require "picasa/exceptions"
         | 
| 4 | 
            +
            require "picasa/http"
         | 
| 6 5 | 
             
            require "picasa/connection"
         | 
| 7 6 | 
             
            require "picasa/client"
         | 
| 8 7 | 
             
            require "picasa/file"
         | 
| @@ -25,9 +24,3 @@ require "picasa/presenter/photo" | |
| 25 24 | 
             
            require "picasa/presenter/tag"
         | 
| 26 25 | 
             
            require "picasa/presenter/tag_list"
         | 
| 27 26 | 
             
            require "picasa/presenter/thumbnail"
         | 
| 28 | 
            -
             | 
| 29 | 
            -
            module Picasa
         | 
| 30 | 
            -
              API_URL      = "https://picasaweb.google.com"
         | 
| 31 | 
            -
              API_AUTH_URL = "https://www.google.com"
         | 
| 32 | 
            -
              API_VERSION  = "2"
         | 
| 33 | 
            -
            end
         | 
    
        data/lib/picasa/api/album.rb
    CHANGED
    
    | @@ -13,10 +13,10 @@ module Picasa | |
| 13 13 | 
             
                  #
         | 
| 14 14 | 
             
                  # @return [Presenter::AlbumList]
         | 
| 15 15 | 
             
                  def list(options = {})
         | 
| 16 | 
            -
                     | 
| 17 | 
            -
                    response = Connection.new.get(:path =>  | 
| 16 | 
            +
                    path = "/data/feed/api/user/#{user_id}"
         | 
| 17 | 
            +
                    response = Connection.new.get(:path => path, :query => options, :headers => auth_header)
         | 
| 18 18 |  | 
| 19 | 
            -
                    Presenter::AlbumList.new( | 
| 19 | 
            +
                    Presenter::AlbumList.new(response.parsed_response["feed"])
         | 
| 20 20 | 
             
                  end
         | 
| 21 21 |  | 
| 22 22 | 
             
                  # Returns photo list for given album
         | 
| @@ -30,10 +30,10 @@ module Picasa | |
| 30 30 | 
             
                  # @return [Presenter::Album]
         | 
| 31 31 | 
             
                  # @raise [NotFoundError] raised when album cannot be found
         | 
| 32 32 | 
             
                  def show(album_id, options = {})
         | 
| 33 | 
            -
                     | 
| 34 | 
            -
                    response = Connection.new.get(:path =>  | 
| 33 | 
            +
                    path = "/data/feed/api/user/#{user_id}/albumid/#{album_id}"
         | 
| 34 | 
            +
                    response = Connection.new.get(:path => path, :query => options, :headers => auth_header)
         | 
| 35 35 |  | 
| 36 | 
            -
                    Presenter::Album.new( | 
| 36 | 
            +
                    Presenter::Album.new(response.parsed_response["feed"])
         | 
| 37 37 | 
             
                  end
         | 
| 38 38 |  | 
| 39 39 | 
             
                  # Creates album
         | 
| @@ -52,10 +52,10 @@ module Picasa | |
| 52 52 | 
             
                    params[:access] ||= "private"
         | 
| 53 53 |  | 
| 54 54 | 
             
                    template = Template.new(:new_album, params)
         | 
| 55 | 
            -
                     | 
| 56 | 
            -
                    response = Connection.new.post(:path =>  | 
| 55 | 
            +
                    path = "/data/feed/api/user/#{user_id}"
         | 
| 56 | 
            +
                    response = Connection.new.post(:path => path, :body => template.render, :headers => auth_header)
         | 
| 57 57 |  | 
| 58 | 
            -
                    Presenter::Album.new( | 
| 58 | 
            +
                    Presenter::Album.new(response.parsed_response["entry"])
         | 
| 59 59 | 
             
                  end
         | 
| 60 60 |  | 
| 61 61 | 
             
                  # Destroys given album
         | 
| @@ -69,8 +69,8 @@ module Picasa | |
| 69 69 | 
             
                  # @raise [PreconditionFailedError] raised when ETag does not match
         | 
| 70 70 | 
             
                  def destroy(album_id, options = {})
         | 
| 71 71 | 
             
                    headers = auth_header.merge({"If-Match" => options.fetch(:etag, "*")})
         | 
| 72 | 
            -
                     | 
| 73 | 
            -
                    Connection.new.delete(:path =>  | 
| 72 | 
            +
                    path = "/data/entry/api/user/#{user_id}/albumid/#{album_id}"
         | 
| 73 | 
            +
                    Connection.new.delete(:path => path, :headers => headers)
         | 
| 74 74 | 
             
                    true
         | 
| 75 75 | 
             
                  end
         | 
| 76 76 | 
             
                  alias :delete :destroy
         | 
    
        data/lib/picasa/api/base.rb
    CHANGED
    
    | @@ -7,9 +7,6 @@ module Picasa | |
| 7 7 | 
             
                  # @option credentials [String] :user_id google username/email
         | 
| 8 8 | 
             
                  # @option credentials [String] :authorization_header header for authenticating requests
         | 
| 9 9 | 
             
                  def initialize(credentials = {})
         | 
| 10 | 
            -
                    if MultiXml.parser.to_s == "MultiXml::Parsers::Ox"
         | 
| 11 | 
            -
                      raise StandardError, "MultiXml parser is set to :ox - picasa gem will not work with it currently, use one of: :libxml, :nokogiri, :rexml"
         | 
| 12 | 
            -
                    end
         | 
| 13 10 | 
             
                    @user_id  = credentials.fetch(:user_id)
         | 
| 14 11 | 
             
                    @authorization_header = credentials[:authorization_header]
         | 
| 15 12 | 
             
                  end
         | 
    
        data/lib/picasa/api/comment.rb
    CHANGED
    
    | @@ -19,10 +19,9 @@ module Picasa | |
| 19 19 | 
             
                    path << "/albumid/#{album_id}" if album_id
         | 
| 20 20 | 
             
                    path << "/photoid/#{photo_id}" if photo_id
         | 
| 21 21 |  | 
| 22 | 
            -
                     | 
| 23 | 
            -
                    response = Connection.new.get(:path => uri.path, :query => options.merge(:kind => "comment"), :headers => auth_header)
         | 
| 22 | 
            +
                    response = Connection.new.get(:path => path, :query => options.merge(:kind => "comment"), :headers => auth_header)
         | 
| 24 23 |  | 
| 25 | 
            -
                    Presenter::CommentList.new( | 
| 24 | 
            +
                    Presenter::CommentList.new(response.parsed_response["feed"])
         | 
| 26 25 | 
             
                  end
         | 
| 27 26 |  | 
| 28 27 | 
             
                  # Creates a comment for a photo.
         | 
| @@ -42,10 +41,9 @@ module Picasa | |
| 42 41 |  | 
| 43 42 | 
             
                    template = Template.new("new_comment", params)
         | 
| 44 43 |  | 
| 45 | 
            -
                     | 
| 46 | 
            -
                    response = Connection.new.post(:path => uri.path, :body => template.render, :headers => auth_header)
         | 
| 44 | 
            +
                    response = Connection.new.post(:path => path, :body => template.render, :headers => auth_header)
         | 
| 47 45 |  | 
| 48 | 
            -
                    Presenter::Comment.new( | 
| 46 | 
            +
                    Presenter::Comment.new(response.parsed_response["entry"])
         | 
| 49 47 | 
             
                  end
         | 
| 50 48 |  | 
| 51 49 | 
             
                  # Removes a comment from given photo.
         | 
| @@ -60,8 +58,8 @@ module Picasa | |
| 60 58 | 
             
                    album_id = params.delete(:album_id) || raise(ArgumentError, "You must specify album_id")
         | 
| 61 59 | 
             
                    photo_id = params.delete(:photo_id) || raise(ArgumentError, "You must specify photo_id")
         | 
| 62 60 |  | 
| 63 | 
            -
                     | 
| 64 | 
            -
                    Connection.new.delete(:path =>  | 
| 61 | 
            +
                    path = "/data/entry/api/user/#{user_id}/albumid/#{album_id}/photoid/#{photo_id}/commentid/#{comment_id}"
         | 
| 62 | 
            +
                    Connection.new.delete(:path => path, :headers => auth_header)
         | 
| 65 63 | 
             
                    true
         | 
| 66 64 | 
             
                  end
         | 
| 67 65 | 
             
                  alias :delete :destroy
         | 
    
        data/lib/picasa/api/photo.rb
    CHANGED
    
    | @@ -13,19 +13,19 @@ module Picasa | |
| 13 13 | 
             
                  # @option options [String] :binary binary data (i.e. File.open("my-photo.png", "rb").read)
         | 
| 14 14 | 
             
                  # @option options [String] :content_type ["image/jpeg", "image/png", "image/bmp", "image/gif"] content type of given image
         | 
| 15 15 | 
             
                  def create(album_id, params = {})
         | 
| 16 | 
            -
                    file = params[:file_path] ? File.new(params.delete(:file_path)) :  | 
| 16 | 
            +
                    file = params[:file_path] ? File.new(params.delete(:file_path)) : File::Null.new
         | 
| 17 17 | 
             
                    params[:boundary]     ||= "===============PicasaRubyGem=="
         | 
| 18 | 
            -
                    params[:title]        ||=  | 
| 19 | 
            -
                    params[:binary]       ||=  | 
| 20 | 
            -
                    params[:content_type] ||=  | 
| 18 | 
            +
                    params[:title]        ||= file.name || raise(ArgumentError.new("title must be specified"))
         | 
| 19 | 
            +
                    params[:binary]       ||= file.binary || raise(ArgumentError.new("binary must be specified"))
         | 
| 20 | 
            +
                    params[:content_type] ||= file.content_type || raise(ArgumentError.new("content_type must be specified"))
         | 
| 21 21 |  | 
| 22 22 | 
             
                    template = Template.new(:new_photo, params)
         | 
| 23 23 | 
             
                    headers = auth_header.merge({"Content-Type" => "multipart/related; boundary=\"#{params[:boundary]}\""})
         | 
| 24 24 |  | 
| 25 | 
            -
                     | 
| 26 | 
            -
                    response = Connection.new.post(:path =>  | 
| 25 | 
            +
                    path = "/data/feed/api/user/#{user_id}/albumid/#{album_id}"
         | 
| 26 | 
            +
                    response = Connection.new.post(:path => path, :body => template.render, :headers => headers)
         | 
| 27 27 |  | 
| 28 | 
            -
                    Presenter::Photo.new( | 
| 28 | 
            +
                    Presenter::Photo.new(response.parsed_response["entry"])
         | 
| 29 29 | 
             
                  end
         | 
| 30 30 |  | 
| 31 31 | 
             
                  # Destroys given photo
         | 
| @@ -40,8 +40,8 @@ module Picasa | |
| 40 40 | 
             
                  # @raise [PreconditionFailedError] raised when ETag does not match
         | 
| 41 41 | 
             
                  def destroy(album_id, photo_id, options = {})
         | 
| 42 42 | 
             
                    headers = auth_header.merge({"If-Match" => options.fetch(:etag, "*")})
         | 
| 43 | 
            -
                     | 
| 44 | 
            -
                    Connection.new.delete(:path =>  | 
| 43 | 
            +
                    path = "/data/entry/api/user/#{user_id}/albumid/#{album_id}/photoid/#{photo_id}"
         | 
| 44 | 
            +
                    Connection.new.delete(:path => path, :headers => headers)
         | 
| 45 45 | 
             
                    true
         | 
| 46 46 | 
             
                  end
         | 
| 47 47 | 
             
                  alias :delete :destroy
         | 
    
        data/lib/picasa/api/tag.rb
    CHANGED
    
    | @@ -19,10 +19,9 @@ module Picasa | |
| 19 19 | 
             
                    path << "/albumid/#{album_id}" if album_id
         | 
| 20 20 | 
             
                    path << "/photoid/#{photo_id}" if photo_id
         | 
| 21 21 |  | 
| 22 | 
            -
                     | 
| 23 | 
            -
                    response = Connection.new.get(:path => uri.path, :query => options.merge(:kind => "tag"), :headers => auth_header)
         | 
| 22 | 
            +
                    response = Connection.new.get(:path => path, :query => options.merge(:kind => "tag"), :headers => auth_header)
         | 
| 24 23 |  | 
| 25 | 
            -
                    Presenter::TagList.new( | 
| 24 | 
            +
                    Presenter::TagList.new(response.parsed_response["feed"])
         | 
| 26 25 | 
             
                  end
         | 
| 27 26 |  | 
| 28 27 | 
             
                  # Creates a tag for a photo.
         | 
| @@ -42,10 +41,9 @@ module Picasa | |
| 42 41 |  | 
| 43 42 | 
             
                    template = Template.new("new_tag", params)
         | 
| 44 43 |  | 
| 45 | 
            -
                     | 
| 46 | 
            -
                    response = Connection.new.post(:path => uri.path, :body => template.render, :headers => auth_header)
         | 
| 44 | 
            +
                    response = Connection.new.post(:path => path, :body => template.render, :headers => auth_header)
         | 
| 47 45 |  | 
| 48 | 
            -
                    Presenter::Tag.new( | 
| 46 | 
            +
                    Presenter::Tag.new(response.parsed_response["entry"])
         | 
| 49 47 | 
             
                  end
         | 
| 50 48 |  | 
| 51 49 | 
             
                  # Removes a tag from given photo.
         | 
| @@ -60,8 +58,8 @@ module Picasa | |
| 60 58 | 
             
                    album_id = params.delete(:album_id) || raise(ArgumentError, "You must specify album_id")
         | 
| 61 59 | 
             
                    photo_id = params.delete(:photo_id) || raise(ArgumentError, "You must specify photo_id")
         | 
| 62 60 |  | 
| 63 | 
            -
                     | 
| 64 | 
            -
                    Connection.new.delete(:path =>  | 
| 61 | 
            +
                    path = "/data/entry/api/user/#{user_id}/albumid/#{album_id}/photoid/#{photo_id}/tag/#{tag_id}"
         | 
| 62 | 
            +
                    Connection.new.delete(:path => path, :headers => auth_header)
         | 
| 65 63 | 
             
                    true
         | 
| 66 64 | 
             
                  end
         | 
| 67 65 | 
             
                  alias :delete :destroy
         | 
    
        data/lib/picasa/client.rb
    CHANGED
    
    | @@ -63,7 +63,7 @@ module Picasa | |
| 63 63 | 
             
                # @return [String]
         | 
| 64 64 | 
             
                def authenticate
         | 
| 65 65 | 
             
                  response = Connection.new.post(
         | 
| 66 | 
            -
                    :host => API_AUTH_URL,
         | 
| 66 | 
            +
                    :host => HTTP::API_AUTH_URL,
         | 
| 67 67 | 
             
                    :headers => {"Content-Type" => "application/x-www-form-urlencoded"},
         | 
| 68 68 | 
             
                    :path => "/accounts/ClientLogin",
         | 
| 69 69 | 
             
                    :body => Utils.inline_query(
         | 
| @@ -71,7 +71,7 @@ module Picasa | |
| 71 71 | 
             
                      "Email"       => user_id,
         | 
| 72 72 | 
             
                      "Passwd"      => password,
         | 
| 73 73 | 
             
                      "service"     => "lh2",
         | 
| 74 | 
            -
                      "source"      => "ruby-gem-v#{VERSION}"
         | 
| 74 | 
            +
                      "source"      => "ruby-gem-picasa-v#{VERSION}"
         | 
| 75 75 | 
             
                    )
         | 
| 76 76 | 
             
                  )
         | 
| 77 77 |  | 
    
        data/lib/picasa/connection.rb
    CHANGED
    
    | @@ -1,6 +1,3 @@ | |
| 1 | 
            -
            require "net/https"
         | 
| 2 | 
            -
            require "uri"
         | 
| 3 | 
            -
             | 
| 4 1 | 
             
            module Picasa
         | 
| 5 2 | 
             
              class Connection
         | 
| 6 3 | 
             
                # @param [Hash] params request arguments
         | 
| @@ -9,13 +6,9 @@ module Picasa | |
| 9 6 | 
             
                # @option params [String] :query request url query
         | 
| 10 7 | 
             
                # @option params [String] :headers request headers
         | 
| 11 8 | 
             
                def get(params = {})
         | 
| 12 | 
            -
                   | 
| 13 | 
            -
                  params[:headers]  | 
| 14 | 
            -
                  params | 
| 15 | 
            -
             | 
| 16 | 
            -
                  path = path_with_query(params[:path], params[:query])
         | 
| 17 | 
            -
                  request = Net::HTTP::Get.new(path, headers.merge(params[:headers]))
         | 
| 18 | 
            -
                  handle_response(http(params[:host]).request(request))
         | 
| 9 | 
            +
                  # FIXME: how to add headers to default ones instead of replacing?
         | 
| 10 | 
            +
                  params[:headers] = Picasa::HTTP.headers.merge(params[:headers]) if params.has_key?(:headers)
         | 
| 11 | 
            +
                  exec_request(params) { |uri, options| HTTP.get(uri, options) }
         | 
| 19 12 | 
             
                end
         | 
| 20 13 |  | 
| 21 14 | 
             
                # @param [Hash] params request arguments
         | 
| @@ -25,12 +18,10 @@ module Picasa | |
| 25 18 | 
             
                # @option params [String] :query request url query
         | 
| 26 19 | 
             
                # @option params [String] :headers request headers
         | 
| 27 20 | 
             
                def post(params = {})
         | 
| 28 | 
            -
                  params[:host]    ||= API_URL
         | 
| 29 21 | 
             
                  params[:headers] ||= {}
         | 
| 30 | 
            -
             | 
| 31 | 
            -
                   | 
| 32 | 
            -
                   | 
| 33 | 
            -
                  handle_response(http(params[:host]).request(request))
         | 
| 22 | 
            +
                  params[:headers]["Content-Type"] ||= "application/atom+xml"
         | 
| 23 | 
            +
                  params[:headers] = Picasa::HTTP.headers.merge(params[:headers])
         | 
| 24 | 
            +
                  exec_request(params) { |uri, options| HTTP.post(uri, options) }
         | 
| 34 25 | 
             
                end
         | 
| 35 26 |  | 
| 36 27 | 
             
                # @param [Hash] params request arguments
         | 
| @@ -39,36 +30,24 @@ module Picasa | |
| 39 30 | 
             
                # @option params [String] :query request url query
         | 
| 40 31 | 
             
                # @option params [String] :headers request headers
         | 
| 41 32 | 
             
                def delete(params = {})
         | 
| 42 | 
            -
                  params[: | 
| 43 | 
            -
                  params | 
| 44 | 
            -
             | 
| 45 | 
            -
                  request = Net::HTTP::Delete.new(params[:path], headers.merge(params[:headers]))
         | 
| 46 | 
            -
                  handle_response(http(params[:host]).request(request))
         | 
| 47 | 
            -
                end
         | 
| 48 | 
            -
             | 
| 49 | 
            -
                def path_with_query(path, query = {})
         | 
| 50 | 
            -
                  path = path + "?" + Utils.inline_query(query) unless query.empty?
         | 
| 51 | 
            -
                  URI.parse(path).to_s
         | 
| 33 | 
            +
                  params[:headers] = Picasa::HTTP.headers.merge(params[:headers]) if params.has_key?(:headers)
         | 
| 34 | 
            +
                  exec_request(params) { |uri, options| HTTP.delete(uri, options) }
         | 
| 52 35 | 
             
                end
         | 
| 53 36 |  | 
| 54 37 | 
             
                private
         | 
| 55 38 |  | 
| 56 | 
            -
                def  | 
| 57 | 
            -
                  uri =  | 
| 58 | 
            -
             | 
| 59 | 
            -
                   | 
| 60 | 
            -
                    http = Net::HTTP::Proxy(proxy_uri.host, proxy_uri.port, proxy_uri.user, proxy_uri.password).new(uri.host, uri.port)
         | 
| 61 | 
            -
                  else
         | 
| 62 | 
            -
                    http = Net::HTTP.new(uri.host, uri.port)
         | 
| 63 | 
            -
                  end
         | 
| 64 | 
            -
                  http.use_ssl = true
         | 
| 65 | 
            -
                  http
         | 
| 39 | 
            +
                def exec_request(params, &block)
         | 
| 40 | 
            +
                  uri = "#{params.delete(:host)}#{params.delete(:path)}"
         | 
| 41 | 
            +
                  params.delete_if { |key, value| value.nil? || value.empty? }
         | 
| 42 | 
            +
                  handle_response(yield(uri, params))
         | 
| 66 43 | 
             
                end
         | 
| 67 44 |  | 
| 68 45 | 
             
                def handle_response(response)
         | 
| 69 46 | 
             
                  case response.code.to_i
         | 
| 70 47 | 
             
                  when 200...300
         | 
| 71 48 | 
             
                    response
         | 
| 49 | 
            +
                  when 400
         | 
| 50 | 
            +
                    raise BadRequestError.new(response.body, response)
         | 
| 72 51 | 
             
                  when 403
         | 
| 73 52 | 
             
                    raise ForbiddenError.new(response.body, response)
         | 
| 74 53 | 
             
                  when 404
         | 
| @@ -79,21 +58,5 @@ module Picasa | |
| 79 58 | 
             
                    raise ResponseError.new(response.body, response)
         | 
| 80 59 | 
             
                  end
         | 
| 81 60 | 
             
                end
         | 
| 82 | 
            -
             | 
| 83 | 
            -
                def headers
         | 
| 84 | 
            -
                  {
         | 
| 85 | 
            -
                    "User-Agent"    => "ruby-gem-v#{VERSION}",
         | 
| 86 | 
            -
                    "GData-Version" => API_VERSION,
         | 
| 87 | 
            -
                    "Content-Type"  => "application/atom+xml"
         | 
| 88 | 
            -
                  }
         | 
| 89 | 
            -
                end
         | 
| 90 | 
            -
             | 
| 91 | 
            -
                def proxy_uri
         | 
| 92 | 
            -
                  @proxy_uri ||= URI.parse(ENV["https_proxy"] || ENV["HTTPS_PROXY"])
         | 
| 93 | 
            -
                end
         | 
| 94 | 
            -
             | 
| 95 | 
            -
                def proxy?
         | 
| 96 | 
            -
                  ENV.has_key?("https_proxy") || ENV.has_key?("HTTPS_PROXY")
         | 
| 97 | 
            -
                end
         | 
| 98 61 | 
             
              end
         | 
| 99 62 | 
             
            end
         | 
    
        data/lib/picasa/exceptions.rb
    CHANGED
    
    
    
        data/lib/picasa/file.rb
    CHANGED
    
    
    
        data/lib/picasa/http.rb
    ADDED
    
    | @@ -0,0 +1,28 @@ | |
| 1 | 
            +
            require "httparty"
         | 
| 2 | 
            +
            require "uri"
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module Picasa
         | 
| 5 | 
            +
              class HTTP
         | 
| 6 | 
            +
                include HTTParty
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                API_URL      = "https://picasaweb.google.com"
         | 
| 9 | 
            +
                API_AUTH_URL = "https://www.google.com"
         | 
| 10 | 
            +
                API_VERSION  = "2"
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                def self.proxy
         | 
| 13 | 
            +
                  proxy_uri = URI.parse(ENV["https_proxy"] || ENV["HTTPS_PROXY"] || "")
         | 
| 14 | 
            +
                  [proxy_uri.host, proxy_uri.port, proxy_uri.user, proxy_uri.password]
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                format         :json
         | 
| 18 | 
            +
                default_params :alt => :json
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                headers        "User-Agent"      => "ruby-gem-picasa-v#{VERSION} (gzip)",
         | 
| 21 | 
            +
                               "GData-Version"   => API_VERSION,
         | 
| 22 | 
            +
                               "Accept-Encoding" => "gzip, deflate"
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                base_uri       API_URL
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                http_proxy     *proxy
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
            end
         |