hatena-bookmark-restful 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/.travis.yml +21 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +49 -0
- data/Rakefile +64 -0
- data/hatena-bookmark-restful.gemspec +29 -0
- data/lib/hatena-bookmark-restful.rb +1 -0
- data/lib/hatena/bookmark/restful.rb +8 -0
- data/lib/hatena/bookmark/restful/v1.rb +110 -0
- data/lib/hatena/bookmark/restful/v1/bookmark.rb +30 -0
- data/lib/hatena/bookmark/restful/v1/entry.rb +27 -0
- data/lib/hatena/bookmark/restful/v1/response_object.rb +48 -0
- data/lib/hatena/bookmark/restful/v1/tag.rb +33 -0
- data/lib/hatena/bookmark/restful/v1/user.rb +44 -0
- data/lib/hatena/bookmark/restful/version.rb +7 -0
- data/spec/hatena/bookmark/restful/v1_spec.rb +219 -0
- data/spec/hatena/bookmark/restful_spec.rb +7 -0
- data/spec/spec_helper.rb +2 -0
- metadata +180 -0
    
        checksums.yaml
    ADDED
    
    | @@ -0,0 +1,7 @@ | |
| 1 | 
            +
            ---
         | 
| 2 | 
            +
            SHA1:
         | 
| 3 | 
            +
              metadata.gz: a8263ea79da036e3c5185b5fad03fb57469052a7
         | 
| 4 | 
            +
              data.tar.gz: 618a5bb0b065737ef075f884298be82637d33c52
         | 
| 5 | 
            +
            SHA512:
         | 
| 6 | 
            +
              metadata.gz: ff07f9681bbf047ee5cc678e19a6c8a51dff76d486ee62149a9a4f98b978a4d1922772cbcee97a189772fcf7b462f8293517e8f2ba1893a0a508426d702b235b
         | 
| 7 | 
            +
              data.tar.gz: a9c7056464cbb3bcb825361f6602517bd67e33aea6627333ddf32f3e909f029eb02748fd7fc5a2cda738e89903a315e57b64df4f78ae038ec95c9e83d7497d3a
         | 
    
        data/.gitignore
    ADDED
    
    
    
        data/.rspec
    ADDED
    
    
    
        data/.travis.yml
    ADDED
    
    | @@ -0,0 +1,21 @@ | |
| 1 | 
            +
            ---
         | 
| 2 | 
            +
            language: ruby
         | 
| 3 | 
            +
            rvm:
         | 
| 4 | 
            +
              - 2.1.0
         | 
| 5 | 
            +
              - 2.0.0
         | 
| 6 | 
            +
              - 1.9.3
         | 
| 7 | 
            +
              - jruby-19mode
         | 
| 8 | 
            +
              - ruby-head
         | 
| 9 | 
            +
              - jruby-head
         | 
| 10 | 
            +
            bundler_args: -j4
         | 
| 11 | 
            +
            before_install:
         | 
| 12 | 
            +
              - gem update --system
         | 
| 13 | 
            +
              - gem --version
         | 
| 14 | 
            +
              - gem install bundler --pre
         | 
| 15 | 
            +
            script: bundle exec rake spec
         | 
| 16 | 
            +
            matrix:
         | 
| 17 | 
            +
              allow_failures:
         | 
| 18 | 
            +
                -
         | 
| 19 | 
            +
                  rvm:
         | 
| 20 | 
            +
                    - ruby-head
         | 
| 21 | 
            +
                    - jruby-head
         | 
    
        data/Gemfile
    ADDED
    
    
    
        data/LICENSE.txt
    ADDED
    
    | @@ -0,0 +1,22 @@ | |
| 1 | 
            +
            Copyright (c) 2014 aereal
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            MIT License
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            Permission is hereby granted, free of charge, to any person obtaining
         | 
| 6 | 
            +
            a copy of this software and associated documentation files (the
         | 
| 7 | 
            +
            "Software"), to deal in the Software without restriction, including
         | 
| 8 | 
            +
            without limitation the rights to use, copy, modify, merge, publish,
         | 
| 9 | 
            +
            distribute, sublicense, and/or sell copies of the Software, and to
         | 
| 10 | 
            +
            permit persons to whom the Software is furnished to do so, subject to
         | 
| 11 | 
            +
            the following conditions:
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            The above copyright notice and this permission notice shall be
         | 
| 14 | 
            +
            included in all copies or substantial portions of the Software.
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
         | 
| 17 | 
            +
            EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
         | 
| 18 | 
            +
            MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
         | 
| 19 | 
            +
            NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
         | 
| 20 | 
            +
            LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
         | 
| 21 | 
            +
            OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
         | 
| 22 | 
            +
            WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
         | 
    
        data/README.md
    ADDED
    
    | @@ -0,0 +1,49 @@ | |
| 1 | 
            +
             * `master` status: 
         | 
| 2 | 
            +
             * `develop` status: 
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            # Hatena::Bookmark::Restful
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            A client library for [Hatena::Bookmark RESTful API](http://developer.hatena.ne.jp/ja/documents/bookmark/apis/rest).
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            ## Installation
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            Add this line to your application's Gemfile:
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                gem 'hatena-bookmark-restful'
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            And then execute:
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                $ bundle
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            Or install it yourself as:
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                $ gem install hatena-bookmark-restful
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            ## Usage
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            **NOTICE**: You must read and agree to [terms of services (in Japanese)](http://developer.hatena.ne.jp/ja/license) before using the API.
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            ```
         | 
| 27 | 
            +
            require 'hatena/bookmark/restful/v1'
         | 
| 28 | 
            +
            CONSUMER_KEY        = 'YOUR_CONSUMER_KEY'
         | 
| 29 | 
            +
            CONSUMER_SECRET     = 'YOUR_CONSUMER_SECRET'
         | 
| 30 | 
            +
            ACCESS_TOKEN        = 'YOUR_ACCESS_TOKEN'
         | 
| 31 | 
            +
            ACCESS_TOKEN_SECRET = 'YOUR_ACCESS_TOKEN_SECRET'
         | 
| 32 | 
            +
             | 
| 33 | 
            +
            client = Hatena::Bookmark::Restful::V1.new(
         | 
| 34 | 
            +
              consumer_key:        CONSUMER_KEY,
         | 
| 35 | 
            +
              consumer_secret:     CONSUMER_SECRET,
         | 
| 36 | 
            +
              access_token:        ACCESS_TOKEN,
         | 
| 37 | 
            +
              access_token_secret: ACCESS_TOKEN_SECRET
         | 
| 38 | 
            +
            )
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            client.bookmark('http://www.hatena.ne.jp/')
         | 
| 41 | 
            +
            ```
         | 
| 42 | 
            +
             | 
| 43 | 
            +
            ## Contributing
         | 
| 44 | 
            +
             | 
| 45 | 
            +
            1. Fork it ( http://github.com/aereal/hatena-bookmark-restful/fork )
         | 
| 46 | 
            +
            2. Create your feature branch (`git checkout -b my-new-feature`)
         | 
| 47 | 
            +
            3. Commit your changes (`git commit -am 'Add some feature'`)
         | 
| 48 | 
            +
            4. Push to the branch (`git push origin my-new-feature`)
         | 
| 49 | 
            +
            5. Create new Pull Request
         | 
    
        data/Rakefile
    ADDED
    
    | @@ -0,0 +1,64 @@ | |
| 1 | 
            +
            require "bundler/gem_tasks"
         | 
| 2 | 
            +
            require "rspec/core/rake_task"
         | 
| 3 | 
            +
            require "semantic"
         | 
| 4 | 
            +
            require "yard"
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            RSpec::Core::RakeTask.new(:spec)
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            task :default => :spec
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            def update_version!(file_path)
         | 
| 11 | 
            +
              old_file = File.read(file_path)
         | 
| 12 | 
            +
              version_str = old_file[VERSION_PATTERN, 1]
         | 
| 13 | 
            +
              old_version = Semantic::Version.new(version_str)
         | 
| 14 | 
            +
              new_version = yield old_version
         | 
| 15 | 
            +
              modified = old_file.sub(VERSION_PATTERN, new_version.to_s)
         | 
| 16 | 
            +
              File.open(file_path, 'w') {|f| f.write(modified) }
         | 
| 17 | 
            +
              warn "#{old_version} => #{new_version}"
         | 
| 18 | 
            +
            end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            VERSION_FILE = 'lib/hatena/bookmark/restful/version.rb'
         | 
| 21 | 
            +
            VERSION_PATTERN = /(\d+\.\d+\.\d+)(-([0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*))?(\+([0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*))?/.freeze # Stolen from Semantic::Version::SemVerRegexp
         | 
| 22 | 
            +
            namespace :version do
         | 
| 23 | 
            +
              namespace :major do
         | 
| 24 | 
            +
                desc "bump major version"
         | 
| 25 | 
            +
                task :bump => VERSION_FILE do |t|
         | 
| 26 | 
            +
                  update_version!(t.prerequisites.first) do |new_version|
         | 
| 27 | 
            +
                    new_version.tap do |version|
         | 
| 28 | 
            +
                      version.major += 1
         | 
| 29 | 
            +
                      version.minor = 0
         | 
| 30 | 
            +
                      version.patch = 0
         | 
| 31 | 
            +
                    end
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
              namespace :minor do
         | 
| 37 | 
            +
                desc "bump minor version"
         | 
| 38 | 
            +
                task :bump => VERSION_FILE do |t|
         | 
| 39 | 
            +
                  update_version!(t.prerequisites.first) do |new_version|
         | 
| 40 | 
            +
                    new_version.tap do |version|
         | 
| 41 | 
            +
                      version.minor += 1
         | 
| 42 | 
            +
                      version.patch = 0
         | 
| 43 | 
            +
                    end
         | 
| 44 | 
            +
                  end
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
              end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
              namespace :patch do
         | 
| 49 | 
            +
                desc "bump patch version"
         | 
| 50 | 
            +
                task :bump => VERSION_FILE do |t|
         | 
| 51 | 
            +
                  update_version!(t.prerequisites.first) do |new_version|
         | 
| 52 | 
            +
                    new_version.tap do |version|
         | 
| 53 | 
            +
                      version.patch += 1
         | 
| 54 | 
            +
                    end
         | 
| 55 | 
            +
                  end
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
              end
         | 
| 58 | 
            +
            end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
            YARD::Rake::YardocTask.new(:doc) do |t|
         | 
| 61 | 
            +
              spec = Gem::Specification.find_by_name('hatena-bookmark-restful')
         | 
| 62 | 
            +
              t.files = spec.lib_files
         | 
| 63 | 
            +
              t.options = %w( --readme README.md )
         | 
| 64 | 
            +
            end
         | 
| @@ -0,0 +1,29 @@ | |
| 1 | 
            +
            # coding: utf-8
         | 
| 2 | 
            +
            lib = File.expand_path('../lib', __FILE__)
         | 
| 3 | 
            +
            $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
         | 
| 4 | 
            +
            require 'hatena/bookmark/restful/version'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            Gem::Specification.new do |spec|
         | 
| 7 | 
            +
              spec.name          = "hatena-bookmark-restful"
         | 
| 8 | 
            +
              spec.version       = Hatena::Bookmark::Restful::VERSION
         | 
| 9 | 
            +
              spec.authors       = ["aereal"]
         | 
| 10 | 
            +
              spec.email         = ["aereal@aereal.org"]
         | 
| 11 | 
            +
              spec.summary       = %q{A client library for Hatena::Bookmark RESTful API}
         | 
| 12 | 
            +
              spec.description   = %q{A client library for Hatena::Bookmark RESTful API}
         | 
| 13 | 
            +
              spec.homepage      = "https://github.com/aereal/hatena-bookmark-restful"
         | 
| 14 | 
            +
              spec.license       = "MIT"
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              spec.files         = `git ls-files`.split($/)
         | 
| 17 | 
            +
              spec.executables   = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
         | 
| 18 | 
            +
              spec.test_files    = spec.files.grep(%r{^(test|spec|features)/})
         | 
| 19 | 
            +
              spec.require_paths = ["lib"]
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              spec.add_runtime_dependency "faraday"
         | 
| 22 | 
            +
              spec.add_runtime_dependency "faraday_middleware"
         | 
| 23 | 
            +
              spec.add_runtime_dependency "simple_oauth"
         | 
| 24 | 
            +
              spec.add_development_dependency "bundler", "~> 1.5"
         | 
| 25 | 
            +
              spec.add_development_dependency "rake"
         | 
| 26 | 
            +
              spec.add_development_dependency "rspec"
         | 
| 27 | 
            +
              spec.add_development_dependency "semantic"
         | 
| 28 | 
            +
              spec.add_development_dependency "yard"
         | 
| 29 | 
            +
            end
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            require "hatena/bookmark/restful"
         | 
| @@ -0,0 +1,110 @@ | |
| 1 | 
            +
            require 'faraday'
         | 
| 2 | 
            +
            require 'faraday_middleware'
         | 
| 3 | 
            +
            require 'json'
         | 
| 4 | 
            +
            require 'hatena/bookmark/restful/v1/user'
         | 
| 5 | 
            +
            require 'hatena/bookmark/restful/v1/tag'
         | 
| 6 | 
            +
            require 'hatena/bookmark/restful/v1/entry'
         | 
| 7 | 
            +
            require 'hatena/bookmark/restful/v1/bookmark'
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            module Hatena
         | 
| 10 | 
            +
              module Bookmark
         | 
| 11 | 
            +
                module Restful; end
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
            end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            class Hatena::Bookmark::Restful::V1
         | 
| 16 | 
            +
              BASE_URI = 'http://api.b.hatena.ne.jp'
         | 
| 17 | 
            +
              API_VERSION = '1'
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              class Credentials
         | 
| 20 | 
            +
                # @!attribute [rw] consumer_key
         | 
| 21 | 
            +
                #   @return [String]
         | 
| 22 | 
            +
                # @!attribute [rw] consumer_secret
         | 
| 23 | 
            +
                #   @return [String]
         | 
| 24 | 
            +
                # @!attribute [rw] access_token
         | 
| 25 | 
            +
                #   @return [String]
         | 
| 26 | 
            +
                # @!attribute [rw] access_token_secret
         | 
| 27 | 
            +
                #   @return [String]
         | 
| 28 | 
            +
                attr_accessor :consumer_key, :consumer_secret, :access_token, :access_token_secret
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                # @param [Hash] attributes
         | 
| 31 | 
            +
                # @option attributes [String] :consumer_key
         | 
| 32 | 
            +
                # @option attributes [String] :consumer_secret
         | 
| 33 | 
            +
                # @option attributes [String] :access_token
         | 
| 34 | 
            +
                # @option attributes [String] :access_token_secret
         | 
| 35 | 
            +
                def initialize(attributes)
         | 
| 36 | 
            +
                  @consumer_key        = attributes.fetch(:consumer_key)
         | 
| 37 | 
            +
                  @consumer_secret     = attributes.fetch(:consumer_secret)
         | 
| 38 | 
            +
                  @access_token        = attributes.fetch(:access_token)
         | 
| 39 | 
            +
                  @access_token_secret = attributes.fetch(:access_token_secret)
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
              def initialize(credentials)
         | 
| 44 | 
            +
                @credentials = credentials
         | 
| 45 | 
            +
              end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
              # @return [User]
         | 
| 48 | 
            +
              def my
         | 
| 49 | 
            +
                res = connection.get("/#{api_version}/my")
         | 
| 50 | 
            +
                attrs = JSON.parse(res.body)
         | 
| 51 | 
            +
                user = User.new_from_response(attrs)
         | 
| 52 | 
            +
              end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
              # @return [<Tag>]
         | 
| 55 | 
            +
              def my_tags
         | 
| 56 | 
            +
                res = connection.get("/#{api_version}/my/tags")
         | 
| 57 | 
            +
                attrs = JSON.parse(res.body)
         | 
| 58 | 
            +
                raw_tags = attrs.fetch('tags')
         | 
| 59 | 
            +
                tags = raw_tags.map {|t| Tag.new_from_response(t) }
         | 
| 60 | 
            +
              end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
              # @return [Entry]
         | 
| 63 | 
            +
              def entry(url)
         | 
| 64 | 
            +
                res = connection.get("/#{api_version}/entry", url: url)
         | 
| 65 | 
            +
                attrs = JSON.parse(res.body)
         | 
| 66 | 
            +
                entry = Entry.new_from_response(attrs)
         | 
| 67 | 
            +
              end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
              # @return [Bookmark]
         | 
| 70 | 
            +
              def bookmark(url)
         | 
| 71 | 
            +
                res = connection.get("/#{api_version}/my/bookmark", url: url)
         | 
| 72 | 
            +
                attrs = JSON.parse(res.body)
         | 
| 73 | 
            +
                bookmark = Bookmark.new_from_response(attrs)
         | 
| 74 | 
            +
              end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
              # @return [Boolean]
         | 
| 77 | 
            +
              def delete_bookmark(url)
         | 
| 78 | 
            +
                res = connection.delete("/#{api_version}/my/bookmark", url: url)
         | 
| 79 | 
            +
                res.success?
         | 
| 80 | 
            +
              end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
              # @return [Bookmark]
         | 
| 83 | 
            +
              def create_bookmark(bookmark_params)
         | 
| 84 | 
            +
                res = connection.post("/#{api_version}/my/bookmark", bookmark_params)
         | 
| 85 | 
            +
                attrs = JSON.parse(res.body)
         | 
| 86 | 
            +
                bookmark = Bookmark.new_from_response(attrs)
         | 
| 87 | 
            +
              end
         | 
| 88 | 
            +
             | 
| 89 | 
            +
              def api_version
         | 
| 90 | 
            +
                API_VERSION
         | 
| 91 | 
            +
              end
         | 
| 92 | 
            +
             | 
| 93 | 
            +
              def base_uri
         | 
| 94 | 
            +
                BASE_URI
         | 
| 95 | 
            +
              end
         | 
| 96 | 
            +
             | 
| 97 | 
            +
              private
         | 
| 98 | 
            +
             | 
| 99 | 
            +
              def connection
         | 
| 100 | 
            +
                @connection ||= Faraday.new(url: base_uri) do |faraday|
         | 
| 101 | 
            +
                  faraday.request :url_encoded
         | 
| 102 | 
            +
                  faraday.request :oauth,
         | 
| 103 | 
            +
                    consumer_key:    @credentials.consumer_key,
         | 
| 104 | 
            +
                    consumer_secret: @credentials.consumer_secret,
         | 
| 105 | 
            +
                    token:           @credentials.access_token,
         | 
| 106 | 
            +
                    token_secret:    @credentials.access_token_secret
         | 
| 107 | 
            +
                  faraday.adapter Faraday.default_adapter
         | 
| 108 | 
            +
                end
         | 
| 109 | 
            +
              end
         | 
| 110 | 
            +
            end
         | 
| @@ -0,0 +1,30 @@ | |
| 1 | 
            +
            require "hatena/bookmark/restful/v1/response_object"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Hatena
         | 
| 4 | 
            +
              module Bookmark
         | 
| 5 | 
            +
                module Restful
         | 
| 6 | 
            +
                  class V1
         | 
| 7 | 
            +
                    class Bookmark
         | 
| 8 | 
            +
                      # @!attribute [r] comment
         | 
| 9 | 
            +
                      #   @return [String]
         | 
| 10 | 
            +
                      # @!attribute [r] created_datetime
         | 
| 11 | 
            +
                      #   @return [String]
         | 
| 12 | 
            +
                      # @!attribute [r] created_epoch
         | 
| 13 | 
            +
                      #   @return [Integer]
         | 
| 14 | 
            +
                      # @!attribute [r] user
         | 
| 15 | 
            +
                      #   @return [String]
         | 
| 16 | 
            +
                      # @!attribute [r] permalink
         | 
| 17 | 
            +
                      #   @return [String]
         | 
| 18 | 
            +
                      # @!attribute [r] private
         | 
| 19 | 
            +
                      #   @return [Boolean]
         | 
| 20 | 
            +
                      # @!attribute [r] tags
         | 
| 21 | 
            +
                      #   @note Return value is a array of **String representation of the tag**
         | 
| 22 | 
            +
                      #   @return [<String>]
         | 
| 23 | 
            +
                      PROPERTIES = [:comment, :created_datetime, :created_epoch, :user, :permalink, :private, :tags]
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                      include Hatena::Bookmark::Restful::V1::ResponseObject
         | 
| 26 | 
            +
                    end
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
            end
         | 
| @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            require "hatena/bookmark/restful/v1/response_object"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Hatena
         | 
| 4 | 
            +
              module Bookmark
         | 
| 5 | 
            +
                module Restful
         | 
| 6 | 
            +
                  class V1; end
         | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
              end
         | 
| 9 | 
            +
            end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            class Hatena::Bookmark::Restful::V1::Entry
         | 
| 12 | 
            +
              # @!attribute [r] title
         | 
| 13 | 
            +
              #   @return [String]
         | 
| 14 | 
            +
              # @!attribute [r] url
         | 
| 15 | 
            +
              #   @return [String]
         | 
| 16 | 
            +
              # @!attribute [r] entry_url
         | 
| 17 | 
            +
              #   @return [String]
         | 
| 18 | 
            +
              # @!attribute [r] count
         | 
| 19 | 
            +
              #   @return [Integer]
         | 
| 20 | 
            +
              # @!attribute [r] favicon_url
         | 
| 21 | 
            +
              #   @return [String]
         | 
| 22 | 
            +
              # @!attribute [r] smartphone_app_entry_url
         | 
| 23 | 
            +
              #   @return [String]
         | 
| 24 | 
            +
              PROPERTIES = [:title, :url, :entry_url, :count, :favicon_url, :smartphone_app_entry_url]
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              include Hatena::Bookmark::Restful::V1::ResponseObject
         | 
| 27 | 
            +
            end
         | 
| @@ -0,0 +1,48 @@ | |
| 1 | 
            +
            module Hatena
         | 
| 2 | 
            +
              module Bookmark
         | 
| 3 | 
            +
                module Restful
         | 
| 4 | 
            +
                  class V1; end
         | 
| 5 | 
            +
                end
         | 
| 6 | 
            +
              end
         | 
| 7 | 
            +
            end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            module Hatena::Bookmark::Restful::V1::ResponseObject
         | 
| 10 | 
            +
              module ClassMethods
         | 
| 11 | 
            +
                # Create a new instance from JSON from the API
         | 
| 12 | 
            +
                def new_from_response(res)
         | 
| 13 | 
            +
                  properties = self.const_get(:PROPERTIES)
         | 
| 14 | 
            +
                  names      = properties.map(&:to_s)
         | 
| 15 | 
            +
                  values     = res.values_at(*names)
         | 
| 16 | 
            +
                  attrs      = Hash[ properties.zip(values) ]
         | 
| 17 | 
            +
                  new(attrs)
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              def self.included(context)
         | 
| 22 | 
            +
                properties = context.const_get(:PROPERTIES)
         | 
| 23 | 
            +
                context.send(:extend, ClassMethods)
         | 
| 24 | 
            +
                properties.each do |prop|
         | 
| 25 | 
            +
                  define_method(prop) { @attributes.fetch(prop) }
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
              def initialize(attributes)
         | 
| 30 | 
            +
                @attributes = attributes
         | 
| 31 | 
            +
              end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
              # Fetch raw attribute value
         | 
| 34 | 
            +
              # @param [Symbol] name The attribute's name
         | 
| 35 | 
            +
              def [](name)
         | 
| 36 | 
            +
                @attributes[name]
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
              # @return [Boolean]
         | 
| 40 | 
            +
              def ==(other)
         | 
| 41 | 
            +
                other.is_a?(self.class) && self.class.const_get(:PROPERTIES).all? {|prop| self[prop] == other[prop] }
         | 
| 42 | 
            +
              end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
              # @return [Hash]
         | 
| 45 | 
            +
              def to_hash
         | 
| 46 | 
            +
                @attributes
         | 
| 47 | 
            +
              end
         | 
| 48 | 
            +
            end
         | 
| @@ -0,0 +1,33 @@ | |
| 1 | 
            +
            require "hatena/bookmark/restful/v1/response_object"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Hatena
         | 
| 4 | 
            +
              module Bookmark
         | 
| 5 | 
            +
                module Restful
         | 
| 6 | 
            +
                  class V1; end
         | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
              end
         | 
| 9 | 
            +
            end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            class Hatena::Bookmark::Restful::V1::Tag
         | 
| 12 | 
            +
              # @!attribute [r] tag
         | 
| 13 | 
            +
              #   The name of tag
         | 
| 14 | 
            +
              #   @return [String]
         | 
| 15 | 
            +
              # @!attribute [r] count
         | 
| 16 | 
            +
              #   The number of bookmarks with the tag
         | 
| 17 | 
            +
              #   @return [Integer]
         | 
| 18 | 
            +
              # @!attribute [r] modified_datetime
         | 
| 19 | 
            +
              #   ISO 8601 representation of the last modified time
         | 
| 20 | 
            +
              #   @return [String]
         | 
| 21 | 
            +
              # @!attribute [r] modified_epoch
         | 
| 22 | 
            +
              #   UNIX epoch of the last modified time
         | 
| 23 | 
            +
              #   @return [Integer]
         | 
| 24 | 
            +
              PROPERTIES = [:tag, :count, :modified_epoch, :modified_datetime]
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              include Hatena::Bookmark::Restful::V1::ResponseObject
         | 
| 27 | 
            +
             | 
| 28 | 
            +
              # The last modified time
         | 
| 29 | 
            +
              # @return [Time]
         | 
| 30 | 
            +
              def modified_at
         | 
| 31 | 
            +
                Time.at(self.modified_epoch)
         | 
| 32 | 
            +
              end
         | 
| 33 | 
            +
            end
         | 
| @@ -0,0 +1,44 @@ | |
| 1 | 
            +
            require "hatena/bookmark/restful/v1/response_object"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Hatena
         | 
| 4 | 
            +
              module Bookmark
         | 
| 5 | 
            +
                module Restful
         | 
| 6 | 
            +
                  class V1; end
         | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
              end
         | 
| 9 | 
            +
            end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            class Hatena::Bookmark::Restful::V1::User
         | 
| 12 | 
            +
              # @!attribute [r] name
         | 
| 13 | 
            +
              #   User's Hatena ID
         | 
| 14 | 
            +
              #   @return [String]
         | 
| 15 | 
            +
              STRING_PROPERTIES  = [:name]
         | 
| 16 | 
            +
              BOOLEAN_PROPERTIES = [:plususer, :private, :is_oauth_twitter, :is_oauth_evernote, :is_oauth_facebook, :is_oauth_mixi_check]
         | 
| 17 | 
            +
              PROPERTIES         = STRING_PROPERTIES + BOOLEAN_PROPERTIES
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              include Hatena::Bookmark::Restful::V1::ResponseObject
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              # @!method plususer?
         | 
| 22 | 
            +
              #   The user subscribed Hatena Bookmark Plus or not
         | 
| 23 | 
            +
              #   @return [Boolean]
         | 
| 24 | 
            +
              # @!method private?
         | 
| 25 | 
            +
              #   The user does not share his/her bookmarks with anyone or not
         | 
| 26 | 
            +
              #   @return [Boolean]
         | 
| 27 | 
            +
              # @!method oauth_twitter?
         | 
| 28 | 
            +
              #   Connected with Twitter using OAuth or not
         | 
| 29 | 
            +
              #   @return [Boolean]
         | 
| 30 | 
            +
              # @!method oauth_evernote?
         | 
| 31 | 
            +
              #   Connected with Evernote using OAuth or not
         | 
| 32 | 
            +
              #   @return [Boolean]
         | 
| 33 | 
            +
              # @!method oauth_facebook?
         | 
| 34 | 
            +
              #   Connected with Facebook using OAuth or not
         | 
| 35 | 
            +
              #   @return [Boolean]
         | 
| 36 | 
            +
              # @!method oauth_mixi_check?
         | 
| 37 | 
            +
              #   Connected with mixi check using OAuth or not
         | 
| 38 | 
            +
              #   @return [Boolean]
         | 
| 39 | 
            +
              BOOLEAN_PROPERTIES.each do |prop|
         | 
| 40 | 
            +
                define_method(prop.to_s.gsub(/^is_/, '')) do
         | 
| 41 | 
            +
                  @attributes.fetch(prop)
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
              end
         | 
| 44 | 
            +
            end
         | 
| @@ -0,0 +1,219 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'hatena/bookmark/restful/v1'
         | 
| 4 | 
            +
            require 'json'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            shared_context "send a HTTP request to API" do
         | 
| 7 | 
            +
              subject { raise "The example group must give real `subject`" }
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              let(:api_path) { raise "The example group must give real `api_path`" }
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              let(:stubbed_response) {
         | 
| 12 | 
            +
                [
         | 
| 13 | 
            +
                  200,
         | 
| 14 | 
            +
                  {},
         | 
| 15 | 
            +
                  response_body
         | 
| 16 | 
            +
                ]
         | 
| 17 | 
            +
              }
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              let(:test_connection) {
         | 
| 20 | 
            +
                Faraday.new do |builder|
         | 
| 21 | 
            +
                  builder.adapter :test do |stubs|
         | 
| 22 | 
            +
                    stubs.get(api_path) { stubbed_response }
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
              }
         | 
| 26 | 
            +
             | 
| 27 | 
            +
              before do
         | 
| 28 | 
            +
                allow(client).to receive(:connection).and_return(test_connection)
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
            end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
            describe Hatena::Bookmark::Restful::V1 do
         | 
| 33 | 
            +
              let(:credentials) { Hatena::Bookmark::Restful::V1::Credentials.new(consumer_key: '', consumer_secret: '', access_token: '', access_token_secret: '') }
         | 
| 34 | 
            +
              let(:client) { Hatena::Bookmark::Restful::V1.new(credentials) }
         | 
| 35 | 
            +
             | 
| 36 | 
            +
              describe "#create_bookmark" do
         | 
| 37 | 
            +
                let(:stubbed_response) {
         | 
| 38 | 
            +
                  [
         | 
| 39 | 
            +
                    200,
         | 
| 40 | 
            +
                    {},
         | 
| 41 | 
            +
                    JSON.dump(bookmark.to_hash)
         | 
| 42 | 
            +
                  ]
         | 
| 43 | 
            +
                }
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                let(:test_connection) {
         | 
| 46 | 
            +
                  Faraday.new do |builder|
         | 
| 47 | 
            +
                    builder.adapter :test do |stubs|
         | 
| 48 | 
            +
                      stubs.post(api_path) { stubbed_response }
         | 
| 49 | 
            +
                    end
         | 
| 50 | 
            +
                  end
         | 
| 51 | 
            +
                }
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                let(:api_path) { "/1/my/bookmark" }
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                let(:request_params) {
         | 
| 56 | 
            +
                  {
         | 
| 57 | 
            +
                    url: 'http://www.hatena.ne.jp/',
         | 
| 58 | 
            +
                    comment: 'おもしろホームページです',
         | 
| 59 | 
            +
                    tags: %w( hatena ),
         | 
| 60 | 
            +
                    post_twitter: false,
         | 
| 61 | 
            +
                    post_facebook: false,
         | 
| 62 | 
            +
                    post_mixi: false,
         | 
| 63 | 
            +
                    post_evernote: false,
         | 
| 64 | 
            +
                    send_mail: false,
         | 
| 65 | 
            +
                    private: false,
         | 
| 66 | 
            +
                  }
         | 
| 67 | 
            +
                }
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                let(:bookmark) {
         | 
| 70 | 
            +
                  Hatena::Bookmark::Restful::V1::Bookmark.new_from_response(
         | 
| 71 | 
            +
                    'comment' => request_params[:comment],
         | 
| 72 | 
            +
                    'created_datetime' => '2013-12-17T23:58:54+09:00',
         | 
| 73 | 
            +
                    'created_epoch' => 1387292334,
         | 
| 74 | 
            +
                    'user' => 'aereal',
         | 
| 75 | 
            +
                    'permalink' => 'http://b.hatena.ne.jp/aereal/20131217#bookmark-150288466',
         | 
| 76 | 
            +
                    'private' => request_params['private'],
         | 
| 77 | 
            +
                    'tags' => request_params['tags'],
         | 
| 78 | 
            +
                  )
         | 
| 79 | 
            +
                }
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                before do
         | 
| 82 | 
            +
                  allow(client).to receive(:connection).and_return(test_connection)
         | 
| 83 | 
            +
                end
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                it "successfully create a new bookmark" do
         | 
| 86 | 
            +
                  expect(client.create_bookmark(request_params)).to eq(bookmark)
         | 
| 87 | 
            +
                end
         | 
| 88 | 
            +
              end
         | 
| 89 | 
            +
             | 
| 90 | 
            +
              describe "#delete_bookmark" do
         | 
| 91 | 
            +
                let(:stubbed_response) {
         | 
| 92 | 
            +
                  [
         | 
| 93 | 
            +
                    204,
         | 
| 94 | 
            +
                    {},
         | 
| 95 | 
            +
                    ''
         | 
| 96 | 
            +
                  ]
         | 
| 97 | 
            +
                }
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                let(:test_connection) {
         | 
| 100 | 
            +
                  Faraday.new do |builder|
         | 
| 101 | 
            +
                    builder.adapter :test do |stubs|
         | 
| 102 | 
            +
                      stubs.delete(api_path) { stubbed_response }
         | 
| 103 | 
            +
                    end
         | 
| 104 | 
            +
                  end
         | 
| 105 | 
            +
                }
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                let(:api_path) { "/1/my/bookmark" }
         | 
| 108 | 
            +
             | 
| 109 | 
            +
                let(:entry_url) { "http://aereal.org/" }
         | 
| 110 | 
            +
             | 
| 111 | 
            +
                before do
         | 
| 112 | 
            +
                  allow(client).to receive(:connection).and_return(test_connection)
         | 
| 113 | 
            +
                end
         | 
| 114 | 
            +
             | 
| 115 | 
            +
                it "successfully delete a bookmark" do
         | 
| 116 | 
            +
                  expect(client.delete_bookmark(entry_url)).to be_true
         | 
| 117 | 
            +
                end
         | 
| 118 | 
            +
              end
         | 
| 119 | 
            +
             | 
| 120 | 
            +
              describe "#bookmark" do
         | 
| 121 | 
            +
                include_context "send a HTTP request to API"
         | 
| 122 | 
            +
             | 
| 123 | 
            +
                subject { client.bookmark(entry_url) }
         | 
| 124 | 
            +
             | 
| 125 | 
            +
                let(:api_path) { "/1/my/bookmark" }
         | 
| 126 | 
            +
             | 
| 127 | 
            +
                let(:bookmark) {
         | 
| 128 | 
            +
                  Hatena::Bookmark::Restful::V1::Bookmark.new_from_response(
         | 
| 129 | 
            +
                    'comment' => ' Heroku の Deploy Hooks で HipChat がサポートされていた',
         | 
| 130 | 
            +
                    'created_datetime' => '2013-12-17T23:58:54+09:00',
         | 
| 131 | 
            +
                    'created_epoch' => 1387292334,
         | 
| 132 | 
            +
                    'user' => 'aereal',
         | 
| 133 | 
            +
                    'permalink' => 'http://b.hatena.ne.jp/aereal/20131217#bookmark-150288466',
         | 
| 134 | 
            +
                    'private' => false,
         | 
| 135 | 
            +
                    'tags' => [
         | 
| 136 | 
            +
                      'heroku',
         | 
| 137 | 
            +
                    ],
         | 
| 138 | 
            +
                  )
         | 
| 139 | 
            +
                }
         | 
| 140 | 
            +
             | 
| 141 | 
            +
                let(:response_body) { JSON.dump(bookmark.to_hash) }
         | 
| 142 | 
            +
             | 
| 143 | 
            +
                let(:entry_url) { "https://devcenter.heroku.com/articles/deploy-hooks" }
         | 
| 144 | 
            +
             | 
| 145 | 
            +
                it "is valid response from API" do
         | 
| 146 | 
            +
                  expect(client.bookmark(entry_url)).to eq(bookmark)
         | 
| 147 | 
            +
                end
         | 
| 148 | 
            +
              end
         | 
| 149 | 
            +
             | 
| 150 | 
            +
              describe "#entry" do
         | 
| 151 | 
            +
                include_context "send a HTTP request to API"
         | 
| 152 | 
            +
                let(:api_path) { "/1/entry" }
         | 
| 153 | 
            +
             | 
| 154 | 
            +
                let(:entry) {
         | 
| 155 | 
            +
                  Hatena::Bookmark::Restful::V1::Entry.new_from_response(
         | 
| 156 | 
            +
                    'title'                    => %|aereal's portfolio - aereal.org|,
         | 
| 157 | 
            +
                    'url'                      => 'http://aereal.org/',
         | 
| 158 | 
            +
                    'entry_url'                => 'http://b.hatena.ne.jp/entry/aereal.org/',
         | 
| 159 | 
            +
                    'count'                    => 3,
         | 
| 160 | 
            +
                    'favicon_url'              => 'http://cdn-ak.favicon.st-hatena.com/?url=http%3A%2F%2Faereal.org%2F',
         | 
| 161 | 
            +
                    'smartphone_app_entry_url' => 'http://b.hatena.ne.jp/bookmarklet.touch?mode=comment&iphone_app=1&url=http%3A%2F%2Faereal.org%2F',
         | 
| 162 | 
            +
                  )
         | 
| 163 | 
            +
                }
         | 
| 164 | 
            +
             | 
| 165 | 
            +
                let(:response_body) { JSON.generate(entry.to_hash) }
         | 
| 166 | 
            +
             | 
| 167 | 
            +
                let(:entry_url) { 'http://aereal.org/' }
         | 
| 168 | 
            +
             | 
| 169 | 
            +
                it "is valid response from API" do
         | 
| 170 | 
            +
                  expect(client.entry(entry_url)).to eq(entry)
         | 
| 171 | 
            +
                end
         | 
| 172 | 
            +
              end
         | 
| 173 | 
            +
             | 
| 174 | 
            +
              describe "#tags" do
         | 
| 175 | 
            +
                include_context "send a HTTP request to API"
         | 
| 176 | 
            +
                let(:api_path) { "/1/my/tags" }
         | 
| 177 | 
            +
             | 
| 178 | 
            +
                let(:tag) {
         | 
| 179 | 
            +
                  Hatena::Bookmark::Restful::V1::Tag.new_from_response(
         | 
| 180 | 
            +
                    'modified_datetime' => '2011-06-15T05:41:01',
         | 
| 181 | 
            +
                    'modified_epoch'    => 1308116461,
         | 
| 182 | 
            +
                    'count'             => 10,
         | 
| 183 | 
            +
                    'tag'               => 'ruby',
         | 
| 184 | 
            +
                  )
         | 
| 185 | 
            +
                }
         | 
| 186 | 
            +
             | 
| 187 | 
            +
                let(:tags_response) { { 'tags' => [tag.to_hash] } }
         | 
| 188 | 
            +
             | 
| 189 | 
            +
                let(:response_body) { JSON.generate(tags_response) }
         | 
| 190 | 
            +
             | 
| 191 | 
            +
                it "is valid response from API" do
         | 
| 192 | 
            +
                  expect(client.my_tags).to eq([ tag ])
         | 
| 193 | 
            +
                end
         | 
| 194 | 
            +
              end
         | 
| 195 | 
            +
             | 
| 196 | 
            +
              describe "#my" do
         | 
| 197 | 
            +
                include_context "send a HTTP request to API"
         | 
| 198 | 
            +
             | 
| 199 | 
            +
                let(:user) {
         | 
| 200 | 
            +
                  Hatena::Bookmark::Restful::V1::User.new_from_response(
         | 
| 201 | 
            +
                    'name'                => 'aereal',
         | 
| 202 | 
            +
                    'plususer'            => true,
         | 
| 203 | 
            +
                    'private'             => false,
         | 
| 204 | 
            +
                    'is_oauth_twitter'    => true,
         | 
| 205 | 
            +
                    'is_oauth_evernote'   => true,
         | 
| 206 | 
            +
                    'is_oauth_facebook'   => true,
         | 
| 207 | 
            +
                    'is_oauth_mixi_check' => false,
         | 
| 208 | 
            +
                  )
         | 
| 209 | 
            +
                }
         | 
| 210 | 
            +
             | 
| 211 | 
            +
                let(:response_body) { JSON.dump(user.to_hash) }
         | 
| 212 | 
            +
             | 
| 213 | 
            +
                let(:api_path) { "/1/my" }
         | 
| 214 | 
            +
             | 
| 215 | 
            +
                it "is valid response from API" do
         | 
| 216 | 
            +
                  expect(client.my).to eq(user)
         | 
| 217 | 
            +
                end
         | 
| 218 | 
            +
              end
         | 
| 219 | 
            +
            end
         | 
    
        data/spec/spec_helper.rb
    ADDED
    
    
    
        metadata
    ADDED
    
    | @@ -0,0 +1,180 @@ | |
| 1 | 
            +
            --- !ruby/object:Gem::Specification
         | 
| 2 | 
            +
            name: hatena-bookmark-restful
         | 
| 3 | 
            +
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            +
              version: 0.1.0
         | 
| 5 | 
            +
            platform: ruby
         | 
| 6 | 
            +
            authors:
         | 
| 7 | 
            +
            - aereal
         | 
| 8 | 
            +
            autorequire: 
         | 
| 9 | 
            +
            bindir: bin
         | 
| 10 | 
            +
            cert_chain: []
         | 
| 11 | 
            +
            date: 2014-01-04 00:00:00.000000000 Z
         | 
| 12 | 
            +
            dependencies:
         | 
| 13 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 14 | 
            +
              name: faraday
         | 
| 15 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 16 | 
            +
                requirements:
         | 
| 17 | 
            +
                - - ">="
         | 
| 18 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            +
                    version: '0'
         | 
| 20 | 
            +
              type: :runtime
         | 
| 21 | 
            +
              prerelease: false
         | 
| 22 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 23 | 
            +
                requirements:
         | 
| 24 | 
            +
                - - ">="
         | 
| 25 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 26 | 
            +
                    version: '0'
         | 
| 27 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 28 | 
            +
              name: faraday_middleware
         | 
| 29 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 30 | 
            +
                requirements:
         | 
| 31 | 
            +
                - - ">="
         | 
| 32 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            +
                    version: '0'
         | 
| 34 | 
            +
              type: :runtime
         | 
| 35 | 
            +
              prerelease: false
         | 
| 36 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 | 
            +
                requirements:
         | 
| 38 | 
            +
                - - ">="
         | 
| 39 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            +
                    version: '0'
         | 
| 41 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 42 | 
            +
              name: simple_oauth
         | 
| 43 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 44 | 
            +
                requirements:
         | 
| 45 | 
            +
                - - ">="
         | 
| 46 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 47 | 
            +
                    version: '0'
         | 
| 48 | 
            +
              type: :runtime
         | 
| 49 | 
            +
              prerelease: false
         | 
| 50 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 51 | 
            +
                requirements:
         | 
| 52 | 
            +
                - - ">="
         | 
| 53 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            +
                    version: '0'
         | 
| 55 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 56 | 
            +
              name: bundler
         | 
| 57 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 58 | 
            +
                requirements:
         | 
| 59 | 
            +
                - - "~>"
         | 
| 60 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            +
                    version: '1.5'
         | 
| 62 | 
            +
              type: :development
         | 
| 63 | 
            +
              prerelease: false
         | 
| 64 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 65 | 
            +
                requirements:
         | 
| 66 | 
            +
                - - "~>"
         | 
| 67 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 68 | 
            +
                    version: '1.5'
         | 
| 69 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 70 | 
            +
              name: rake
         | 
| 71 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 72 | 
            +
                requirements:
         | 
| 73 | 
            +
                - - ">="
         | 
| 74 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 75 | 
            +
                    version: '0'
         | 
| 76 | 
            +
              type: :development
         | 
| 77 | 
            +
              prerelease: false
         | 
| 78 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 79 | 
            +
                requirements:
         | 
| 80 | 
            +
                - - ">="
         | 
| 81 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 82 | 
            +
                    version: '0'
         | 
| 83 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 84 | 
            +
              name: rspec
         | 
| 85 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 86 | 
            +
                requirements:
         | 
| 87 | 
            +
                - - ">="
         | 
| 88 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 89 | 
            +
                    version: '0'
         | 
| 90 | 
            +
              type: :development
         | 
| 91 | 
            +
              prerelease: false
         | 
| 92 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 93 | 
            +
                requirements:
         | 
| 94 | 
            +
                - - ">="
         | 
| 95 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 96 | 
            +
                    version: '0'
         | 
| 97 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 98 | 
            +
              name: semantic
         | 
| 99 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 100 | 
            +
                requirements:
         | 
| 101 | 
            +
                - - ">="
         | 
| 102 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 103 | 
            +
                    version: '0'
         | 
| 104 | 
            +
              type: :development
         | 
| 105 | 
            +
              prerelease: false
         | 
| 106 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 107 | 
            +
                requirements:
         | 
| 108 | 
            +
                - - ">="
         | 
| 109 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 110 | 
            +
                    version: '0'
         | 
| 111 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 112 | 
            +
              name: yard
         | 
| 113 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 114 | 
            +
                requirements:
         | 
| 115 | 
            +
                - - ">="
         | 
| 116 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 117 | 
            +
                    version: '0'
         | 
| 118 | 
            +
              type: :development
         | 
| 119 | 
            +
              prerelease: false
         | 
| 120 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 121 | 
            +
                requirements:
         | 
| 122 | 
            +
                - - ">="
         | 
| 123 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 124 | 
            +
                    version: '0'
         | 
| 125 | 
            +
            description: A client library for Hatena::Bookmark RESTful API
         | 
| 126 | 
            +
            email:
         | 
| 127 | 
            +
            - aereal@aereal.org
         | 
| 128 | 
            +
            executables: []
         | 
| 129 | 
            +
            extensions: []
         | 
| 130 | 
            +
            extra_rdoc_files: []
         | 
| 131 | 
            +
            files:
         | 
| 132 | 
            +
            - ".gitignore"
         | 
| 133 | 
            +
            - ".rspec"
         | 
| 134 | 
            +
            - ".travis.yml"
         | 
| 135 | 
            +
            - Gemfile
         | 
| 136 | 
            +
            - LICENSE.txt
         | 
| 137 | 
            +
            - README.md
         | 
| 138 | 
            +
            - Rakefile
         | 
| 139 | 
            +
            - hatena-bookmark-restful.gemspec
         | 
| 140 | 
            +
            - lib/hatena-bookmark-restful.rb
         | 
| 141 | 
            +
            - lib/hatena/bookmark/restful.rb
         | 
| 142 | 
            +
            - lib/hatena/bookmark/restful/v1.rb
         | 
| 143 | 
            +
            - lib/hatena/bookmark/restful/v1/bookmark.rb
         | 
| 144 | 
            +
            - lib/hatena/bookmark/restful/v1/entry.rb
         | 
| 145 | 
            +
            - lib/hatena/bookmark/restful/v1/response_object.rb
         | 
| 146 | 
            +
            - lib/hatena/bookmark/restful/v1/tag.rb
         | 
| 147 | 
            +
            - lib/hatena/bookmark/restful/v1/user.rb
         | 
| 148 | 
            +
            - lib/hatena/bookmark/restful/version.rb
         | 
| 149 | 
            +
            - spec/hatena/bookmark/restful/v1_spec.rb
         | 
| 150 | 
            +
            - spec/hatena/bookmark/restful_spec.rb
         | 
| 151 | 
            +
            - spec/spec_helper.rb
         | 
| 152 | 
            +
            homepage: https://github.com/aereal/hatena-bookmark-restful
         | 
| 153 | 
            +
            licenses:
         | 
| 154 | 
            +
            - MIT
         | 
| 155 | 
            +
            metadata: {}
         | 
| 156 | 
            +
            post_install_message: 
         | 
| 157 | 
            +
            rdoc_options: []
         | 
| 158 | 
            +
            require_paths:
         | 
| 159 | 
            +
            - lib
         | 
| 160 | 
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 161 | 
            +
              requirements:
         | 
| 162 | 
            +
              - - ">="
         | 
| 163 | 
            +
                - !ruby/object:Gem::Version
         | 
| 164 | 
            +
                  version: '0'
         | 
| 165 | 
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 166 | 
            +
              requirements:
         | 
| 167 | 
            +
              - - ">="
         | 
| 168 | 
            +
                - !ruby/object:Gem::Version
         | 
| 169 | 
            +
                  version: '0'
         | 
| 170 | 
            +
            requirements: []
         | 
| 171 | 
            +
            rubyforge_project: 
         | 
| 172 | 
            +
            rubygems_version: 2.2.0
         | 
| 173 | 
            +
            signing_key: 
         | 
| 174 | 
            +
            specification_version: 4
         | 
| 175 | 
            +
            summary: A client library for Hatena::Bookmark RESTful API
         | 
| 176 | 
            +
            test_files:
         | 
| 177 | 
            +
            - spec/hatena/bookmark/restful/v1_spec.rb
         | 
| 178 | 
            +
            - spec/hatena/bookmark/restful_spec.rb
         | 
| 179 | 
            +
            - spec/spec_helper.rb
         | 
| 180 | 
            +
            has_rdoc: 
         |