dribbble-bucket-api 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rvmrc ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env bash
2
+
3
+ if ! rvm list | grep -q ruby-1.9.3-p194 ; then
4
+ rvm install 1.9.3-p194
5
+ fi
6
+
7
+ rvm 1.9.3-p194@ryantownsend_dribbble_bucket_api --create
8
+
9
+ if ! gem list | grep -q bundler ; then
10
+ gem install --no-ri --no-rdoc bundler
11
+ bundle install --without production
12
+ fi
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Ryan Townsend
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.
@@ -0,0 +1,55 @@
1
+ # DribbbleBucketApi
2
+
3
+ This gem provides an unofficial API for browsing buckets on Dribbble and their contents.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'dribbble-bucket-api'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install dribbble-bucket-api
18
+
19
+ ## Usage
20
+
21
+ username = "your_username"
22
+ connection = DribbbleBucketApi.connect(username: username)
23
+
24
+ # loading buckets
25
+ buckets = connection.buckets(page: 1) # => DribbbleBucketApi::BucketCollection
26
+ buckets.total_pages # => 2
27
+ buckets.total_entries # => 7
28
+ buckets.current_page # => 1
29
+ buckets.next_page # => 2
30
+ buckets.previous_page # => 1
31
+
32
+ buckets.each do |bucket| # => DribbbleBucketApi::Bucket
33
+ puts bucket.name
34
+ puts bucket.description
35
+
36
+ # loading shots
37
+ shots = bucket.shots(page: 1) # => DribbbleBucketApi::ShotCollection
38
+ shots.total_entries # => 14
39
+ shots.each do |shot| # => DribbbleBucketApi::Shot
40
+ puts shot.title
41
+ puts shot.image_url
42
+ # full list of attributes can be found here:
43
+ # http://dribbble.com/api#get_shot
44
+ end
45
+
46
+ end
47
+
48
+
49
+ ## Contributing
50
+
51
+ 1. Fork it
52
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
53
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
54
+ 4. Push to the branch (`git push origin my-new-feature`)
55
+ 5. Create new Pull Request
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/dribbble_bucket_api/version', __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.authors = ["Ryan Townsend"]
6
+ s.email = ["ryan@ryantownsend.co.uk"]
7
+ s.description = %q{Unofficial API for browsing Dribbble buckets and their contents}
8
+ s.summary = s.description
9
+ s.homepage = "https://github.com/ryantownsend/dribbble-bucket-api"
10
+
11
+ s.files = `git ls-files`.split($\)
12
+ s.executables = s.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ s.test_files = s.files.grep(%r{^(spec|features)/})
14
+ s.name = "dribbble-bucket-api"
15
+ s.require_paths = ["lib"]
16
+ s.version = DribbbleBucketApi::VERSION
17
+
18
+ s.add_dependency "nokogiri"
19
+ s.add_dependency "httparty"
20
+ s.add_dependency "multi_json"
21
+ s.add_development_dependency "rspec"
22
+ s.add_development_dependency "simplecov"
23
+ end
@@ -0,0 +1,16 @@
1
+ require "dribbble_bucket_api/version"
2
+ require "dribbble_bucket_api/connection"
3
+
4
+ module DribbbleBucketApi
5
+ def self.connect(options = {})
6
+ # ensure we have a username
7
+ unless options[:username]
8
+ raise ArgumentError, %Q(
9
+ Options hash must contain :username
10
+ e.g: DribbbleBucketApi.connect(username: "ryantownsend")
11
+ )
12
+ end
13
+ # create the connection
14
+ Connection.new(options[:username])
15
+ end
16
+ end
@@ -0,0 +1,11 @@
1
+ require "ostruct"
2
+ require_relative "shot_collection"
3
+
4
+ module DribbbleBucketApi
5
+ class Bucket < OpenStruct
6
+ def shots(options = {})
7
+ options.merge!(username: username, bucket_id: id)
8
+ ShotCollection.retrieve(options)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,38 @@
1
+ require_relative "public_site"
2
+
3
+ module DribbbleBucketApi
4
+ class BucketCollection < Array
5
+ def self.retrieve(options)
6
+ # ensure we have a connection
7
+ unless options[:connection]
8
+ raise ArgumentError, %Q(
9
+ Options hash must contain :connection
10
+ e.g: DribbbleBucketApi::BucketCollection.load(connection: connection)
11
+ )
12
+ end
13
+ # load the username
14
+ username = options[:connection].username
15
+ # load the page
16
+ response = PublicSite.new.user_buckets({
17
+ username: username,
18
+ page: options[:page] || 1
19
+ })
20
+ # create the new array
21
+ new(response.buckets).tap do |arr|
22
+ arr.total_entries = response.total_entries
23
+ arr.total_pages = response.total_pages
24
+ arr.current_page = response.current_page
25
+ end
26
+ end
27
+
28
+ attr_accessor :total_entries, :total_pages, :current_page
29
+
30
+ def next_page
31
+ current_page + 1
32
+ end
33
+
34
+ def prev_page
35
+ [current_page - 1, 1].max
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,44 @@
1
+ require "nokogiri"
2
+ require_relative "bucket"
3
+
4
+ module DribbbleBucketApi
5
+ class BucketIndexParser
6
+ attr_reader :body
7
+
8
+ def initialize(body, options = {})
9
+ @body = body
10
+ @options = options
11
+ end
12
+
13
+ def buckets
14
+ @buckets ||= document.css(".bucket-list > li").map do |bucket|
15
+ # parse bucket data from HTML
16
+ id = bucket["class"].gsub(/^bucket\-(\d+)$/, "\1").to_i
17
+ name = bucket.css(".bucket-title a").first.text
18
+ # pass data into bucket object
19
+ Bucket.new(id: id, name: name, username: username)
20
+ end
21
+ end
22
+
23
+ def current_page
24
+ @options[:page] || 1
25
+ end
26
+
27
+ def total_entries
28
+ @total_entries ||= document.css(".buckets .count").text.to_i
29
+ end
30
+
31
+ def total_pages
32
+ (total_entries.to_f / 5).ceil
33
+ end
34
+
35
+ private
36
+ def username
37
+ @options[:username]
38
+ end
39
+
40
+ def document
41
+ @document ||= Nokogiri::HTML(@body)
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,14 @@
1
+ require_relative "bucket_collection"
2
+
3
+ module DribbbleBucketApi
4
+ class Connection < Struct.new(:username)
5
+ def buckets(options = {})
6
+ load_collection(options.merge(connection: self))
7
+ end
8
+
9
+ private
10
+ def load_collection(options)
11
+ BucketCollection.retrieve(options)
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,25 @@
1
+ require "httparty"
2
+ require "multi_json"
3
+
4
+ module DribbbleBucketApi
5
+ class OfficialApi
6
+
7
+ include HTTParty
8
+ base_uri "api.dribbble.com"
9
+
10
+ def get_shot_properties(id)
11
+ response = self.class.get("/shots/#{id}.json")
12
+ # ensure it was a successful response
13
+ unless response.code == 200
14
+ raise StandardError, %Q(
15
+ Response returned #{response.code}
16
+ Body:
17
+ #{response.body}
18
+ )
19
+ end
20
+ # return the JSON object as a hash
21
+ MultiJson.load(response.body, symbolize_keys: true)
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,63 @@
1
+ require "httparty"
2
+ require_relative "bucket_index_parser"
3
+ require_relative "shot_index_parser"
4
+
5
+ module DribbbleBucketApi
6
+ class PublicSite
7
+ include HTTParty
8
+ base_uri "dribbble.com"
9
+
10
+ def user_buckets(options)
11
+ response = load_user_buckets(options)
12
+ # ensure it was a successful response
13
+ unless response.code == 200
14
+ raise StandardError, %Q(
15
+ Response returned #{response.code}
16
+ Body:
17
+ #{response.body}
18
+ )
19
+ end
20
+ # return the object
21
+ BucketIndexParser.new(response.body, options)
22
+ end
23
+
24
+ def bucket_contents(options)
25
+ response = load_bucket_contents(options)
26
+ # ensure it was a successful response
27
+ unless response.code == 200
28
+ raise StandardError, %Q(
29
+ Response returned #{response.code}
30
+ Body:
31
+ #{response.body}
32
+ )
33
+ end
34
+ # return the object
35
+ ShotIndexParser.new(response.body, options)
36
+ end
37
+
38
+ private
39
+ def load_user_buckets(options)
40
+ # ensure we have a username
41
+ unless options[:username]
42
+ raise ArgumentError, %Q(
43
+ Options hash must contain :username
44
+ e.g: PublicDribbbleSite.new.user_buckets(username: "ryantownsend")
45
+ )
46
+ end
47
+ # perform the request
48
+ self.class.get("/#{options[:username]}/buckets?page=#{options[:page] || 1}")
49
+ end
50
+
51
+ def load_bucket_contents(options)
52
+ # ensure we have a username and bucket id
53
+ unless options[:username] && options[:bucket_id]
54
+ raise ArgumentError, %Q(
55
+ Options hash must contain :username and :bucket_id
56
+ e.g: PublicDribbbleSite.new.bucket_contents(username: "ryantownsend", bucket_id: 48172)
57
+ )
58
+ end
59
+ # perform the request
60
+ self.class.get("/#{options[:username]}/buckets/#{options[:bucket_id]}?page=#{options[:page] || 1}")
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,37 @@
1
+ require "ostruct"
2
+ require_relative "official_api"
3
+
4
+ module DribbbleBucketApi
5
+ class Shot
6
+ def initialize(attrs = {})
7
+ @attrs = attrs
8
+ # ensure we have an id
9
+ unless @attrs.has_key?(:id)
10
+ raise ArgumentError, "Shot must be initialized with an id"
11
+ end
12
+ end
13
+
14
+ def method_missing(method, *args, &block)
15
+ # if attrs has the method, and this is an accessor
16
+ if @attrs.has_key?(method.to_sym) && args.empty? && !block_given?
17
+ @attrs[method.to_sym]
18
+ # if we haven't requested the data yet, and this is a accessor
19
+ elsif !requested_full_data? && args.empty? && !block_given?
20
+ # request the data, then resubmit the method
21
+ request_full_data && send(method)
22
+ else
23
+ super
24
+ end
25
+ end
26
+
27
+ def request_full_data
28
+ @requested_full_data = true
29
+ properties = OfficialApi.new.get_shot_properties(id)
30
+ @attrs.merge!(properties)
31
+ end
32
+
33
+ def requested_full_data?
34
+ !!@requested_full_data
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,29 @@
1
+ require_relative "public_site"
2
+ require_relative "shot"
3
+
4
+ module DribbbleBucketApi
5
+ class ShotCollection < Array
6
+ def self.retrieve(options)
7
+ # load the page
8
+ response = PublicSite.new.bucket_contents({
9
+ page: 1
10
+ }.merge(options))
11
+ # create the new array
12
+ new(response.shots).tap do |arr|
13
+ arr.total_entries = response.total_entries
14
+ arr.total_pages = response.total_pages
15
+ arr.current_page = response.current_page
16
+ end
17
+ end
18
+
19
+ attr_accessor :total_entries, :total_pages, :current_page
20
+
21
+ def next_page
22
+ current_page + 1
23
+ end
24
+
25
+ def prev_page
26
+ [current_page - 1, 1].max
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,45 @@
1
+ require "nokogiri"
2
+ require_relative "bucket"
3
+
4
+ module DribbbleBucketApi
5
+ class ShotIndexParser
6
+ attr_reader :body
7
+
8
+ def initialize(body, options = {})
9
+ @body = body
10
+ @options = options
11
+ end
12
+
13
+ def shots
14
+ @shots ||= document.css(".dribbbles > li").map do |shot|
15
+ # parse shot data from HTML
16
+ id = shot["class"].gsub(/^screenshot\-(\d+)$/, "\1").to_i
17
+ img_src = shot.css(".dribbble-img img").first["src"]
18
+ url = "http://dribbble.com" + shot.css("a.dribbble-link").first["href"]
19
+ # pass data into shot object
20
+ Shot.new(id: id, image_teaser_url: img_src, url: url)
21
+ end
22
+ end
23
+
24
+ def current_page
25
+ @options[:page] || 1
26
+ end
27
+
28
+ def total_entries
29
+ @total_entries ||= document.css(".main h2.section").text.gsub(/^(\d+).*$/, "\1").to_i
30
+ end
31
+
32
+ def total_pages
33
+ (total_entries.to_f / 15).ceil
34
+ end
35
+
36
+ private
37
+ def username
38
+ @options[:username]
39
+ end
40
+
41
+ def document
42
+ @document ||= Nokogiri::HTML(@body)
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,3 @@
1
+ module DribbbleBucketApi
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,27 @@
1
+ require "spec_helper"
2
+ require_relative "../../lib/dribbble_bucket_api/bucket_collection"
3
+
4
+ describe DribbbleBucketApi::BucketCollection do
5
+ subject { DribbbleBucketApi::BucketCollection }
6
+
7
+ let(:connection) do
8
+ mock("connection", username: "ryantownsend")
9
+ end
10
+
11
+ describe "::retrieve" do
12
+ context "with a connection" do
13
+ it "should return an instance of a collection" do
14
+ result = subject.retrieve(connection: connection)
15
+ expect(result).to be_kind_of subject
16
+ end
17
+ end
18
+
19
+ context "without a connection" do
20
+ it "should raise an exception" do
21
+ expect {
22
+ subject.retrieve(connection: nil)
23
+ }.to raise_error(ArgumentError)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,86 @@
1
+ require "spec_helper"
2
+ require_relative "../../lib/dribbble_bucket_api/bucket_index_parser"
3
+
4
+ describe DribbbleBucketApi::BucketIndexParser do
5
+ let(:body) do
6
+ %Q(
7
+ <div class="buckets">
8
+ Buckets
9
+ <span class="count">29</span>
10
+ </div>
11
+
12
+ <ol class="bucket-list">
13
+ <li class="bucket-12345">
14
+ <span class="bucket-title">
15
+ <a href="#loc">Awesome</a>
16
+ </span>
17
+ </li>
18
+ <li class="bucket-67890">
19
+ <span class="bucket-title">
20
+ <a href="#loc">Awesome</a>
21
+ </span>
22
+ </li>
23
+ <li class="bucket-98760">
24
+ <span class="bucket-title">
25
+ <a href="#loc">Awesome</a>
26
+ </span>
27
+ </li>
28
+ <li class="bucket-54321">
29
+ <span class="bucket-title">
30
+ <a href="#loc">Awesome</a>
31
+ </span>
32
+ </li>
33
+ <li class="bucket-12093">
34
+ <span class="bucket-title">
35
+ <a href="#loc">Awesome</a>
36
+ </span>
37
+ </li>
38
+ </ol>
39
+ )
40
+ end
41
+
42
+ let(:connection) do
43
+ mock("connection", username: "ryantownsend")
44
+ end
45
+
46
+ let(:options) do
47
+ {
48
+ page: 2,
49
+ connection: connection
50
+ }
51
+ end
52
+
53
+ subject do
54
+ DribbbleBucketApi::BucketIndexParser.new(body, options)
55
+ end
56
+
57
+ describe "#buckets" do
58
+ it "should return an item for each bucket in the list" do
59
+ expect(subject.buckets.size).to eq 5
60
+ end
61
+
62
+ it "should return Bucket instances" do
63
+ subject.buckets.each do |bucket|
64
+ expect(bucket).to be_kind_of DribbbleBucketApi::Bucket
65
+ end
66
+ end
67
+ end
68
+
69
+ describe "#current_page" do
70
+ it "should return the options page" do
71
+ expect(subject.current_page).to eq 2
72
+ end
73
+ end
74
+
75
+ describe "#total_entries" do
76
+ it "should return count from the HTML document" do
77
+ expect(subject.total_entries).to eq 29
78
+ end
79
+ end
80
+
81
+ describe "#total_pages" do
82
+ it "should return the total / 5" do
83
+ expect(subject.total_pages).to eq 6
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,20 @@
1
+ require "spec_helper"
2
+ require_relative "../../lib/dribbble_bucket_api/bucket"
3
+
4
+ describe DribbbleBucketApi::Bucket do
5
+ let(:username) { "ryantownsend" }
6
+ let(:id) { 44001 }
7
+
8
+ subject do
9
+ DribbbleBucketApi::Bucket.new({
10
+ username: username,
11
+ id: id
12
+ })
13
+ end
14
+
15
+ describe "#shots" do
16
+ it "should return a ShotCollection instance" do
17
+ expect(subject.shots).to be_kind_of DribbbleBucketApi::ShotCollection
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,29 @@
1
+ require "spec_helper"
2
+ require_relative "../../lib/dribbble_bucket_api/connection"
3
+
4
+ describe DribbbleBucketApi::Connection do
5
+ subject do
6
+ DribbbleBucketApi::Connection.new("ryantownsend")
7
+ end
8
+
9
+ describe "#buckets" do
10
+ context "when provided with a page" do
11
+ it "should merge the page into a hash with the connection" do
12
+ subject.should_receive(:load_collection).with({
13
+ page: 1,
14
+ connection: subject
15
+ })
16
+ subject.buckets(page: 1)
17
+ end
18
+ end
19
+
20
+ context "when not provided with a page" do
21
+ it "should load the collection using a hash with the connection" do
22
+ subject.should_receive(:load_collection).with({
23
+ connection: subject
24
+ })
25
+ subject.buckets
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,25 @@
1
+ require "spec_helper"
2
+ require_relative "../../lib/dribbble_bucket_api/official_api"
3
+
4
+ describe DribbbleBucketApi::OfficialApi do
5
+ subject do
6
+ DribbbleBucketApi::OfficialApi.new
7
+ end
8
+
9
+ describe "#get_shot_properties" do
10
+ context "when provided with a valid id" do
11
+ it "should return a hash of properties" do
12
+ result = subject.get_shot_properties(156734)
13
+ expect(result).to be_kind_of(Hash)
14
+ end
15
+ end
16
+
17
+ context "when provided with an invalid id" do
18
+ it "should raise an exception" do
19
+ expect {
20
+ subject.get_shot_properties("abc")
21
+ }.to raise_error
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,33 @@
1
+ require "spec_helper"
2
+ require_relative "../../lib/dribbble_bucket_api/public_site"
3
+
4
+ describe DribbbleBucketApi::PublicSite do
5
+ subject do
6
+ DribbbleBucketApi::PublicSite.new
7
+ end
8
+
9
+ describe "#user_buckets" do
10
+ context "when provided with a username" do
11
+ it "should return the remote data" do
12
+ result = subject.user_buckets(username: "ryantownsend")
13
+ expect(result).to be_kind_of(DribbbleBucketApi::BucketIndexParser)
14
+ end
15
+ end
16
+
17
+ context "when provided with an invalid username" do
18
+ it "should raise an exception" do
19
+ expect {
20
+ subject.user_buckets(username: "h8ahsdIhdasd8q0398d")
21
+ }.to raise_error
22
+ end
23
+ end
24
+
25
+ context "when not provided with a username" do
26
+ it "should raise an exception" do
27
+ expect {
28
+ subject.user_buckets(username: nil)
29
+ }.to raise_error(ArgumentError)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,18 @@
1
+ require "spec_helper"
2
+ require_relative "../../lib/dribbble_bucket_api/shot_collection"
3
+
4
+ describe DribbbleBucketApi::ShotCollection do
5
+ subject { DribbbleBucketApi::ShotCollection }
6
+
7
+ describe "::retrieve" do
8
+ context "with a username & bucket" do
9
+ it "should return an instance of a collection" do
10
+ result = subject.retrieve({
11
+ username: "ryantownsend",
12
+ bucket_id: 44001
13
+ })
14
+ expect(result).to be_kind_of subject
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,26 @@
1
+ require "spec_helper"
2
+ require_relative "../../lib/dribbble_bucket_api/shot"
3
+
4
+ describe DribbbleBucketApi::Shot do
5
+ let(:id) { 156734 }
6
+
7
+ subject do
8
+ DribbbleBucketApi::Shot.new({ id: id })
9
+ end
10
+
11
+ describe "#image_url" do
12
+ context "when the image_url has not yet been loaded" do
13
+ it "should return a string" do
14
+ expect(subject.image_url).to match /^https?\:\/\//
15
+ end
16
+ end
17
+ end
18
+
19
+ describe "#a_random_method" do
20
+ it "should return method missing" do
21
+ expect {
22
+ subject.a_random_method
23
+ }.to raise_error(NoMethodError)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,21 @@
1
+ require "spec_helper"
2
+ require_relative "../lib/dribbble_bucket_api"
3
+
4
+ describe DribbbleBucketApi do
5
+ describe "::connect" do
6
+ context "when no username is provided" do
7
+ it "should raise an exception" do
8
+ expect {
9
+ subject.connect(username: nil)
10
+ }.to raise_error(ArgumentError)
11
+ end
12
+ end
13
+
14
+ context "when a username is provided" do
15
+ it "should return a connection object containing the username" do
16
+ connection = subject.connect(username: "ryantownsend")
17
+ expect(connection.username).to eq("ryantownsend")
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,2 @@
1
+ require "simplecov"
2
+ SimpleCov.start
metadata ADDED
@@ -0,0 +1,163 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dribbble-bucket-api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ryan Townsend
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-08-31 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: nokogiri
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: httparty
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: multi_json
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rspec
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: simplecov
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ description: Unofficial API for browsing Dribbble buckets and their contents
95
+ email:
96
+ - ryan@ryantownsend.co.uk
97
+ executables: []
98
+ extensions: []
99
+ extra_rdoc_files: []
100
+ files:
101
+ - .gitignore
102
+ - .rvmrc
103
+ - Gemfile
104
+ - LICENSE
105
+ - README.md
106
+ - Rakefile
107
+ - dribbble_bucket_api.gemspec
108
+ - lib/dribbble_bucket_api.rb
109
+ - lib/dribbble_bucket_api/bucket.rb
110
+ - lib/dribbble_bucket_api/bucket_collection.rb
111
+ - lib/dribbble_bucket_api/bucket_index_parser.rb
112
+ - lib/dribbble_bucket_api/connection.rb
113
+ - lib/dribbble_bucket_api/official_api.rb
114
+ - lib/dribbble_bucket_api/public_site.rb
115
+ - lib/dribbble_bucket_api/shot.rb
116
+ - lib/dribbble_bucket_api/shot_collection.rb
117
+ - lib/dribbble_bucket_api/shot_index_parser.rb
118
+ - lib/dribbble_bucket_api/version.rb
119
+ - spec/dribbble_bucket_api/bucket_collection_spec.rb
120
+ - spec/dribbble_bucket_api/bucket_index_parser_spec.rb
121
+ - spec/dribbble_bucket_api/bucket_spec.rb
122
+ - spec/dribbble_bucket_api/connection_spec.rb
123
+ - spec/dribbble_bucket_api/official_api_spec.rb
124
+ - spec/dribbble_bucket_api/public_site_spec.rb
125
+ - spec/dribbble_bucket_api/shot_collection_spec.rb
126
+ - spec/dribbble_bucket_api/shot_spec.rb
127
+ - spec/dribbble_bucket_api_spec.rb
128
+ - spec/spec_helper.rb
129
+ homepage: https://github.com/ryantownsend/dribbble-bucket-api
130
+ licenses: []
131
+ post_install_message:
132
+ rdoc_options: []
133
+ require_paths:
134
+ - lib
135
+ required_ruby_version: !ruby/object:Gem::Requirement
136
+ none: false
137
+ requirements:
138
+ - - ! '>='
139
+ - !ruby/object:Gem::Version
140
+ version: '0'
141
+ required_rubygems_version: !ruby/object:Gem::Requirement
142
+ none: false
143
+ requirements:
144
+ - - ! '>='
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ requirements: []
148
+ rubyforge_project:
149
+ rubygems_version: 1.8.24
150
+ signing_key:
151
+ specification_version: 3
152
+ summary: Unofficial API for browsing Dribbble buckets and their contents
153
+ test_files:
154
+ - spec/dribbble_bucket_api/bucket_collection_spec.rb
155
+ - spec/dribbble_bucket_api/bucket_index_parser_spec.rb
156
+ - spec/dribbble_bucket_api/bucket_spec.rb
157
+ - spec/dribbble_bucket_api/connection_spec.rb
158
+ - spec/dribbble_bucket_api/official_api_spec.rb
159
+ - spec/dribbble_bucket_api/public_site_spec.rb
160
+ - spec/dribbble_bucket_api/shot_collection_spec.rb
161
+ - spec/dribbble_bucket_api/shot_spec.rb
162
+ - spec/dribbble_bucket_api_spec.rb
163
+ - spec/spec_helper.rb