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
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