github_api 0.9.7 → 0.10.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.
Files changed (60) hide show
  1. data/README.md +24 -14
  2. data/features/cassettes/media/get_default.yml +84 -0
  3. data/features/cassettes/media/get_full_json.yml +83 -0
  4. data/features/cassettes/media/get_html_json.yml +81 -0
  5. data/features/cassettes/media/get_raw_json.yml +80 -0
  6. data/features/cassettes/media/get_text_json.yml +80 -0
  7. data/features/cassettes/repos/stats/commits.yml +80 -0
  8. data/features/cassettes/repos/stats/contribs.yml +221 -0
  9. data/features/cassettes/repos/stats/frequency.yml +54 -0
  10. data/features/cassettes/repos/stats/participation.yml +68 -0
  11. data/features/cassettes/repos/stats/punch.yml +76 -0
  12. data/features/cassettes/search/users_keyword.yml +70 -0
  13. data/features/gitignore.feature +1 -1
  14. data/features/media_type.feature +76 -0
  15. data/features/repos/statistics.feature +60 -0
  16. data/features/search.feature +11 -0
  17. data/features/step_definitions/github_api_steps.rb +4 -0
  18. data/lib/github_api.rb +2 -0
  19. data/lib/github_api/arguments.rb +1 -1
  20. data/lib/github_api/authorization.rb +1 -1
  21. data/lib/github_api/connection.rb +5 -7
  22. data/lib/github_api/core_ext/deep_merge.rb +13 -0
  23. data/lib/github_api/git_data/trees.rb +1 -1
  24. data/lib/github_api/gitignore.rb +5 -4
  25. data/lib/github_api/markdown.rb +7 -5
  26. data/lib/github_api/mime_type.rb +19 -41
  27. data/lib/github_api/paged_request.rb +1 -1
  28. data/lib/github_api/parameter_filter.rb +1 -1
  29. data/lib/github_api/params_hash.rb +59 -22
  30. data/lib/github_api/repos.rb +9 -3
  31. data/lib/github_api/repos/pub_sub_hubbub.rb +4 -2
  32. data/lib/github_api/repos/statistics.rb +94 -0
  33. data/lib/github_api/request.rb +17 -28
  34. data/lib/github_api/response_wrapper.rb +8 -0
  35. data/lib/github_api/say.rb +2 -1
  36. data/lib/github_api/scopes.rb +3 -2
  37. data/lib/github_api/search.rb +3 -3
  38. data/lib/github_api/utils/url.rb +5 -2
  39. data/lib/github_api/version.rb +2 -2
  40. data/spec/fixtures/repos/commit_activity.json +15 -0
  41. data/spec/fixtures/repos/contribs.json +20 -0
  42. data/spec/fixtures/repos/frequency.json +7 -0
  43. data/spec/fixtures/repos/participation.json +110 -0
  44. data/spec/fixtures/repos/punch_card.json +17 -0
  45. data/spec/github/arguments/parse_spec.rb +2 -2
  46. data/spec/github/core_ext/deep_merge_spec.rb +23 -0
  47. data/spec/github/git_data/trees/create_spec.rb +6 -0
  48. data/spec/github/gitignore/get_spec.rb +1 -1
  49. data/spec/github/mime_type_spec.rb +24 -55
  50. data/spec/github/params_hash_spec.rb +64 -0
  51. data/spec/github/pull_requests/list_spec.rb +1 -1
  52. data/spec/github/repos/statistics/code_frequency_spec.rb +25 -0
  53. data/spec/github/repos/statistics/commit_activity_spec.rb +29 -0
  54. data/spec/github/repos/statistics/contributors_spec.rb +29 -0
  55. data/spec/github/repos/statistics/participation_spec.rb +25 -0
  56. data/spec/github/repos/statistics/punch_card_spec.rb +25 -0
  57. data/spec/github/request_spec.rb +10 -11
  58. data/spec/github/response_wrapper/overwrites_spec.rb +19 -0
  59. data/spec/github/users/keys/update_spec.rb +1 -1
  60. metadata +73 -34
@@ -0,0 +1,20 @@
1
+ [
2
+ {
3
+ "author": {
4
+ "login": "octocat",
5
+ "id": 1,
6
+ "avatar_url": "https://github.com/images/error/octocat_happy.gif",
7
+ "gravatar_id": "somehexcode",
8
+ "url": "https://api.github.com/users/octocat"
9
+ },
10
+ "total": 135,
11
+ "weeks": [
12
+ {
13
+ "w": "1367712000",
14
+ "a": 6898,
15
+ "d": 77,
16
+ "c": 10
17
+ }
18
+ ]
19
+ }
20
+ ]
@@ -0,0 +1,7 @@
1
+ [
2
+ [
3
+ 1302998400,
4
+ 1124,
5
+ -435
6
+ ]
7
+ ]
@@ -0,0 +1,110 @@
1
+ {
2
+ "all": [
3
+ 11,
4
+ 21,
5
+ 15,
6
+ 2,
7
+ 8,
8
+ 1,
9
+ 8,
10
+ 23,
11
+ 17,
12
+ 21,
13
+ 11,
14
+ 10,
15
+ 33,
16
+ 91,
17
+ 38,
18
+ 34,
19
+ 22,
20
+ 23,
21
+ 32,
22
+ 3,
23
+ 43,
24
+ 87,
25
+ 71,
26
+ 18,
27
+ 13,
28
+ 5,
29
+ 13,
30
+ 16,
31
+ 66,
32
+ 27,
33
+ 12,
34
+ 45,
35
+ 110,
36
+ 117,
37
+ 13,
38
+ 8,
39
+ 18,
40
+ 9,
41
+ 19,
42
+ 26,
43
+ 39,
44
+ 12,
45
+ 20,
46
+ 31,
47
+ 46,
48
+ 91,
49
+ 45,
50
+ 10,
51
+ 24,
52
+ 9,
53
+ 29,
54
+ 7
55
+ ],
56
+ "owner": [
57
+ 3,
58
+ 2,
59
+ 3,
60
+ 0,
61
+ 2,
62
+ 0,
63
+ 5,
64
+ 14,
65
+ 7,
66
+ 9,
67
+ 1,
68
+ 5,
69
+ 0,
70
+ 48,
71
+ 19,
72
+ 2,
73
+ 0,
74
+ 1,
75
+ 10,
76
+ 2,
77
+ 23,
78
+ 40,
79
+ 35,
80
+ 8,
81
+ 8,
82
+ 2,
83
+ 10,
84
+ 6,
85
+ 30,
86
+ 0,
87
+ 2,
88
+ 9,
89
+ 53,
90
+ 104,
91
+ 3,
92
+ 3,
93
+ 10,
94
+ 4,
95
+ 7,
96
+ 11,
97
+ 21,
98
+ 4,
99
+ 4,
100
+ 22,
101
+ 26,
102
+ 63,
103
+ 11,
104
+ 2,
105
+ 14,
106
+ 1,
107
+ 10,
108
+ 3
109
+ ]
110
+ }
@@ -0,0 +1,17 @@
1
+ [
2
+ [
3
+ 0,
4
+ 0,
5
+ 5
6
+ ],
7
+ [
8
+ 0,
9
+ 1,
10
+ 43
11
+ ],
12
+ [
13
+ 0,
14
+ 2,
15
+ 21
16
+ ]
17
+ ]
@@ -17,7 +17,7 @@ describe Github::Arguments, '#parse' do
17
17
 
18
18
  it { should == object }
19
19
 
20
- its(:params) { should == params }
20
+ its(:params) { should == {"page" => 23} }
21
21
 
22
22
  context 'sets parameters' do
23
23
  it { subject.api.user.should == 'peter-murach' }
@@ -63,6 +63,6 @@ describe Github::Arguments, '#parse' do
63
63
  let(:required) { [] }
64
64
  let(:arguments) { [params] }
65
65
 
66
- its(:params) { should == params }
66
+ its(:params) { should == {"page" => 23} }
67
67
  end
68
68
  end
@@ -0,0 +1,23 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Hash, 'deep_merge' do
6
+
7
+ let(:hash) { { :a => 'a', :b => "b", :c => {:c1 => "c1", :c2 => "c2", :c3 => {:d1 => "d1"} } } }
8
+ let(:other_hash) { { :a => 1, :b => "b", :c => {:c1 => 2, :c2 => "c2", :c3 => {:d1 => "d1", :d2 => "d2"} } } }
9
+
10
+ subject { hash.deep_merge(other_hash) }
11
+
12
+ it { expect(subject[:a]).to eql(1) }
13
+
14
+ it { expect(subject[:b]).to eql("b") }
15
+
16
+ it { expect(subject[:c][:c1]).to eql(2) }
17
+
18
+ it { expect(subject[:c][:c2]).to eql("c2") }
19
+
20
+ it { expect(subject[:c][:c3][:d1]).to eql("d1") }
21
+
22
+ it { expect(subject[:c][:c3][:d2]).to eql("d2") }
23
+ end
@@ -49,6 +49,12 @@ describe Github::GitData::Trees, '#create' do
49
49
  tree_sha.should be_a Github::ResponseWrapper
50
50
  end
51
51
 
52
+ it "should not erase the tree data while evaluating params" do
53
+ original_tree = inputs['tree'].dup
54
+ tree_sha = subject.create user, repo, inputs
55
+ inputs['tree'].should == original_tree
56
+ end
57
+
52
58
  it "should get the tree information" do
53
59
  tree_sha = subject.create user, repo, inputs
54
60
  tree_sha.sha.should == sha
@@ -42,7 +42,7 @@ describe Github::Gitignore, '#get' do
42
42
  let(:accept) { 'application/vnd.github.raw' }
43
43
 
44
44
  it "should get the resource" do
45
- subject.get template, 'mime' => 'application/vnd.github.raw'
45
+ subject.get template, 'accept' => 'application/vnd.github.raw'
46
46
  a_get(request_path).should have_been_made
47
47
  end
48
48
  end
@@ -2,69 +2,38 @@ require 'spec_helper'
2
2
 
3
3
  describe Github::MimeType do
4
4
 
5
- let(:github) { Github.new }
5
+ let(:object) { Class.new.extend(described_class) }
6
6
 
7
- it "should lookup mime type for :full" do
8
- github.lookup_mime(:full).should == 'full+json'
9
- end
10
-
11
- it "should lookup mime type for :html" do
12
- github.lookup_mime(:html).should == 'html+json'
13
- end
14
-
15
- it "should lookup mime type for :html" do
16
- github.lookup_mime(:text).should == 'text+json'
17
- end
7
+ context 'lookup' do
8
+ it 'retrieves media type' do
9
+ expect(object.lookup_media('text')).to eql('text+json')
10
+ end
18
11
 
19
- it "should lookup mime type for :raw" do
20
- github.lookup_mime(:raw).should == 'raw+json'
12
+ it 'raises error on unkonwn media type' do
13
+ expect { object.lookup_media('unknown') }.to raise_error(ArgumentError)
14
+ end
21
15
  end
22
16
 
23
- it "should default to json if no parameters given" do
24
- Github.should_receive(:parse).and_return 'application/json'
25
- Github.parse.should == 'application/json'
26
- end
17
+ context 'parse' do
18
+ it 'accepts text' do
19
+ expect(object.parse('text')).to eql('application/vnd.github.v3.text+json')
20
+ end
27
21
 
28
- it "should accept header for 'issue' request" do
29
- Github.should_receive(:parse).with(:issue, :full).
30
- and_return 'application/vnd.github-issue.full+json'
31
- Github.parse(:issue, :full).should == 'application/vnd.github-issue.full+json'
32
- end
22
+ it 'accepts text+json' do
23
+ expect(object.parse('text+json')).to eql('application/vnd.github.v3.text+json')
24
+ end
33
25
 
34
- it "should accept header for 'isssue comment' request" do
35
- Github.should_receive(:parse).with(:issue_comment, :full).
36
- and_return 'application/vnd.github-issuecomment.full+json'
37
- Github.parse(:issue_comment, :full).should == 'application/vnd.github-issuecomment.full+json'
38
- end
26
+ it 'accepts v3.text' do
27
+ expect(object.parse('v3.text')).to eql('application/vnd.github.v3.text+json')
28
+ end
39
29
 
40
- it "should accept header for 'commit comment' request" do
41
- Github.should_receive(:parse).with(:commit_comment, :full).
42
- and_return 'application/vnd.github-commitcomment.full+json'
43
- Github.parse(:commit_comment, :full).should == 'application/vnd.github-commitcomment.full+json'
44
- end
45
-
46
- it "should accept header for 'pull requst' request" do
47
- Github.should_receive(:parse).with(:pull_request, :full).
48
- and_return 'application/vnd.github-pull.full+json'
49
- Github.parse(:pull_request, :full).should == 'application/vnd.github-pull.full+json'
50
- end
51
-
52
- it "should accept header for 'pull comment' request" do
53
- Github.should_receive(:parse).with(:pull_comment, :full).
54
- and_return 'application/vnd.github-pullcomment.full+json'
55
- Github.parse(:pull_comment, :full).should == 'application/vnd.github-pullcomment.full+json'
56
- end
57
-
58
- it "should accept header for 'gist comment' request" do
59
- Github.should_receive(:parse).with(:gist_comment, :full).
60
- and_return 'application/vnd.github-gistcomment.full+json'
61
- Github.parse(:gist_comment, :full).should == 'application/vnd.github-gistcomment.full+json'
62
- end
30
+ it 'accepts v3.text+json' do
31
+ expect(object.parse('v3.text+json')).to eql('application/vnd.github.v3.text+json')
32
+ end
63
33
 
64
- it "should accept header for 'blog' request" do
65
- Github.should_receive(:parse).with(:blob, :blob).
66
- and_return 'application/vnd.github-blob.raw'
67
- Github.parse(:blob, :blob).should == 'application/vnd.github-blob.raw'
34
+ it 'accpets .v3.text' do
35
+ expect(object.parse('.v3.text')).to eql('application/vnd.github.v3.text+json')
36
+ end
68
37
  end
69
38
 
70
39
  end # Github::MimeType
@@ -0,0 +1,64 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Github::ParamsHash do
6
+ let(:object) { described_class }
7
+
8
+ subject { object.new(hash) }
9
+
10
+ context 'converts key to string' do
11
+ let(:hash) { {:foo => 123 }}
12
+
13
+ it { expect(subject).to be_a(Github::ParamsHash)}
14
+
15
+ it { expect(subject['foo']).to eql(123) }
16
+
17
+ it { expect(subject.data).to eql({"foo" => 123}) }
18
+ end
19
+
20
+ context 'media' do
21
+ let(:hash) { {:media => "raw"} }
22
+
23
+ it 'parses media key' do
24
+ expect(subject.media).to eql('application/vnd.github.v3.raw+json')
25
+ end
26
+ end
27
+
28
+ context 'with accept' do
29
+ let(:hash) { {:accept => "application/json"} }
30
+
31
+ it 'overwrites media key' do
32
+ expect(subject.accept).to eql('application/json')
33
+ end
34
+ end
35
+
36
+ context 'without accept' do
37
+ let(:hash) { {} }
38
+
39
+ it 'overwrites media key' do
40
+ expect(subject.accept).to be_nil
41
+ end
42
+ end
43
+
44
+ context 'extract data' do
45
+ let(:hash) { {:data => 'foobar'} }
46
+
47
+ it { expect(subject.data).to eql('foobar') }
48
+ end
49
+
50
+ context 'merges defaults' do
51
+ let(:hash) { { :homepage => "https://tty.github.io" }}
52
+ let(:defaults) {
53
+ { "homepage" => "https://github.com",
54
+ "private" => false}
55
+ }
56
+
57
+ it 'correctly updates values' do
58
+ subject.merge_default(defaults)
59
+ expect(subject['homepage']).to eql("https://tty.github.io")
60
+ expect(subject['private']).to be_false
61
+ end
62
+ end
63
+
64
+ end
@@ -28,7 +28,7 @@ describe Github::PullRequests, '#list' do
28
28
 
29
29
  it "should get the resources" do
30
30
  subject.list user, repo, inputs
31
- a_get(request_path).with(:query => inputs).should have_been_made
31
+ a_get(request_path).with(:query => inputs.except('unrelated')).should have_been_made
32
32
  end
33
33
 
34
34
  it_should_behave_like 'an array of resources' do
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Github::Repos::Statistics, '#code_frequency' do
6
+ let(:user) { 'peter-murach' }
7
+ let(:repo) { 'github' }
8
+ let(:request_path) { "/repos/#{user}/#{repo}/stats/code_frequency" }
9
+
10
+ before {
11
+ stub_get(request_path).to_return(:body => body)
12
+ }
13
+
14
+ context "resource found" do
15
+ let(:body) { fixture('repos/frequency.json') }
16
+ let(:status) { 200 }
17
+
18
+ it { expect { subject.code_frequency }.to raise_error(ArgumentError) }
19
+
20
+ it "should get the resources" do
21
+ subject.code_frequency user, repo
22
+ a_get(request_path).should have_been_made
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Github::Repos::Statistics, '#commit_activity' do
6
+ let(:user) { 'peter-murach' }
7
+ let(:repo) { 'github' }
8
+ let(:request_path) { "/repos/#{user}/#{repo}/stats/commit_activity" }
9
+
10
+ before {
11
+ stub_get(request_path).to_return(:body => body)
12
+ }
13
+
14
+ context "resource found" do
15
+ let(:body) { fixture('repos/commit_activity.json') }
16
+ let(:status) { 200 }
17
+
18
+ it { expect { subject.commit_activity }.to raise_error(ArgumentError) }
19
+
20
+ it "should get the resources" do
21
+ subject.commit_activity user, repo
22
+ a_get(request_path).should have_been_made
23
+ end
24
+
25
+ it_should_behave_like 'an array of resources' do
26
+ let(:requestable) { subject.commit_activity user, repo }
27
+ end
28
+ end
29
+ end