tinybucket2 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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
data/Rakefile ADDED
@@ -0,0 +1,47 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
4
+ require "bundler/gem_tasks"
5
+
6
+ desc 'cleanup rcov, doc directories'
7
+ task :clean do
8
+ rm_rf 'coverage'
9
+ rm_rf 'doc'
10
+ rm_rf 'measurement'
11
+ end
12
+
13
+ # https://github.com/sferik/twitter/blob/master/Rakefile
14
+ require 'rspec/core/rake_task'
15
+ RSpec::Core::RakeTask.new(:spec)
16
+ task :test => :spec
17
+
18
+ if Dir.exist?('./features')
19
+ RSpec::Core::RakeTask.new(:features) do |t|
20
+ t.pattern = './features/**/*_spec.rb'
21
+ t.rspec_opts = '-I ./features'
22
+ end
23
+ end
24
+
25
+ begin
26
+ require 'rubocop/rake_task'
27
+ RuboCop::RakeTask.new
28
+ rescue LoadError
29
+ task :rubocop do
30
+ $stderr.puts 'Rubocop is disabled.'
31
+ end
32
+ end
33
+
34
+ require 'yard'
35
+ YARD::Rake::YardocTask.new
36
+
37
+ require 'yardstick/rake/measurement'
38
+ Yardstick::Rake::Measurement.new do |measurement|
39
+ measurement.output = 'measurement/report.txt'
40
+ end
41
+
42
+ require 'yardstick/rake/verify'
43
+ Yardstick::Rake::Verify.new do |verify|
44
+ verify.threshold = 59.6
45
+ end
46
+
47
+ task :default => [:spec, :rubocop]
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'faraday'
4
+ require 'faraday_middleware'
5
+
6
+ module FaradayMiddleware
7
+ class FollowOAuthRedirects < FollowRedirects
8
+ dependency 'simple_oauth'
9
+
10
+ AUTH_HEADER = OAuth::AUTH_HEADER
11
+ CONTENT_TYPE = OAuth::CONTENT_TYPE
12
+ TYPE_URLENCODED = OAuth::TYPE_URLENCODED
13
+
14
+ def update_env(env, request_body, response)
15
+ env = super(env, request_body, response)
16
+
17
+ # update Authentication Header
18
+ if oauth_signed_request?(env)
19
+ env[:request_headers][OAuth::AUTH_HEADER] = oauth_header(env).to_s
20
+ end
21
+
22
+ env
23
+ end
24
+
25
+ def oauth_header(env)
26
+ SimpleOAuth::Header.new env[:method],
27
+ env[:url].to_s,
28
+ signature_params(body_params(env)),
29
+ oauth_options(env)
30
+ end
31
+
32
+ def oauth_signed_request?(env)
33
+ env[:request].oauth
34
+ end
35
+
36
+ def oauth_options(env)
37
+ extra = env[:request][:oauth]
38
+ if extra.present? and extra.is_a? Hash and !extra.empty?
39
+ @options.merge extra
40
+ else
41
+ @options
42
+ end
43
+ end
44
+
45
+ def body_params(env)
46
+ if include_body_params?(env)
47
+ if env[:body].respond_to?(:to_str)
48
+ ::Faraday::Utils.parse_nested_query env[:body]
49
+ else
50
+ env[:body]
51
+ end
52
+ end || {}
53
+ end
54
+
55
+ def include_body_params?(env)
56
+ # see RFC 5849, section 3.4.1.3.1 for details
57
+ !(type = env[:request_headers][OAuth::CONTENT_TYPE]) ||
58
+ type == OAuth::TYPE_URLENCODED
59
+ end
60
+
61
+ def signature_params(params)
62
+ return params if params.empty?
63
+ params.reject { |_k, v| v.respond_to?(:content_type) }
64
+ end
65
+ end
66
+
67
+ if Faraday::Middleware.respond_to? :register_middleware
68
+ Faraday::Response.register_middleware \
69
+ follow_oauth_redirects: -> { FollowOAuthRedirects }
70
+ end
71
+ end
data/lib/tinybucket.rb ADDED
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'tinybucket/version'
4
+
5
+ require 'active_support/dependencies/autoload'
6
+
7
+ require 'active_support/core_ext/hash'
8
+ require 'active_support/configurable'
9
+ require 'active_support/inflector'
10
+
11
+ require 'faraday'
12
+ require 'faraday_middleware'
13
+ require 'faraday_middleware/response_middleware'
14
+ require 'faraday_middleware/follow_oauth_redirects'
15
+ require 'faraday-http-cache'
16
+
17
+ require 'active_model'
18
+
19
+ require 'logger'
20
+ require 'uri'
21
+
22
+ require 'tinybucket/enumerator'
23
+ require 'tinybucket/iterator'
24
+
25
+ require 'tinybucket/config'
26
+ require 'tinybucket/null_logger'
27
+ require 'tinybucket/api'
28
+ require 'tinybucket/api_factory'
29
+ require 'tinybucket/api/helper'
30
+ require 'tinybucket/connection'
31
+ require 'tinybucket/constants'
32
+ require 'tinybucket/error'
33
+ require 'tinybucket/model/concerns'
34
+ require 'tinybucket/model'
35
+ require 'tinybucket/parser'
36
+ require 'tinybucket/request'
37
+ require 'tinybucket/resource'
38
+ require 'tinybucket/response'
39
+
40
+ require 'tinybucket/client'
41
+
42
+ require 'active_support/notifications'
43
+ ActiveSupport::Notifications.subscribe('request.faraday') \
44
+ do |_name, start_time, end_time, _, env|
45
+ url = env[:url]
46
+ http_method = env[:method].to_s.upcase
47
+ duration = end_time - start_time
48
+ Tinybucket.logger.debug \
49
+ format(
50
+ '[%s] %s %s (%.3f s)',
51
+ url.host, http_method, url.request_uri, duration
52
+ )
53
+ end
54
+
55
+ module Tinybucket
56
+ class << self
57
+ include ActiveSupport::Configurable
58
+ attr_accessor :logger, :api_client
59
+
60
+ def new
61
+ @api_client = Tinybucket::Client.new
62
+ end
63
+
64
+ def configure
65
+ yield(config)
66
+ end
67
+
68
+ def config
69
+ @config ||= Tinybucket::Config.new
70
+ end
71
+
72
+ def logger
73
+ config.logger || Tinybucket::NullLogger.new
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tinybucket
4
+ module Api
5
+ extend ActiveSupport::Autoload
6
+
7
+ [
8
+ :BaseApi,
9
+ :BranchesApi,
10
+ :IssuesApi,
11
+ :BranchRestrictionsApi,
12
+ :BuildStatusApi,
13
+ :CommitsApi,
14
+ :CommentsApi,
15
+ :DiffApi,
16
+ :ProjectsApi,
17
+ :PullRequestsApi,
18
+ :ReposApi,
19
+ :RepoApi,
20
+ :TeamApi,
21
+ :UserApi
22
+ ].each do |klass_name|
23
+ autoload klass_name
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tinybucket
4
+ module Api
5
+ class Parser
6
+ attr_reader :type, :options
7
+
8
+ def initialize(type, model_class)
9
+ parser_class =
10
+ case type
11
+ when :collection then Tinybucket::Parser::CollectionParser
12
+ when :object then Tinybucket::Parser::ObjectParser
13
+ else throw "Unknown parser type: #{type}"
14
+ end
15
+
16
+ @type = parser_class
17
+ @options = { model_class: model_class }
18
+ end
19
+ end
20
+
21
+ class BaseApi
22
+ include Tinybucket::Connection
23
+ include Tinybucket::Request
24
+
25
+ protected
26
+
27
+ #
28
+ # Get parser
29
+ #
30
+ # @param type [Symbol] :collection or :object
31
+ # @param model_class [Tinybucket::Model::Base] SubClass of Tinybucket::Model::Base
32
+ # @return [Hash]
33
+ def get_parser(type, model_class)
34
+ Tinybucket::Api::Parser.new(type, model_class)
35
+ end
36
+
37
+ private
38
+
39
+ def logger
40
+ Tinybucket.logger
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tinybucket
4
+ module Api
5
+ # BranchRestrictions API client
6
+ #
7
+ # @see https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Busername%7D/%7Brepo_slug%7D/branch-restrictions
8
+ # branch-restrictions Resource
9
+ #
10
+ # @!attribute [rw] repo_owner
11
+ # @return [String] repository owner name.
12
+ # @!attribute [rw] repo_slug
13
+ # @return [String] {https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Busername%7D/%7Brepo_slug%7D repository slug}.
14
+ class BranchRestrictionsApi < BaseApi
15
+ include Tinybucket::Api::Helper::BranchRestrictionsHelper
16
+
17
+ attr_accessor :repo_owner, :repo_slug
18
+
19
+ # Send 'GET the branch-restrictions' request.
20
+ #
21
+ # @see https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Busername%7D/%7Brepo_slug%7D/branch-restrictions#get
22
+ # GET the branch-restrictions
23
+ #
24
+ # @param options [Hash]
25
+ # @return [Tinybucket::Model::Page]
26
+ def list(options = {})
27
+ get_path(
28
+ path_to_list,
29
+ options,
30
+ get_parser(:collection, Tinybucket::Model::BranchRestriction)
31
+ )
32
+ end
33
+
34
+ # Send 'GET a specific restriction' request.
35
+ #
36
+ # @see https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Busername%7D/%7Brepo_slug%7D/branch-restrictions/%7Bid%7D#get
37
+ # GET a specific restriction
38
+ #
39
+ # @param restriction_id [String] The restriction's identifier
40
+ # @param options [Hash]
41
+ # @return [Tinybucket::Model::BranchRestriction]
42
+ def find(restriction_id, options = {})
43
+ get_path(
44
+ path_to_find(restriction_id),
45
+ options,
46
+ get_parser(:object, Tinybucket::Model::BranchRestriction)
47
+ )
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tinybucket
4
+ module Api
5
+ # Branches Api client
6
+ #
7
+ # @!attribute [rw] repo_owner
8
+ # @return [String] repository owner name.
9
+ # @!attribute [rw] repo_slug
10
+ # @return [String] {https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Busername%7D/%7Brepo_slug%7D repo_slug}.
11
+ class BranchesApi < BaseApi
12
+ include Tinybucket::Api::Helper::BranchesHelper
13
+
14
+ attr_accessor :repo_owner, :repo_slug
15
+
16
+ # Send 'GET a branches list for a repository' request
17
+ #
18
+ # @see https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Busername%7D/%7Brepo_slug%7D/refs/branches#get
19
+ # GET a branches list for a repository
20
+ #
21
+ # @param options [Hash]
22
+ # @return [Tinybucket::Model::Page]
23
+ def list(options = {})
24
+ get_path(
25
+ path_to_list,
26
+ options,
27
+ get_parser(:collection, Tinybucket::Model::Branch)
28
+ )
29
+ end
30
+
31
+ # Send 'GET an individual branch' request
32
+ #
33
+ # @see https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Busername%7D/%7Brepo_slug%7D/refs/branches/%7Bname%7D#get
34
+ # GET an individual branch
35
+ #
36
+ # @param name [String] The branch name
37
+ # @param options [Hash]
38
+ # @return [Tinybucket::Model::Branch]
39
+ def find(name, options = {})
40
+ get_path(
41
+ path_to_find(name),
42
+ options,
43
+ get_parser(:object, Tinybucket::Model::Branch)
44
+ )
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tinybucket
4
+ module Api
5
+ # BuildStatus Api client
6
+ #
7
+ # @see https://confluence.atlassian.com/bitbucket/statuses-build-resource-779295267.html
8
+ # statuses/build Resource - Bitbucket Cloud REST API
9
+ class BuildStatusApi < BaseApi
10
+ include Tinybucket::Api::Helper::BuildStatusHelper
11
+
12
+ attr_accessor :revision, :repo_owner, :repo_slug
13
+
14
+ # Send 'GET a builds list for a commit' request
15
+ #
16
+ # @param options [Hash]
17
+ # @return [Tinybucket::Model::Page]
18
+ def list(options = {})
19
+ get_path(
20
+ path_to_list,
21
+ options,
22
+ get_parser(:collection, Tinybucket::Model::BuildStatus)
23
+ )
24
+ end
25
+
26
+ # Send 'GET the build status for a commit' request
27
+ #
28
+ # @param revision [String]
29
+ # @param key [String]
30
+ # @param options [Hash]
31
+ # @return [Tinybucket::Model::BuildStatus]
32
+ def find(revision, key, options = {})
33
+ get_path(
34
+ path_to_find(revision, key),
35
+ options,
36
+ get_parser(:object, Tinybucket::Model::BuildStatus)
37
+ )
38
+ end
39
+
40
+ # Send 'POST a build status for a commit' request
41
+ #
42
+ # @param revision [String]
43
+ # @param key [String]
44
+ # @param options [Hash]
45
+ # @return [Tinybucket::Model::BuildStatus]
46
+ def post(revision, key, options)
47
+ post_path(
48
+ path_to_post(revision),
49
+ options.merge(key: key),
50
+ get_parser(:object, Tinybucket::Model::BuildStatus)
51
+ )
52
+ end
53
+
54
+ # Send 'PUT a build status for a commit' request
55
+ #
56
+ # @param revision [String]
57
+ # @param key [String]
58
+ # @param options [Hash]
59
+ # @return [Tinybucket::Model::BuildStatus]
60
+ def put(revision, key, options)
61
+ put_path(
62
+ path_to_put(revision, key),
63
+ options,
64
+ get_parser(:object, Tinybucket::Model::BuildStatus)
65
+ )
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tinybucket
4
+ module Api
5
+ # Comments Api client
6
+ #
7
+ # @!attribute [rw] repo_owner
8
+ # @return [String] repository owner name.
9
+ # @!attribute [rw] repo_slug
10
+ # @return [String] {https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Busername%7D/%7Brepo_slug%7D repository slug}.
11
+ # @!attribute [rw] commented_to
12
+ # @return [Tinybucket::Model::Commit, Tinybucket::Model::PullRequest]
13
+ class CommentsApi < BaseApi
14
+ include Tinybucket::Api::Helper::CommentsHelper
15
+
16
+ attr_accessor :repo_owner, :repo_slug
17
+
18
+ attr_accessor :commented_to
19
+
20
+ # Send 'GET a list of comments' request.
21
+ #
22
+ # This method send different request depend on 'commented_to' attribute.
23
+ #
24
+ # @note When 'commented_to' is {Tinybucket::Model::Commit} instance,
25
+ # this method send {https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Busername%7D/%7Brepo_slug%7D/commit/%7Bsha%7D/comments#get
26
+ # GET a list of commit comments}.
27
+ # @note When 'commented_to' is {Tinybucket::Model::PullRequest} instance,
28
+ # this method send {https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Busername%7D/%7Brepo_slug%7D/commit/%7Bsha%7D/comments#get
29
+ # GET a list of pull request comments}.
30
+ #
31
+ # @param options [Hash]
32
+ # @return [Tinybucket::Model::Page]
33
+ def list(options = {})
34
+ list = get_path(path_to_list,
35
+ options,
36
+ get_parser(:collection, Tinybucket::Model::Comment))
37
+
38
+ associate_with_target(list)
39
+ list
40
+ end
41
+
42
+ # Send 'GET a individual comment' request.
43
+ #
44
+ # This method send different request depend on 'commented_to' attribute.
45
+ #
46
+ # @note When 'commented_to' is {Tinybucket::Model::Commit} instance,
47
+ # this method send {https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Busername%7D/%7Brepo_slug%7D/commit/%7Bsha%7D/comments/%7Bcomment_id%7D#get
48
+ # GET an individual commit comment}.
49
+ # @note When 'commented_to' is {Tinybucket::Model::PullRequest} instance,
50
+ # this method send {https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Busername%7D/%7Brepo_slug%7D/commit/%7Bsha%7D/comments/%7Bcomment_id%7D#get
51
+ # GET an individual pull request comment}.
52
+ #
53
+ # @param comment_id [String] comment identifier
54
+ # @param options [Hash]
55
+ # @return [Tinybucket::Model::Comment]
56
+ def find(comment_id, options = {})
57
+ comment = get_path(path_to_find(comment_id),
58
+ options,
59
+ get_parser(:object, Tinybucket::Model::Comment))
60
+
61
+ associate_with_target(comment)
62
+ comment
63
+ end
64
+
65
+ private
66
+
67
+ def associate_with_target(result)
68
+ case result
69
+ when Tinybucket::Model::Comment
70
+ result.commented_to = commented_to
71
+ when Tinybucket::Model::Page
72
+ result.items.map { |m| m.commented_to = commented_to }
73
+ else
74
+ raise ArgumentError, "Invalid result: #{result.inspect}"
75
+ end
76
+
77
+ result
78
+ end
79
+ end
80
+ end
81
+ end