tinybucket2 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 (108) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +86 -0
  3. data/Gemfile +32 -0
  4. data/LICENSE +21 -0
  5. data/README.md +387 -0
  6. data/Rakefile +47 -0
  7. data/lib/faraday_middleware/follow_oauth_redirects.rb +71 -0
  8. data/lib/tinybucket.rb +76 -0
  9. data/lib/tinybucket/api.rb +26 -0
  10. data/lib/tinybucket/api/base_api.rb +44 -0
  11. data/lib/tinybucket/api/branch_restrictions_api.rb +51 -0
  12. data/lib/tinybucket/api/branches_api.rb +48 -0
  13. data/lib/tinybucket/api/build_status_api.rb +69 -0
  14. data/lib/tinybucket/api/comments_api.rb +81 -0
  15. data/lib/tinybucket/api/commits_api.rb +97 -0
  16. data/lib/tinybucket/api/diff_api.rb +40 -0
  17. data/lib/tinybucket/api/helper.rb +27 -0
  18. data/lib/tinybucket/api/helper/api_helper.rb +39 -0
  19. data/lib/tinybucket/api/helper/branch_restrictions_helper.rb +29 -0
  20. data/lib/tinybucket/api/helper/branches_helper.rb +29 -0
  21. data/lib/tinybucket/api/helper/build_status_helper.rb +46 -0
  22. data/lib/tinybucket/api/helper/comments_helper.rb +51 -0
  23. data/lib/tinybucket/api/helper/commits_helper.rb +42 -0
  24. data/lib/tinybucket/api/helper/diff_helper.rb +31 -0
  25. data/lib/tinybucket/api/helper/issues_helper.rb +29 -0
  26. data/lib/tinybucket/api/helper/projects_helper.rb +28 -0
  27. data/lib/tinybucket/api/helper/pull_requests_helper.rb +58 -0
  28. data/lib/tinybucket/api/helper/repo_helper.rb +31 -0
  29. data/lib/tinybucket/api/helper/repos_helper.rb +23 -0
  30. data/lib/tinybucket/api/helper/team_helper.rb +45 -0
  31. data/lib/tinybucket/api/helper/user_helper.rb +33 -0
  32. data/lib/tinybucket/api/issues_api.rb +48 -0
  33. data/lib/tinybucket/api/projects_api.rb +26 -0
  34. data/lib/tinybucket/api/pull_requests_api.rb +117 -0
  35. data/lib/tinybucket/api/repo_api.rb +56 -0
  36. data/lib/tinybucket/api/repos_api.rb +28 -0
  37. data/lib/tinybucket/api/team_api.rb +91 -0
  38. data/lib/tinybucket/api/user_api.rb +66 -0
  39. data/lib/tinybucket/api_factory.rb +21 -0
  40. data/lib/tinybucket/client.rb +107 -0
  41. data/lib/tinybucket/config.rb +10 -0
  42. data/lib/tinybucket/connection.rb +84 -0
  43. data/lib/tinybucket/constants.rb +7 -0
  44. data/lib/tinybucket/enumerator.rb +47 -0
  45. data/lib/tinybucket/error.rb +12 -0
  46. data/lib/tinybucket/error/base_error.rb +14 -0
  47. data/lib/tinybucket/error/conflict.rb +8 -0
  48. data/lib/tinybucket/error/not_found.rb +8 -0
  49. data/lib/tinybucket/error/service_error.rb +26 -0
  50. data/lib/tinybucket/iterator.rb +79 -0
  51. data/lib/tinybucket/model.rb +25 -0
  52. data/lib/tinybucket/model/base.rb +45 -0
  53. data/lib/tinybucket/model/branch.rb +48 -0
  54. data/lib/tinybucket/model/branch_restriction.rb +46 -0
  55. data/lib/tinybucket/model/build_status.rb +57 -0
  56. data/lib/tinybucket/model/comment.rb +67 -0
  57. data/lib/tinybucket/model/commit.rb +114 -0
  58. data/lib/tinybucket/model/concerns.rb +19 -0
  59. data/lib/tinybucket/model/concerns/acceptable_attributes.rb +34 -0
  60. data/lib/tinybucket/model/concerns/api_callable.rb +21 -0
  61. data/lib/tinybucket/model/concerns/enumerable.rb +20 -0
  62. data/lib/tinybucket/model/concerns/reloadable.rb +41 -0
  63. data/lib/tinybucket/model/concerns/repository_keys.rb +45 -0
  64. data/lib/tinybucket/model/error_response.rb +24 -0
  65. data/lib/tinybucket/model/issue.rb +48 -0
  66. data/lib/tinybucket/model/page.rb +45 -0
  67. data/lib/tinybucket/model/profile.rb +70 -0
  68. data/lib/tinybucket/model/project.rb +44 -0
  69. data/lib/tinybucket/model/pull_request.rb +160 -0
  70. data/lib/tinybucket/model/repository.rb +219 -0
  71. data/lib/tinybucket/model/team.rb +96 -0
  72. data/lib/tinybucket/null_logger.rb +37 -0
  73. data/lib/tinybucket/parser.rb +15 -0
  74. data/lib/tinybucket/parser/collection_parser.rb +17 -0
  75. data/lib/tinybucket/parser/object_parser.rb +17 -0
  76. data/lib/tinybucket/request.rb +59 -0
  77. data/lib/tinybucket/resource.rb +75 -0
  78. data/lib/tinybucket/resource/base.rb +35 -0
  79. data/lib/tinybucket/resource/branch_restrictions.rb +47 -0
  80. data/lib/tinybucket/resource/branches.rb +35 -0
  81. data/lib/tinybucket/resource/commit/base.rb +14 -0
  82. data/lib/tinybucket/resource/commit/build_statuses.rb +50 -0
  83. data/lib/tinybucket/resource/commit/comments.rb +34 -0
  84. data/lib/tinybucket/resource/commits.rb +46 -0
  85. data/lib/tinybucket/resource/forks.rb +24 -0
  86. data/lib/tinybucket/resource/issues.rb +35 -0
  87. data/lib/tinybucket/resource/projects.rb +49 -0
  88. data/lib/tinybucket/resource/pull_request/base.rb +20 -0
  89. data/lib/tinybucket/resource/pull_request/comments.rb +32 -0
  90. data/lib/tinybucket/resource/pull_request/commits.rb +19 -0
  91. data/lib/tinybucket/resource/pull_requests.rb +50 -0
  92. data/lib/tinybucket/resource/repos.rb +40 -0
  93. data/lib/tinybucket/resource/team/base.rb +24 -0
  94. data/lib/tinybucket/resource/team/followers.rb +15 -0
  95. data/lib/tinybucket/resource/team/following.rb +15 -0
  96. data/lib/tinybucket/resource/team/members.rb +15 -0
  97. data/lib/tinybucket/resource/team/repos.rb +15 -0
  98. data/lib/tinybucket/resource/teams.rb +22 -0
  99. data/lib/tinybucket/resource/user/base.rb +26 -0
  100. data/lib/tinybucket/resource/user/followers.rb +15 -0
  101. data/lib/tinybucket/resource/user/following.rb +15 -0
  102. data/lib/tinybucket/resource/user/repos.rb +15 -0
  103. data/lib/tinybucket/resource/watchers.rb +24 -0
  104. data/lib/tinybucket/response.rb +9 -0
  105. data/lib/tinybucket/response/handler.rb +23 -0
  106. data/lib/tinybucket/version.rb +5 -0
  107. data/tinybucket.gemspec +30 -0
  108. metadata +248 -0
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tinybucket
4
+ module Model
5
+ # Commit Resource
6
+ #
7
+ # @see https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Busername%7D/%7Brepo_slug%7D/commit
8
+ # Commit Resource
9
+ # @see https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Busername%7D/%7Brepo_slug%7D/commits
10
+ # Commits Resource
11
+ #
12
+ # @!attribute [rw] hash
13
+ # @return [String]
14
+ # @!attribute [rw] links
15
+ # @return [Hash]
16
+ # @!attribute [rw] repository
17
+ # @return [Hash]
18
+ # @!attribute [rw] author
19
+ # @return [Hash]
20
+ # @!attribute [rw] parents
21
+ # @return [Array]
22
+ # @!attribute [rw] date
23
+ # @return [String]
24
+ # @!attribute [rw] message
25
+ # @return [String]
26
+ # @!attribute [rw] participants
27
+ # @return [Array]
28
+ # @!attribute [rw] uuid
29
+ # @return [NillClass]
30
+ # @!attribute [rw] type
31
+ # @return [String]
32
+ class Commit < Base
33
+ include Tinybucket::Model::Concerns::RepositoryKeys
34
+ include Tinybucket::Constants
35
+
36
+ acceptable_attributes \
37
+ :hash, :links, :repository, :author, :parents, :date,
38
+ :message, :participants, :uuid, :type
39
+
40
+ # Get comments which associate with this commit.
41
+ #
42
+ # @param options [Hash]
43
+ # @return [Tinybucket::Resource::Commit::Comments]
44
+ def comments(options = {})
45
+ comments_resource(options)
46
+ end
47
+
48
+ # Get the specific commit comment which associate with this commit.
49
+ #
50
+ # @param comment_id [String] comment id
51
+ # @param options [Hash]
52
+ # @return [Tinybucket::Model::Comment]
53
+ def comment(comment_id, options = {})
54
+ comments_resource.find(comment_id, options)
55
+ end
56
+
57
+ # Give approval on this commit.
58
+ #
59
+ # @param options [Hash]
60
+ # @return [true]
61
+ # @return [false]
62
+ def approve(options = {})
63
+ commit_api.approve(hash, options)
64
+ end
65
+
66
+ # Revoke approval on this commit.
67
+ #
68
+ # @param options [Hash]
69
+ # @return [true]
70
+ # @return [false]
71
+ def unapprove(options = {})
72
+ commit_api.unapprove(hash, options)
73
+ end
74
+
75
+ # Get build status resource
76
+ #
77
+ # @param options [Hash]
78
+ # @return [Tinybucket::Resource::Commit::BuildStatuses]
79
+ def build_statuses(options = {})
80
+ build_statuses_resource(options)
81
+ end
82
+
83
+ # Get the specific build status which associate with key.
84
+ #
85
+ # @param key [String]
86
+ # @param options [Hash]
87
+ # @return [Tinybucket::Model::BuildStatus]
88
+ # @return [nil] when build_status does not found.
89
+ def build_status(key, options = {})
90
+ build_statuses_resource.find(key, options)
91
+ rescue Tinybucket::Error::NotFound
92
+ nil
93
+ end
94
+
95
+ private
96
+
97
+ def comments_resource(options = {})
98
+ Tinybucket::Resource::Commit::Comments.new(self, options)
99
+ end
100
+
101
+ def build_statuses_resource(options = {})
102
+ Tinybucket::Resource::Commit::BuildStatuses.new(self, options)
103
+ end
104
+
105
+ def commit_api
106
+ create_api('Commits', repo_keys)
107
+ end
108
+
109
+ def load_model
110
+ commit_api.find(hash)
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tinybucket
4
+ module Model
5
+ module Concerns
6
+ extend ActiveSupport::Autoload
7
+
8
+ [
9
+ :AcceptableAttributes,
10
+ :ApiCallable,
11
+ :Enumerable,
12
+ :RepositoryKeys,
13
+ :Reloadable
14
+ ].each do |mod_name|
15
+ autoload mod_name
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tinybucket
4
+ module Model
5
+ module Concerns
6
+ module AcceptableAttributes
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ def self.acceptable_attributes(*attrs)
11
+ @_acceptable_attributes = attrs.map(&:intern)
12
+
13
+ attr_accessor(*attrs)
14
+ end
15
+
16
+ def self.acceptable_attribute?(key)
17
+ return false if @_acceptable_attributes.nil?
18
+ @_acceptable_attributes.include?(key.intern)
19
+ end
20
+
21
+ protected
22
+
23
+ def acceptable_attribute?(key)
24
+ self.class.acceptable_attribute?(key)
25
+ end
26
+
27
+ def acceptable_attributes
28
+ self.class.instance_variable_get(:@_acceptable_attributes) || []
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tinybucket
4
+ module Model
5
+ module Concerns
6
+ module ApiCallable
7
+ protected
8
+
9
+ def create_api(name, keys = {})
10
+ api = ApiFactory.create_instance(name)
11
+ return api if keys.empty?
12
+
13
+ api.tap do |m|
14
+ m.repo_owner = keys[:repo_owner]
15
+ m.repo_slug = keys[:repo_slug]
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tinybucket
4
+ module Model
5
+ module Concerns
6
+ module Enumerable
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ protected
11
+
12
+ def enumerator(api_client, method, *args, &block)
13
+ iter = Tinybucket::Iterator.new(api_client, method, *args)
14
+ Tinybucket::Enumerator.new(iter, block)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tinybucket
4
+ module Model
5
+ module Concerns
6
+ module Reloadable
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ def load
11
+ return true if @_loaded
12
+
13
+ self.attributes = load_model.attributes
14
+ @_loaded = true
15
+ rescue => e
16
+ @_loaded = false
17
+ Tinybucket.logger.error e
18
+ raise e
19
+ end
20
+
21
+ def loaded?
22
+ @_loaded
23
+ end
24
+
25
+ def reload
26
+ @_loaded = false
27
+ # rubocop:disable all
28
+ self.load
29
+ # rubocop:enable all
30
+ end
31
+
32
+ private
33
+
34
+ def load_model
35
+ raise NotImplementedError
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tinybucket
4
+ module Model
5
+ module Concerns
6
+ module RepositoryKeys
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ attr_accessor :repo_owner, :repo_slug
11
+
12
+ def repo_keys?
13
+ repo_owner.present? && repo_slug.present?
14
+ end
15
+
16
+ def repo_keys
17
+ { repo_owner: repo_owner, repo_slug: repo_slug }
18
+ end
19
+
20
+ def repo_keys=(keys)
21
+ self.repo_owner = keys[:repo_owner]
22
+ self.repo_slug = keys[:repo_slug]
23
+ end
24
+
25
+ private
26
+
27
+ def inject_repo_keys(result)
28
+ case result
29
+ when Tinybucket::Model::Page
30
+ result.items.map do |m|
31
+ next unless m.class.concern_included?(:RepositoryKeys)
32
+ m.repo_keys = repo_keys
33
+ end
34
+ when Tinybucket::Model::Base
35
+ result.repo_keys = repo_keys \
36
+ if result.class.concern_included?(:RepositoryKeys)
37
+ end
38
+
39
+ result
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tinybucket
4
+ module Model
5
+ # ErrorResponse
6
+ #
7
+ # @see https://developer.atlassian.com/bitbucket/api/2/reference/meta/uri-uuid#stand-error
8
+ # Standardized error responses
9
+ #
10
+ # @!attribute [rw] message
11
+ # @return [String]
12
+ # @!attribute [rw] fields
13
+ # @return [Hash]
14
+ # @!attribute [rw] detail
15
+ # @return [String]
16
+ # @!attribute [rw] id
17
+ # @return [String]
18
+ # @!attribute [rw] uuid
19
+ # @return [NillClass]
20
+ class ErrorResponse
21
+ acceptable_attributes :message, :fields, :detail, :id, :uuid
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tinybucket
4
+ module Model
5
+ # Branch
6
+ #
7
+ # @see https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Busername%7D/%7Brepo_slug%7D/refs/branches
8
+ # Branch Resource
9
+ #
10
+ # @!attribute [rw] links
11
+ # @return [Hash]
12
+ # @!attribute [rw] type
13
+ # @return [String]
14
+ # @!attribute [rw] name
15
+ # @return [String]
16
+ # @!attribute [rw] repository
17
+ # @return [Hash]
18
+ # @!attribute [rw] target
19
+ # @return [Hash]
20
+ class Issue < Base
21
+ include Tinybucket::Model::Concerns::RepositoryKeys
22
+
23
+ acceptable_attributes :links, :type, :name, :repository, :target
24
+
25
+ # Returns the commits available for the specific branch
26
+ #
27
+ # @param options [Hash]
28
+ # @return [Tinybucket::Resource::Commits]
29
+ def commits(options = {})
30
+ commits_resource.issue(name, options)
31
+ end
32
+
33
+ private
34
+
35
+ def commits_resource(options = {})
36
+ Tinybucket::Resource::Commits.new(self, options)
37
+ end
38
+
39
+ def issues_api
40
+ create_api('Issues', repo_keys)
41
+ end
42
+
43
+ def load_model
44
+ issues_api.find(name, {})
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tinybucket
4
+ module Model
5
+ # Page
6
+ #
7
+ # @see https://developer.atlassian.com/bitbucket/api/2/reference/meta/pagination
8
+ # Paging through object collections
9
+ #
10
+ # @!attribute [r] attrs
11
+ # This attribute is a Hash object which contains
12
+ # 'size', 'page', 'pagelen', 'next', 'previous' key/value pairs.
13
+ # @return [Hash]
14
+ # @!attribute [r] items
15
+ # This attribute is a array of model instance created with
16
+ # 'values' attribute in json.
17
+ class Page
18
+ attr_reader :attrs
19
+ attr_reader :items
20
+
21
+ # Initialize with json and Model class.
22
+ #
23
+ # @param json [Hash]
24
+ # @param item_klass [Class]
25
+ def initialize(json, item_klass)
26
+ @attrs = parse_attrs(json)
27
+ @items = parse_values(json, item_klass)
28
+ end
29
+
30
+ private
31
+
32
+ def parse_attrs(json)
33
+ %w(size page pagelen next previous).map do |attr|
34
+ { attr.to_sym => json[attr] }
35
+ end.reduce(&:merge)
36
+ end
37
+
38
+ def parse_values(json, item_klass)
39
+ return [] if json['values'].nil? || !json['values'].is_a?(Array)
40
+
41
+ json['values'].map { |hash| item_klass.new(hash) }
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tinybucket
4
+ module Model
5
+ # Profile
6
+ #
7
+ # @see https://developer.atlassian.com/bitbucket/api/2/reference/resource/users/%7Busername%7D
8
+ # users Endpoint
9
+ #
10
+ # @!attribute [rw] username
11
+ # @return [String]
12
+ # @!attribute [rw] kind
13
+ # @return [NillClass]
14
+ # @!attribute [rw] website
15
+ # @return [String]
16
+ # @!attribute [rw] display_name
17
+ # @return [String]
18
+ # @!attribute [rw] links
19
+ # @return [Hash]
20
+ # @!attribute [rw] created_on
21
+ # @return [String]
22
+ # @!attribute [rw] location
23
+ # @return [String]
24
+ # @!attribute [rw] type
25
+ # @return [String]
26
+ # @!attribute [rw] uuid
27
+ # @return [String]
28
+ class Profile < Base
29
+ acceptable_attributes \
30
+ :username, :kind, :website, :display_name,
31
+ :links, :created_on, :location, :type, :uuid
32
+
33
+ # Get this user's followers
34
+ #
35
+ # @param options [Hash]
36
+ # @return [Tinybucket::Resource::User::Followers]
37
+ def followers(options = {})
38
+ Tinybucket::Resource::User::Followers.new(username, options)
39
+ end
40
+
41
+ # Get users which this user is following
42
+ #
43
+ # @param options [Hash]
44
+ # @return [Tinybucket::Resource::User::Following]
45
+ def following(options = {})
46
+ Tinybucket::Resource::User::Following.new(username, options)
47
+ end
48
+
49
+ # Get this user's repositories
50
+ #
51
+ # @param options [Hash]
52
+ # @return [Tinybucket::Resource::User::Repos]
53
+ def repos(options = {})
54
+ Tinybucket::Resource::User::Repos.new(username, options)
55
+ end
56
+
57
+ private
58
+
59
+ def user_api
60
+ create_api('User').tap do |api|
61
+ api.username = username
62
+ end
63
+ end
64
+
65
+ def load_model
66
+ user_api.profile
67
+ end
68
+ end
69
+ end
70
+ end