githubris 0.0.1 → 0.0.2

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.
Files changed (40) hide show
  1. data/.gitignore +1 -0
  2. data/.travis.yml +7 -0
  3. data/Gemfile +5 -2
  4. data/README.md +16 -1
  5. data/Rakefile +8 -3
  6. data/features/list_of_public_gists.feature +12 -0
  7. data/features/list_of_users_public_gists.feature +14 -0
  8. data/features/step_definitions/general_steps.rb +20 -0
  9. data/features/step_definitions/public_gist_steps.rb +0 -0
  10. data/features/support/env.rb +6 -0
  11. data/features/support/fakeweb_responses.rb +6 -0
  12. data/features/support/fixtures.rb +11 -0
  13. data/features/support/public_gists_page_1.json +884 -0
  14. data/features/support/public_gists_page_2.json +898 -0
  15. data/githubris.gemspec +0 -1
  16. data/lib/githubris/api.rb +38 -20
  17. data/lib/githubris/builder.rb +31 -22
  18. data/lib/githubris/comment.rb +1 -1
  19. data/lib/githubris/gist/file.rb +1 -1
  20. data/lib/githubris/gist.rb +1 -10
  21. data/lib/githubris/issue.rb +1 -1
  22. data/lib/githubris/organization.rb +1 -1
  23. data/lib/githubris/repository.rb +1 -1
  24. data/lib/githubris/user.rb +6 -7
  25. data/lib/githubris/version.rb +2 -2
  26. data/lib/githubris.rb +17 -16
  27. data/spec/githubris/api_spec.rb +18 -20
  28. data/spec/githubris/builder_spec.rb +30 -14
  29. data/spec/githubris/gist_spec.rb +0 -30
  30. data/spec/githubris_spec.rb +48 -0
  31. data/spec/spec_helper.rb +8 -1
  32. data/spec/support/fakeweb_responses.rb +2 -57
  33. data/spec/support/fixtures.rb +1 -1
  34. data/spec/support/public_gists_page_1.json +884 -0
  35. data/spec/support/public_gists_page_2.json +898 -0
  36. metadata +17 -8
  37. data/config/base.yml +0 -1
  38. data/config/gists.yml +0 -13
  39. data/config.yml +0 -1
  40. data/lib/githubris/config.rb +0 -13
data/githubris.gemspec CHANGED
@@ -1,6 +1,5 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  $:.push File.expand_path("../lib", __FILE__)
3
- $:.push File.expand_path("../config", __FILE__)
4
3
  require "githubris/version"
5
4
 
6
5
  Gem::Specification.new do |s|
data/lib/githubris/api.rb CHANGED
@@ -1,26 +1,44 @@
1
1
  require 'httparty'
2
2
 
3
- module Githubris
4
- class API
5
- include HTTParty
6
- base_uri(Githubris::Config[:base_uri])
7
-
8
- def self.call(data, *args)
9
-
10
- options = {data: data}
11
- unless args.empty?
12
- options.merge! args.inject(Githubris::Config) {|config, key|
13
- config[key]
14
- }
15
- end
16
- Githubris::API.resolve options
17
- end
3
+ class Githubris::API
4
+ include HTTParty
5
+ base_uri 'https://api.github.com'
6
+ format :json
7
+
8
+ GISTS_PER_PAGE = 30
9
+ PUBLIC_GISTS_PATH = '/gists/public'
10
+
11
+ def initialize
12
+ @builder = Githubris::Builder.new
13
+ end
14
+
15
+ def authenticate!(options={})
16
+ Githubris::API.basic_auth options[:login], options[:password]
17
+ end
18
18
 
19
- def self.resolve options
20
- method = options[:method].intern
21
- path = URI.parse(options[:path])
22
- puts "#{method} #{path}"
23
- Githubris::API.send(method, path)
19
+ def get_public_gists(options={})
20
+ quantity = options.delete(:quantity) || 30
21
+ number_of_overflow_gists = quantity % GISTS_PER_PAGE
22
+ if quantity > GISTS_PER_PAGE
23
+ max_page_number = (quantity / GISTS_PER_PAGE) +
24
+ (number_of_overflow_gists > 0 ? 1 : 0)
25
+
26
+ data = Githubris::API.get public_gists_path_for_page(max_page_number)
27
+ gists = @builder.build(data).
28
+ concat(get_public_gists(quantity: quantity - GISTS_PER_PAGE))
29
+ else
30
+ url = PUBLIC_GISTS_PATH
31
+ data = Githubris::API.get(url)
32
+ gists = @builder.build(data)
24
33
  end
34
+ gists.shift(quantity)
35
+ end
36
+
37
+ def get_user(options={})
38
+ Githubris::User.new
39
+ end
40
+
41
+ def public_gists_path_for_page page_number
42
+ "#{PUBLIC_GISTS_PATH}?page=#{page_number}"
25
43
  end
26
44
  end
@@ -1,26 +1,35 @@
1
- module Githubris
2
- class GistBuilder
3
- class << self
4
- def build data
5
- return data if data.instance_of? Githubris::Gist
6
- if data.instance_of? Array
7
- data.map do |gist_data|
8
- self.build gist_data
9
- end
10
- else
11
- data[:user] = Githubris::User.build data.delete('user')
12
- data[:public] = data.delete('public')
13
- data[:description] = data.delete('description')
14
- data[:files] = data.delete('files').values
15
- data[:url] = URI.parse data.delete('url')
16
- data[:created_at] = DateTime.parse data.delete('created_at')
17
- data[:updated_at] = DateTime.parse data.delete('updated_at')
18
- tmp_arr = []
19
- data.delete('comments').times { tmp_arr << Githubris::Comment.new }
20
- data[:comments] = tmp_arr
21
- Githubris::Gist.new data
22
- end
1
+ class Githubris
2
+ class Builder
3
+ def build data
4
+ if data.instance_of? Array
5
+ build_gists data
6
+ else
7
+ build_gist data
23
8
  end
24
9
  end
10
+
11
+ def build_gists(data)
12
+ data.map do |gist|
13
+ build_gist gist
14
+ end
15
+ end
16
+
17
+ def build_gist(data)
18
+ data[:user] = build_user(data.delete 'user' )
19
+ data[:public] = data.delete('public')
20
+ data[:description] = data.delete('description')
21
+ data[:files] = data.delete('files').values
22
+ data[:url] = URI.parse data.delete('url')
23
+ data[:created_at] = DateTime.parse data.delete('created_at')
24
+ data[:updated_at] = DateTime.parse data.delete('updated_at')
25
+ tmp_arr = []
26
+ data.delete('comments').times { tmp_arr << Githubris::Comment.new }
27
+ data[:comments] = tmp_arr
28
+ Githubris::Gist.new data
29
+ end
30
+
31
+ def build_user data
32
+ Githubris::User.new
33
+ end
25
34
  end
26
35
  end
@@ -1,4 +1,4 @@
1
- module Githubris
1
+ class Githubris
2
2
  class Comment
3
3
  def self.build comment_data
4
4
  end
@@ -1,4 +1,4 @@
1
- module Githubris
1
+ class Githubris
2
2
  class Gist
3
3
  class File
4
4
  def self.build data
@@ -1,15 +1,10 @@
1
- module Githubris
1
+ class Githubris
2
2
  class Gist
3
3
  autoload :File, 'githubris/gist/file'
4
4
 
5
5
  class << self
6
- def public_gists
7
- Githubris::API.call(:gists, :list_public)
8
- end
9
-
10
6
  def default_options
11
7
  {
12
- user: Githubris.authenticated_user,
13
8
  files: [],
14
9
  created_at: DateTime.now,
15
10
  updated_at: DateTime.now
@@ -51,10 +46,6 @@ module Githubris
51
46
  @options[:url]
52
47
  end
53
48
 
54
- def save
55
- Githubris::API.save_gist(self)
56
- end
57
-
58
49
  def public?
59
50
  @options[:public]
60
51
  end
@@ -1,4 +1,4 @@
1
- module Githubris
1
+ class Githubris
2
2
  class Issue
3
3
  autoload :Label, 'githubris/issue/label'
4
4
  autoload :Milestone, 'githubris/issue/milestone'
@@ -1,4 +1,4 @@
1
- module Githubris
1
+ class Githubris
2
2
  class Organization
3
3
  autoload :Team, 'githubris/organization/team'
4
4
  end
@@ -1,4 +1,4 @@
1
- module Githubris
1
+ class Githubris
2
2
  class Repository
3
3
  autoload :Download, 'githubris/repository/download'
4
4
  autoload :Fork, 'githubris/repository/fork'
@@ -1,11 +1,10 @@
1
- module Githubris
1
+ class Githubris
2
2
  class User
3
- def self.build user_data
4
- if user_data.instance_of? Githubris::User
5
- return user_data
6
- else
7
- self.new
8
- end
3
+ def initialize data={}
9
4
  end
5
+
6
+ def public_gists
7
+ end
8
+
10
9
  end
11
10
  end
@@ -1,3 +1,3 @@
1
- module Githubris
2
- VERSION = "0.0.1"
1
+ class Githubris
2
+ VERSION = "0.0.2"
3
3
  end
data/lib/githubris.rb CHANGED
@@ -1,12 +1,12 @@
1
1
  $:.push File.expand_path("../../config", __FILE__)
2
2
  require_relative "githubris/version"
3
3
 
4
- module Githubris
4
+ class Githubris
5
5
  autoload :API, 'githubris/api'
6
6
  autoload :Blob, 'githubris/blob'
7
+ autoload :Builder, 'githubris/builder'
7
8
  autoload :Comment, 'githubris/comment'
8
9
  autoload :Commit, 'githubris/commit'
9
- autoload :Config, 'githubris/config'
10
10
  autoload :Event, 'githubris/event'
11
11
  autoload :Gist, 'githubris/gist'
12
12
  autoload :Issue, 'githubris/issue'
@@ -18,21 +18,22 @@ module Githubris
18
18
  autoload :Tree, 'githubris/tree'
19
19
  autoload :User, 'githubris/user'
20
20
 
21
- class << self
22
- def login(user_name, api_key)
23
- @@authenticated_user = Githubris::User.new
24
- end
21
+ attr_reader :authenticated_user
25
22
 
26
- def logout
27
- @@authenticated_user = nil
28
- end
23
+ def initialize
24
+ @api = Githubris::API.new
25
+ end
26
+
27
+ def authenticate(username, password)
28
+ @api.authenticate! login: username, password: password
29
+ @authenticated_user = Githubris::User.new
30
+ end
31
+
32
+ def find_user(login)
33
+ @api.get_user(login: login)
34
+ end
29
35
 
30
- def authenticated_user
31
- begin
32
- @@authenticated_user
33
- rescue
34
- nil
35
- end
36
- end
36
+ def public_gists(options={})
37
+ @api.get_public_gists options
37
38
  end
38
39
  end
@@ -1,30 +1,28 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Githubris::API do
4
- describe 'making calls' do
5
- subject { Githubris::API }
6
-
7
- before do
8
- Githubris::API.stub(:resolve)
9
- end
10
-
11
- it 'takes a single required data requirement' do
12
- lambda { subject.call({}) }.should_not raise_error
4
+ describe '#get_public_gists' do
5
+ it 'returns an array of gists' do
6
+ subject.get_public_gists.should be_instance_of Array
7
+ subject.get_public_gists.each do |gist|
8
+ gist.should be_instance_of Githubris::Gist
9
+ end
13
10
  end
14
11
 
15
- it 'takes multiple arguments' do
16
- Githubris::Config.stub(:[] => {:bar => {:baz => {}}})
17
- lambda {
18
- subject.call({}, :foo)
19
- subject.call({}, :foo, :bar)
20
- subject.call({}, :foo, :bar, :baz)
21
- }.should_not raise_error
12
+ it 'accepts an options hash' do
13
+ lambda do
14
+ subject.get_public_gists({foo: 'bar'})
15
+ end.should_not raise_error
22
16
  end
23
17
 
24
- it 'uses the config' do
25
- Githubris::Config.stub(:[] => {})
26
- subject.call({}, :foo)
27
- Githubris::Config.should have_received(:[]).with(:foo)
18
+ context 'given a quantity option' do
19
+ it 'returns an array of gists with that quantity' do
20
+ subject.get_public_gists(quantity: 10).should have(10).items
21
+ subject.get_public_gists(quantity: 30).should have(30).items
22
+ subject.get_public_gists(quantity: 31).should have(31).items
23
+ subject.get_public_gists(quantity: 45).should have(45).items
24
+ subject.get_public_gists(quantity: 61).should have(61).items
25
+ end
28
26
  end
29
27
  end
30
28
  end
@@ -1,26 +1,42 @@
1
- require 'githubris/builder'
2
1
  require 'spec_helper'
3
2
 
4
- describe Githubris::GistBuilder do
5
- describe 'build' do
6
- let(:gist_data) { Githubris::SpecHelper.gist_data }
3
+ describe Githubris::Builder do
4
+ let(:gist_collection_data) { Githubris::SpecHelper.gist_collection_data }
5
+ let(:gist_data) { Githubris::SpecHelper.gist_data }
6
+
7
+ describe '#build' do
7
8
 
8
9
  context 'when passed a collection of gist data' do
9
- subject do
10
- Githubris::GistBuilder.build Githubris::SpecHelper.gist_collection_data
10
+ it 'delegates to #build_gists' do
11
+ Githubris::Builder.any_instance.stub(:build_gists)
12
+ subject.build gist_collection_data
13
+ subject.should have_received(:build_gists).with gist_collection_data
11
14
  end
15
+ end
12
16
 
13
- it { should be_instance_of Array }
17
+ context 'when passed the data for a single gist' do
18
+ it 'delegates to #build_gist' do
19
+ Githubris::Builder.any_instance.stub(:build_gist)
20
+ subject.build gist_data
21
+ subject.should have_received(:build_gist).with gist_data
22
+ end
23
+ end
24
+ end
14
25
 
15
- it 'is an array of gists' do
16
- subject.each do |gist|
17
- gist.should be_instance_of Githubris::Gist
18
- end
26
+ describe '#build_gists' do
27
+ it 'is an array of gists' do
28
+ gists = subject.build_gists(gist_collection_data)
29
+ gists.should be_instance_of Array
30
+ gists.each do |gist|
31
+ gist.should be_instance_of Githubris::Gist
19
32
  end
20
33
  end
34
+ end
21
35
 
22
- context 'when passed the data for a single gist' do
23
- subject { Githubris::GistBuilder.build gist_data }
36
+
37
+ describe '#build_gist' do
38
+ context 'schema' do
39
+ subject { Githubris::Builder.new.build gist_data }
24
40
 
25
41
  it { should be_instance_of Githubris::Gist }
26
42
  it { should be_public }
@@ -34,7 +50,7 @@ describe Githubris::GistBuilder do
34
50
  end
35
51
 
36
52
  context 'when passed a specific gist' do
37
- subject { Githubris::GistBuilder.build gist_data }
53
+ subject { Githubris::Builder.new.build gist_data }
38
54
 
39
55
  it 'is public' do
40
56
  subject.should be_public
@@ -1,16 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Githubris::Gist do
4
- describe '.public_gists' do
5
- context 'when there are a few gists' do
6
- it 'is an array of gists' do
7
- Githubris::API.stub(:call => [Githubris::Gist.new, Githubris::Gist.new])
8
- Githubris::Gist.public_gists.each do |gist|
9
- gist.should be_instance_of Githubris::Gist
10
- end
11
- end
12
- end
13
- end
14
4
 
15
5
  context 'instance methods' do
16
6
  subject { gist }
@@ -20,18 +10,6 @@ describe Githubris::Gist do
20
10
  DateTime.stub(:now => DateTime.new(2012, 12, 21, 12, 0, 0))
21
11
  gist.created_at.should eql DateTime.now
22
12
  end
23
- context "with a user is authenticated" do
24
- it 'new gists belong to the authenticated user' do
25
- Githubris.stub(:authenticated_user => Githubris::User.new )
26
- gist.user.should eql Githubris.authenticated_user
27
- end
28
- end
29
-
30
- context 'with no authenticated user' do
31
- it 'is nil' do
32
- gist.user.should be_nil
33
- end
34
- end
35
13
 
36
14
  context 'Gist owned by Isaac' do
37
15
  subject { Githubris::Gist.new user: user }
@@ -50,14 +28,6 @@ describe Githubris::Gist do
50
28
  end
51
29
 
52
30
  its(:files) { should have(1).items }
53
-
54
- describe 'saving' do
55
- it 'gets sent to github' do
56
- Githubris::API.stub(:save_gist)
57
- subject.save
58
- Githubris::API.should have_received(:save_gist).with(subject)
59
- end
60
- end
61
31
  end
62
32
  end
63
33
  end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ describe Githubris do
4
+ describe '#authenticate' do
5
+ before do
6
+ Githubris::API.stub(:basic_auth => Githubris::User.new)
7
+ subject.authenticate('username', 'password')
8
+ end
9
+
10
+ it 'authenticates via Basic Auth' do
11
+ Githubris::API.should have_received(:basic_auth).with('username', 'password')
12
+ end
13
+
14
+ it 'sets the authenticated user' do
15
+ subject.authenticated_user.should_not be_nil
16
+ end
17
+ end
18
+
19
+ describe '#find_user' do
20
+ it 'requests gets user from githubris api' do
21
+ user = Githubris::User.new(login: "frank")
22
+ Githubris::API.any_instance.stub(:get_user).and_return(user)
23
+ subject.find_user("frank").should == user
24
+ end
25
+
26
+ it 'returns a user' do
27
+ subject.find_user('frank').should be_instance_of Githubris::User
28
+ end
29
+ end
30
+
31
+ describe '#public_gists' do
32
+ it 'should contain only gists' do
33
+ subject.public_gists.each do |gist|
34
+ gist.should be_instance_of Githubris::Gist
35
+ end
36
+ end
37
+
38
+ it 'can take an options hash' do
39
+ lambda { subject.public_gists(foo: 'bar') }.should_not raise_error
40
+ end
41
+
42
+ it 'delegates and passes the options hash to the API' do
43
+ Githubris::API.any_instance.stub(:get_public_gists)
44
+ subject.public_gists({foo: 'bar'})
45
+ subject.instance_variable_get(:@api).should have_received(:get_public_gists).with({foo: 'bar'})
46
+ end
47
+ end
48
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,8 +1,15 @@
1
1
  require 'rspec-spies'
2
- require 'pry'
3
2
  require 'fakeweb'
3
+ require 'simplecov'
4
4
  require 'githubris'
5
5
 
6
6
  require 'support/fixtures'
7
7
  require 'support/fakeweb_responses'
8
8
  require 'support/custom_matchers'
9
+
10
+ SimpleCov.start do
11
+ add_filter '/spec/'
12
+ add_filter '/features/'
13
+ add_filter '/pkg/'
14
+ add_filter '/coverage/'
15
+ end
@@ -2,60 +2,5 @@ require 'fakeweb'
2
2
 
3
3
  FakeWeb.allow_net_connect = false
4
4
  FakeWeb.register_uri(:get, 'https://api.github.com/', :body => '{}')
5
- FakeWeb.register_uri(:get, 'https://api.github.com/gists', :body => <<-BODY
6
- [
7
- {
8
- "url": "https://api.github.com/gists/2",
9
- "id": "2",
10
- "description": "description of gist number two",
11
- "public": true,
12
- "user": {
13
- "login": "rocktocat",
14
- "id": 1,
15
- "avatar_url": "https://github.com/images/error/octocat_happy.gif",
16
- "gravatar_id": "somehexcode",
17
- "url": "https://api.github.com/users/octocat"
18
- },
19
- "files": {
20
- "ring.erl": {
21
- "size": 932,
22
- "filename": "ring.erl",
23
- "raw_url": "https://gist.github.com/raw/365370/8c4d2d43d178df44f4c03a7f2ac0ff512853564e/ring.erl",
24
- "content": "contents of gist"
25
- }
26
- },
27
- "comments": 0,
28
- "html_url": "https://gist.github.com/1",
29
- "git_pull_url": "git://gist.github.com/1.git",
30
- "git_push_url": "git@gist.github.com:1.git",
31
- "created_at": "2010-04-14T02:15:15Z"
32
- },
33
- {
34
- "url": "https://api.github.com/gists/1",
35
- "id": "1",
36
- "description": "description of gist",
37
- "public": true,
38
- "user": {
39
- "login": "octocat",
40
- "id": 1,
41
- "avatar_url": "https://github.com/images/error/octocat_happy.gif",
42
- "gravatar_id": "somehexcode",
43
- "url": "https://api.github.com/users/octocat"
44
- },
45
- "files": {
46
- "ring.erl": {
47
- "size": 932,
48
- "filename": "ring.erl",
49
- "raw_url": "https://gist.github.com/raw/365370/8c4d2d43d178df44f4c03a7f2ac0ff512853564e/ring.erl",
50
- "content": "contents of gist"
51
- }
52
- },
53
- "comments": 0,
54
- "html_url": "https://gist.github.com/1",
55
- "git_pull_url": "git://gist.github.com/1.git",
56
- "git_push_url": "git@gist.github.com:1.git",
57
- "created_at": "2010-04-14T02:15:15Z"
58
- }
59
- ]
60
- BODY
61
- )
5
+ FakeWeb.register_uri(:get, /gists\/public(?:[^?]*\?page=(\d+))?/,
6
+ :body => File.open("spec/support/public_gists_page_#{$1 || 1}.json", 'r') {|f| f.read })
@@ -1,4 +1,4 @@
1
- module Githubris
1
+ class Githubris
2
2
  module SpecHelper
3
3
  def self.gist_collection_data
4
4
  [