tinybucket 0.1.7 → 1.0.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 (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