tinybucket 0.1.7 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.rubocop.yml +2 -1
  4. data/Gemfile +4 -4
  5. data/README.md +48 -20
  6. data/Rakefile +7 -0
  7. data/lib/tinybucket.rb +7 -4
  8. data/lib/tinybucket/api/base_api.rb +2 -19
  9. data/lib/tinybucket/api/branch_restrictions_api.rb +35 -11
  10. data/lib/tinybucket/api/comments_api.rb +38 -4
  11. data/lib/tinybucket/api/commits_api.rb +60 -10
  12. data/lib/tinybucket/api/diff_api.rb +22 -0
  13. data/lib/tinybucket/api/helper/api_helper.rb +0 -11
  14. data/lib/tinybucket/api/helper/commits_helper.rb +7 -0
  15. data/lib/tinybucket/api/pull_requests_api.rb +79 -22
  16. data/lib/tinybucket/api/repo_api.rb +37 -17
  17. data/lib/tinybucket/api/repos_api.rb +13 -6
  18. data/lib/tinybucket/api/team_api.rb +54 -29
  19. data/lib/tinybucket/api/user_api.rb +43 -23
  20. data/lib/tinybucket/api_factory.rb +2 -4
  21. data/lib/tinybucket/client.rb +39 -20
  22. data/lib/tinybucket/config.rb +1 -1
  23. data/lib/tinybucket/connection.rb +3 -3
  24. data/lib/tinybucket/enumerator.rb +44 -0
  25. data/lib/tinybucket/error.rb +2 -0
  26. data/lib/tinybucket/error/conflict.rb +6 -0
  27. data/lib/tinybucket/error/not_found.rb +6 -0
  28. data/lib/tinybucket/error/service_error.rb +8 -4
  29. data/lib/tinybucket/iterator.rb +77 -0
  30. data/lib/tinybucket/model/base.rb +6 -6
  31. data/lib/tinybucket/model/branch_restriction.rb +27 -0
  32. data/lib/tinybucket/model/comment.rb +32 -6
  33. data/lib/tinybucket/model/commit.rb +63 -9
  34. data/lib/tinybucket/model/concerns.rb +1 -0
  35. data/lib/tinybucket/model/concerns/enumerable.rb +18 -0
  36. data/lib/tinybucket/model/error_response.rb +16 -1
  37. data/lib/tinybucket/model/page.rb +25 -49
  38. data/lib/tinybucket/model/profile.rb +56 -8
  39. data/lib/tinybucket/model/pull_request.rb +114 -18
  40. data/lib/tinybucket/model/repository.rb +177 -36
  41. data/lib/tinybucket/model/team.rb +70 -10
  42. data/lib/tinybucket/request.rb +2 -0
  43. data/lib/tinybucket/response.rb +1 -1
  44. data/lib/tinybucket/response/handler.rb +21 -0
  45. data/lib/tinybucket/version.rb +1 -1
  46. data/spec/fixtures/repositories/test_owner/test_repo/commit/1/approve/post.json +16 -0
  47. data/spec/lib/tinybucket/api/branch_restrictions_api_spec.rb +1 -2
  48. data/spec/lib/tinybucket/api/comments_api_spec.rb +1 -2
  49. data/spec/lib/tinybucket/api/commits_api_spec.rb +92 -3
  50. data/spec/lib/tinybucket/api/pull_requests_api_spec.rb +34 -4
  51. data/spec/lib/tinybucket/api/repo_api_spec.rb +1 -2
  52. data/spec/lib/tinybucket/api/repos_api_spec.rb +1 -2
  53. data/spec/lib/tinybucket/api/team_api_spec.rb +1 -6
  54. data/spec/lib/tinybucket/api/user_api_spec.rb +15 -2
  55. data/spec/lib/tinybucket/api_factory_spec.rb +2 -7
  56. data/spec/lib/tinybucket/client_spec.rb +10 -25
  57. data/spec/lib/tinybucket/error/service_error_spec.rb +23 -0
  58. data/spec/lib/tinybucket/model/commit_spec.rb +27 -4
  59. data/spec/lib/tinybucket/model/page_spec.rb +0 -30
  60. data/spec/lib/tinybucket/model/profile_spec.rb +3 -3
  61. data/spec/lib/tinybucket/model/pull_request_spec.rb +11 -5
  62. data/spec/lib/tinybucket/model/repository_spec.rb +5 -5
  63. data/spec/lib/tinybucket/model/team_spec.rb +4 -4
  64. data/spec/lib/tinybucket_spec.rb +10 -27
  65. data/spec/spec_helper.rb +3 -2
  66. data/spec/support/api_response_macros.rb +2 -2
  67. metadata +12 -3
  68. data/lib/tinybucket/response/error_handler.rb +0 -14
@@ -1,14 +1,36 @@
1
1
  module Tinybucket
2
2
  module Api
3
+ # Diff Api client
4
+ #
5
+ # @see https://confluence.atlassian.com/bitbucket/diff-resource-425462484.html
6
+ # diff Resource
7
+ #
8
+ # @!attribute [rw] repo_owner
9
+ # @return [String] repository owner name.
10
+ # @!attribute [rw] repo_slug
11
+ # @return [String] repository slug. (about {https://confluence.atlassian.com/bitbucket/repositories-endpoint-423626330.html#repositoriesEndpoint-Overview
12
+ # repo_slug})
3
13
  class DiffApi < BaseApi
4
14
  include Tinybucket::Api::Helper::DiffHelper
5
15
 
6
16
  attr_accessor :repo_owner, :repo_slug
7
17
 
18
+ # Send 'GET a diff' request
19
+ #
20
+ # @param spec [String] A specification such as a branch name,
21
+ # revision, or commit SHA.
22
+ # @param options [Hash]
23
+ # @return [String] diff as raw text
8
24
  def find(spec, options = {})
9
25
  get_path(path_to_find(spec), options)
10
26
  end
11
27
 
28
+ # Send 'GET a patch' request
29
+ #
30
+ # @param spec [String] A specification such as a branch name,
31
+ # revision, or commit SHA.
32
+ # @param options [Hash]
33
+ # @return [String] patch as raw text
12
34
  def find_patch(spec, options = {})
13
35
  get_path(path_to_patch(spec), options)
14
36
  end
@@ -10,17 +10,6 @@ module Tinybucket
10
10
  end
11
11
  end
12
12
 
13
- def inject_api_config(result)
14
- case result
15
- when Tinybucket::Model::Page
16
- result.items.map { |m| m.api_config = @config.dup }
17
- when Tinybucket::Model::Base
18
- result.api_config = @config.dup
19
- end
20
-
21
- result
22
- end
23
-
24
13
  def urlencode(v, key)
25
14
  if v.blank? || (escaped = CGI.escape(v.to_s)).blank?
26
15
  msg = "Invalid #{key} parameter. (#{v})"
@@ -16,6 +16,13 @@ module Tinybucket
16
16
  [revision, 'revision'])
17
17
  end
18
18
 
19
+ def path_to_approve(revision)
20
+ build_path(base_path,
21
+ 'commit',
22
+ [revision, 'revision'],
23
+ 'approve')
24
+ end
25
+
19
26
  def base_path
20
27
  build_path('/repositories',
21
28
  [repo_owner, 'repo_owner'],
@@ -1,56 +1,113 @@
1
1
  module Tinybucket
2
2
  module Api
3
+ # PullRequests Api client
4
+ #
5
+ # @see https://confluence.atlassian.com/bitbucket/pullrequests-resource-423626332.html
6
+ # pullrequests Resource
7
+ #
8
+ # @!attribute [rw] repo_owner
9
+ # @return [String] repository owner name.
10
+ # @!attribute [rw] repo_slug
11
+ # @return [String] repository slug. (about {https://confluence.atlassian.com/bitbucket/repositories-endpoint-423626330.html#repositoriesEndpoint-Overview
12
+ # repo_slug})
3
13
  class PullRequestsApi < BaseApi
4
14
  include Tinybucket::Api::Helper::PullRequestsHelper
5
15
 
6
16
  attr_accessor :repo_owner, :repo_slug
7
17
 
18
+ # Send 'GET a list of open pull requests' request
19
+ #
20
+ # @param options [Hash]
21
+ # @return [Tinybucket::Model::Page]
8
22
  def list(options = {})
9
- list = get_path(path_to_list,
10
- options,
11
- Tinybucket::Parser::PullRequestsParser)
12
-
13
- list.next_proc = next_proc(:list, options)
14
- inject_api_config(list)
23
+ get_path(
24
+ path_to_list,
25
+ options,
26
+ Tinybucket::Parser::PullRequestsParser
27
+ )
15
28
  end
16
29
 
30
+ # Send 'GET a specific pull request' request
31
+ #
32
+ # @param pr_id [String] The pull request identifier
33
+ # @param options [Hash]
34
+ # @return [Tinybucket::Model::PullRequest]
17
35
  def find(pr_id, options = {})
18
- m = get_path(path_to_find(pr_id),
19
- options,
20
- Tinybucket::Parser::PullRequestParser)
21
-
22
- inject_api_config(m)
36
+ get_path(
37
+ path_to_find(pr_id),
38
+ options,
39
+ Tinybucket::Parser::PullRequestParser
40
+ )
23
41
  end
24
42
 
43
+ # Send 'GET the commits for a pull request' request
44
+ #
45
+ # @param pr_id [String] The pull request identifier
46
+ # @param options [Hash]
47
+ # @return [Tinybucket::Model::PullRequest]
25
48
  def commits(pr_id, options = {})
26
- list = get_path(path_to_commits(pr_id),
27
- options,
28
- Tinybucket::Parser::CommitsParser)
29
-
30
- list.next_proc = next_proc(:commits, options)
31
- inject_api_config(list)
49
+ get_path(
50
+ path_to_commits(pr_id),
51
+ options,
52
+ Tinybucket::Parser::CommitsParser
53
+ )
32
54
  end
33
55
 
56
+ # Send 'POST a pull request approval' request
57
+ #
58
+ # @note This method return true if this pull request already approved.
59
+ #
60
+ # @param pr_id [String] The pull request identifier
61
+ # @param options [Hash]
62
+ # @return [true, false]
34
63
  def approve(pr_id, options = {})
35
64
  result = post_path(path_to_approve(pr_id), options)
36
65
  (result['approved'] == true)
66
+ rescue Tinybucket::Error::Conflict => e
67
+ logger.debug 'Already approved: ' + e.inspect
68
+ true
37
69
  end
38
70
 
71
+ # Send 'DELETE a pull request approval' request
72
+ #
73
+ # @note This method return true if this pull request is not approved yet.
74
+ #
75
+ # @param pr_id [String] The pull request identifier
76
+ # @param options [Hash]
77
+ # @return [true]
78
+ def unapprove(pr_id, options = {})
79
+ delete_path(path_to_approve(pr_id), options)
80
+ true
81
+ rescue Tinybucket::Error::NotFound => e
82
+ logger.debug 'Already unapproved: ' + e.inspect
83
+ true
84
+ end
85
+
86
+ # Send 'Decline or reject a pull request' request
87
+ #
88
+ # @param pr_id [String] The pull request identifier
89
+ # @param options [Hash]
90
+ # @return [true, false]
39
91
  def decline(pr_id, options = {})
40
92
  result = post_path(path_to_decline(pr_id), options)
41
93
  (result['state'] == 'DECLINED')
42
94
  end
43
95
 
44
- def unapprove(pr_id, options = {})
45
- result = delete_path(path_to_approve(pr_id), options)
46
- (result['approved'] == false)
47
- end
48
-
96
+ # Send 'Accept and merge a pull request' request
97
+ #
98
+ # @param pr_id [String] The pull request identifier
99
+ # @param options [Hash]
100
+ # @return [true, false]
49
101
  def merge(pr_id, options = {})
50
102
  result = post_path(path_to_merge(pr_id), options)
51
103
  (result['state'] == 'MERGED')
52
104
  end
53
105
 
106
+ # Send 'GET the diff for a pull request' request
107
+ #
108
+ # @param pr_id [String] The pull request identifier
109
+ # @param options [Hash]
110
+ # @return [String] diff as raw text.
54
111
  def diff(pr_id, options = {})
55
112
  get_path(path_to_diff(pr_id), options)
56
113
  end
@@ -1,34 +1,54 @@
1
1
  module Tinybucket
2
2
  module Api
3
+ # Repo Api client
4
+ #
5
+ # @see https://confluence.atlassian.com/bitbucket/repository-resource-423626331.html
6
+ # repository Resource
7
+ #
8
+ # @!attribute [rw] repo_owner
9
+ # @return [String] repository owner name.
10
+ # @!attribute [rw] repo_slug
11
+ # @return [String] repository slug. (about {https://confluence.atlassian.com/bitbucket/repositories-endpoint-423626330.html#repositoriesEndpoint-Overview
12
+ # repo_slug})
3
13
  class RepoApi < BaseApi
4
14
  include Tinybucket::Api::Helper::RepoHelper
5
15
 
6
16
  attr_accessor :repo_owner, :repo_slug
7
17
 
18
+ # Send 'GET a repository' request
19
+ #
20
+ # @param options [Hash]
21
+ # @return [Tinybucket::Model::Repository]
8
22
  def find(options = {})
9
- repo = get_path(path_to_find,
10
- options,
11
- Tinybucket::Parser::RepoParser)
12
-
13
- inject_api_config(repo)
23
+ get_path(
24
+ path_to_find,
25
+ options,
26
+ Tinybucket::Parser::RepoParser
27
+ )
14
28
  end
15
29
 
30
+ # Send 'GET a list of watchers' request
31
+ #
32
+ # @param options [Hash]
33
+ # @return [Tinybucket::Model::Page]
16
34
  def watchers(options = {})
17
- list = get_path(path_to_watchers,
18
- options,
19
- Tinybucket::Parser::ProfilesParser)
20
-
21
- list.next_proc = next_proc(:watchers, options)
22
- inject_api_config(list)
35
+ get_path(
36
+ path_to_watchers,
37
+ options,
38
+ Tinybucket::Parser::ProfilesParser
39
+ )
23
40
  end
24
41
 
42
+ # Send 'GET a list of forks' request
43
+ #
44
+ # @param options [Hash]
45
+ # @return [Tinybucket::Model::Page]
25
46
  def forks(options = {})
26
- list = get_path(path_to_forks,
27
- options,
28
- Tinybucket::Parser::ReposParser)
29
-
30
- list.next_proc = next_proc(:forks, options)
31
- inject_api_config(list)
47
+ get_path(
48
+ path_to_forks,
49
+ options,
50
+ Tinybucket::Parser::ReposParser
51
+ )
32
52
  end
33
53
  end
34
54
  end
@@ -1,18 +1,25 @@
1
1
  module Tinybucket
2
2
  module Api
3
+ # Repos Api client
3
4
  class ReposApi < BaseApi
4
5
  include Tinybucket::Api::Helper::ReposHelper
5
6
 
7
+ # Send 'GET a list of repositories for an account' request
8
+ #
9
+ # @see https://confluence.atlassian.com/bitbucket/repositories-endpoint-423626330.html#repositoriesEndpoint-GETalistofrepositoriesforanaccount
10
+ # GET a list of repositories for an account
11
+ #
12
+ # @param options [Hash]
13
+ # @return [Tinybucket::Model::Page]
6
14
  def list(options = {})
7
15
  opts = options.clone
8
16
  opts.delete(:owner)
9
17
 
10
- list = get_path(path_to_list(options),
11
- opts,
12
- Tinybucket::Parser::ReposParser)
13
-
14
- list.next_proc = next_proc(:list, options)
15
- inject_api_config(list)
18
+ get_path(
19
+ path_to_list(options),
20
+ opts,
21
+ Tinybucket::Parser::ReposParser
22
+ )
16
23
  end
17
24
  end
18
25
  end
@@ -1,50 +1,75 @@
1
1
  module Tinybucket
2
2
  module Api
3
+ # Team Api client
4
+ #
5
+ # @see https://confluence.atlassian.com/bitbucket/teams-endpoint-423626335.html
6
+ # teams Endpoint
3
7
  class TeamApi < BaseApi
4
8
  include Tinybucket::Api::Helper::TeamHelper
5
9
 
10
+ # Send 'GET the team profile' request
11
+ #
12
+ # @param name [String] The team's name
13
+ # @param options [Hash]
14
+ # @return [Tinybucket::Model::Team]
6
15
  def find(name, options = {})
7
- m = get_path(path_to_find(name),
8
- options,
9
- Tinybucket::Parser::TeamParser)
10
-
11
- inject_api_config(m)
16
+ get_path(
17
+ path_to_find(name),
18
+ options,
19
+ Tinybucket::Parser::TeamParser
20
+ )
12
21
  end
13
22
 
23
+ # Send 'GET the team members' request
24
+ #
25
+ # @param name [String] The team's name
26
+ # @param options [Hash]
27
+ # @return [Tinybucket::Model::Page]
14
28
  def members(name, options = {})
15
- list = get_path(path_to_members(name),
16
- options,
17
- Tinybucket::Parser::TeamsParser)
18
-
19
- list.next_proc = next_proc(:members, options)
20
- inject_api_config(list)
29
+ get_path(
30
+ path_to_members(name),
31
+ options,
32
+ Tinybucket::Parser::TeamsParser
33
+ )
21
34
  end
22
35
 
36
+ # Send 'GET the list of followers' request
37
+ #
38
+ # @param name [String] The team's name
39
+ # @param options [Hash]
40
+ # @return [Tinybucket::Model::Page]
23
41
  def followers(name, options = {})
24
- list = get_path(path_to_followers(name),
25
- options,
26
- Tinybucket::Parser::TeamsParser)
27
-
28
- list.next_proc = next_proc(:followers, options)
29
- inject_api_config(list)
42
+ get_path(
43
+ path_to_followers(name),
44
+ options,
45
+ Tinybucket::Parser::TeamsParser
46
+ )
30
47
  end
31
48
 
49
+ # Send 'GET a lisf of accounts the tema is following' request
50
+ #
51
+ # @param name [String] The team's name
52
+ # @param options [Hash]
53
+ # @return [Tinybucket::Model::Page]
32
54
  def following(name, options = {})
33
- list = get_path(path_to_following(name),
34
- options,
35
- Tinybucket::Parser::TeamsParser)
36
-
37
- list.next_proc = next_proc(:following, options)
38
- inject_api_config(list)
55
+ get_path(
56
+ path_to_following(name),
57
+ options,
58
+ Tinybucket::Parser::TeamsParser
59
+ )
39
60
  end
40
61
 
62
+ # Send 'GET the team's repositories' request
63
+ #
64
+ # @param name [String] The team's name
65
+ # @param options [Hash]
66
+ # @return [Tinybucket::Model::Page]
41
67
  def repos(name, options = {})
42
- list = get_path(path_to_repos(name),
43
- options,
44
- Tinybucket::Parser::ReposParser)
45
-
46
- list.next_proc = next_proc(:repos, options)
47
- inject_api_config(list)
68
+ get_path(
69
+ path_to_repos(name),
70
+ options,
71
+ Tinybucket::Parser::ReposParser
72
+ )
48
73
  end
49
74
  end
50
75
  end
@@ -1,43 +1,63 @@
1
1
  module Tinybucket
2
2
  module Api
3
+ # User Api client
4
+ #
5
+ # @see https://confluence.atlassian.com/bitbucket/users-endpoint-423626336.html
6
+ # users Endpoint
7
+ #
8
+ # @!attribute [rw] username
9
+ # @return [String]
3
10
  class UserApi < BaseApi
4
11
  include Tinybucket::Api::Helper::UserHelper
5
12
 
6
13
  attr_accessor :username
7
14
 
15
+ # Send 'GET the user profile' request
16
+ #
17
+ # @param options [Hash]
18
+ # @return [Tinybucket::Model::Profile]
8
19
  def profile(options = {})
9
- m = get_path(path_to_find,
10
- options,
11
- Tinybucket::Parser::ProfileParser)
12
-
13
- inject_api_config(m)
20
+ get_path(
21
+ path_to_find,
22
+ options,
23
+ Tinybucket::Parser::ProfileParser
24
+ )
14
25
  end
15
26
 
27
+ # Send 'GET the list of followers' request
28
+ #
29
+ # @param options [Hash]
30
+ # @return [Tinybucket::Model::Page]
16
31
  def followers(options = {})
17
- list = get_path(path_to_followers,
18
- options,
19
- Tinybucket::Parser::ProfilesParser)
20
-
21
- list.next_proc = next_proc(:followers, options)
22
- inject_api_config(list)
32
+ get_path(
33
+ path_to_followers,
34
+ options,
35
+ Tinybucket::Parser::ProfilesParser
36
+ )
23
37
  end
24
38
 
39
+ # Send 'GET a list of accounts the user is following' request
40
+ #
41
+ # @param options [Hash]
42
+ # @return [Tinybucket::Model::Page]
25
43
  def following(options = {})
26
- list = get_path(path_to_following,
27
- options,
28
- Tinybucket::Parser::ProfilesParser)
29
-
30
- list.next_proc = next_proc(:following, options)
31
- inject_api_config(list)
44
+ get_path(
45
+ path_to_following,
46
+ options,
47
+ Tinybucket::Parser::ProfilesParser
48
+ )
32
49
  end
33
50
 
51
+ # Send 'GET the user's repositories' request
52
+ #
53
+ # @param options [Hash]
54
+ # @return [Tinybucket::Model::Page]
34
55
  def repos(options = {})
35
- list = get_path(path_to_repos,
36
- options,
37
- Tinybucket::Parser::ReposParser)
38
-
39
- list.next_proc = next_proc(:repos, options)
40
- inject_api_config(list)
56
+ get_path(
57
+ path_to_repos,
58
+ options,
59
+ Tinybucket::Parser::ReposParser
60
+ )
41
61
  end
42
62
  end
43
63
  end